public override BlockCodegen Emit(BasicBlockBuilder BasicBlock) { var elements = new LLVMValueRef[structType.InstanceFields.Count]; for (int i = 0; i < elements.Length; i++) { var elemBlock = (CodeBlock)codeGen.EmitDefaultValue(structType.InstanceFields[i].FieldType); var elemResult = elemBlock.Emit(BasicBlock); BasicBlock = elemResult.BasicBlock; elements[i] = elemResult.Value; } return(new BlockCodegen(BasicBlock, ConstStruct(elements, false))); }
/// <summary> /// Declares the given field if it is static and has not been declared /// already. An LLVM value that corresponds to the declaration is returned. /// </summary> /// <param name="Field">The field to declare.</param> /// <returns>An LLVM global.</returns> public LLVMValueRef DeclareGlobal(IField Field) { if (!Field.IsStatic) { throw new InvalidOperationException( "Instance field '" + Field.Name + "' cannot be declared as a global."); } LLVMValueRef result; if (!declaredGlobals.TryGetValue(Field, out result)) { // Declare the global. var abiMangler = LLVMSymbolTypeMember.GetLLVMAbi(Field, assembly).Mangler; result = DeclareGlobal(Declare(Field.FieldType), abiMangler.Mangle(Field, true)); if (Field is LLVMField) { var llvmField = (LLVMField)Field; // Set the field's linkage. result.SetLinkage(llvmField.Linkage); if (!llvmField.IsImport) { // Zero-initialize it. var codeGenerator = new Codegen.LLVMCodeGenerator(null); var defaultValueBlock = (Codegen.CodeBlock)codeGenerator.EmitDefaultValue(Field.FieldType); var defaultValueRef = defaultValueBlock.Emit( new Codegen.BasicBlockBuilder( new Codegen.FunctionBodyBuilder(this, default(LLVMValueRef)), default(LLVMBasicBlockRef))); LLVMSharp.LLVM.SetInitializer(result, defaultValueRef.Value); } } // Store it in the dictionary. declaredGlobals[Field] = result; } return(result); }