Beispiel #1
0
        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)));
        }
Beispiel #2
0
        /// <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);
        }