public override int VisitRawTypeMapStatment([NotNull] ClepsParser.RawTypeMapStatmentContext context) { string className = String.Join(".", CurrentNamespaceAndClass); ClepsType rawLLVMType = ClepsType.GetBasicType(context.typename()); //make sure this maps to an llvm type LLVMTypeRef?llvmType = ClepsLLVMTypeConvertorInst.GetPrimitiveLLVMTypeOrNull(rawLLVMType); if (llvmType == null) { string errorMessage = String.Format("Class {0} has a raw llvm type mapping to {1} which is not a valid llvm type", className, rawLLVMType.GetTypeName()); Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage)); return(-1); } if (ClassManager.ClassContainsRawLLVMTypeMapping(className)) { string errorMessage = String.Format("Class {0} already has a raw llvm type mapping to {1}. Cannot add another raw type mapping to {2}", className, ClassManager.LoadedClassesAndMembers[className].RawLLVMTypeMap.GetTypeName(), rawLLVMType.GetTypeName()); Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage)); return(-1); } if (ClassManager.RawLLVMTypeMappingExists(rawLLVMType)) { string errorMessage = String.Format("Raw llvm type {0} already has a mapping to {1}. Cannot add another raw type mapping to {2}", rawLLVMType.GetTypeName(), ClassManager.RawLLVMTypeMappingClasses[rawLLVMType].FullyQualifiedName, className); Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage)); return(-1); } ClassManager.AddRawLLVMTypeMapping(className, rawLLVMType); return(0); }
public override LLVMRegister VisitFunctionVariableDeclarationStatement([NotNull] ClepsParser.FunctionVariableDeclarationStatementContext context) { ClepsParser.VariableDeclarationStatementContext variableDeclarationStatement = context.variableDeclarationStatement(); string variableName = variableDeclarationStatement.variable().VariableName.Text; if (VariableManager.IsVariableDefined(variableName)) { string errorMessage = String.Format("Variable {0} is already defined", variableName); Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage)); return(null); } ClepsType clepsVariableType = ClepsType.GetBasicType(variableDeclarationStatement.typename()); LLVMTypeRef? primitiveTypeOrNull = ClepsLLVMTypeConvertorInst.GetPrimitiveLLVMTypeOrNull(clepsVariableType); LLVMValueRef variable; if (primitiveTypeOrNull != null) { variable = LLVM.BuildAlloca(Builder, primitiveTypeOrNull.Value, variableName + "Ptr"); } else if (clepsVariableType.IsPointerType) { LLVMTypeRef?pointerType = ClepsLLVMTypeConvertorInst.GetLLVMTypeOrNull(clepsVariableType); if (pointerType == null) { string errorMessage = String.Format("Could not find type {0}", clepsVariableType.GetTypeName()); Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage)); return(null); } variable = LLVM.BuildAlloca(Builder, pointerType.Value, variableName + "Ptr"); } else { LLVMValueRef?constructorReturn = CallConstructorAllocaForType(context, clepsVariableType, variableName); if (constructorReturn == null) { return(null); } variable = constructorReturn.Value; } VariableManager.AddLocalVariable(variableName, clepsVariableType, variable); LLVMRegister ret = new LLVMRegister(clepsVariableType, variable); return(ret); }