Beispiel #1
0
        public void Generate(AssemblyLoader assemblyLoader, CodeGenerator codeGenerator)
        {
            MethodBodyLoader bodyLoader = new MethodBodyLoader(assemblyLoader, codeGenerator);
            BlockRegion      baseRegion = bodyLoader.LoadBody(this, _body);

            LLVMTypeRef  type     = GetMethodType(codeGenerator);
            LLVMValueRef function = codeGenerator.GetFunction(MangledName, type);

            LLVM.SetLinkage(function, LLVMLinkage.LLVMExternalLinkage);

            FunctionGenerator functionGenerator = new FunctionGenerator(codeGenerator, this, function);

            functionGenerator.CreateBlock("entry", null);
            functionGenerator.Locals = new LLVMValueRef[_body.Variables.Count];
            foreach (VariableDefinition variable in _body.Variables)
            {
                string name = "local_" +
                              (string.IsNullOrEmpty(variable.Name) ? variable.Index.ToString() : variable.Name);
                LLVMTypeRef localType = assemblyLoader.ResolveType(variable.VariableType).GetStackType()
                                        .GetType(codeGenerator);
                functionGenerator.Locals[variable.Index] = LLVM.BuildAlloca(codeGenerator.Builder, localType, name);
            }

            foreach (Block block in bodyLoader.Blocks)
            {
                functionGenerator.CreateBlock(block, codeGenerator);
            }

            baseRegion.Generate(codeGenerator, functionGenerator);

            functionGenerator.SelectBlock("entry");
            functionGenerator.Branch(bodyLoader.GetFirstBlock(), null);
        }
Beispiel #2
0
        public override void Generate(CodeGenerator codeGenerator, FunctionGenerator fgen)
        {
            LLVMValueRef[] vals = new LLVMValueRef[Values.Length];
            if (Block.HasIncoming)
            {
                IType[] targetTypes = Block.IncomingTypes;
                for (int i = 0; i < Values.Length; i++)
                {
                    vals[Values.Length - 1 - i] = Values[i].GetRef(codeGenerator, targetTypes[i]);
                }
            }

            fgen.Branch(Block, vals);
        }