Пример #1
0
        protected override ExprAST VisitFunctionAST(FunctionAST node)
        {
            this.namedValues.Clear();

            this.Visit(node.Proto);

            LLVMValueRef function = this.valueStack.Pop();

            // Create a new basic block to start insertion into.
            LLVM.PositionBuilderAtEnd(this.builder, LLVM.AppendBasicBlock(function, "entry"));

            try
            {
                this.Visit(node.Body);
            }
            catch (Exception)
            {
                LLVM.DeleteFunction(function);
                throw;
            }

            // Finish off the function.
            LLVM.BuildRet(this.builder, this.valueStack.Pop());

            // Validate the generated code, checking for consistency.
            LLVM.VerifyFunction(function, LLVMVerifierFailureAction.LLVMPrintMessageAction);

            this.valueStack.Push(function);

            return(node);
        }
Пример #2
0
        protected internal virtual ExprAST VisitFunctionAST(FunctionAST node)
        {
            this.Visit(node.Proto);
            this.Visit(node.Body);

            return(node);
        }
Пример #3
0
        protected internal virtual ExprAST VisitFunctionAST(FunctionAST node)
        {
            this.Visit(node.Proto);
            this.Visit(node.Body);

            return node;
        }
Пример #4
0
        public FunctionAST GenerateFunctionAST()
        {
            localVariables.Clear();
            var modifier  = modifierGenerator.GenerateModifier();
            var prototype = GenerateFunctionPrototype(modifier);

            var functionAst = new FunctionAST();

            functionAst.Prototype = prototype;

            // 中身をパース
            var expressions = new List <ExpressionAST>();

            while (parser.LastToken.TokenType != TokenType.BlockEnd)
            {
                expressions.Add(expressionGenerator.GenerateExpressionAST());
            }
            functionAst.Expressions = expressions;

            parser.ProceedToken(); // end を消費

            functionAst.Variables = localVariables;

            return(functionAst);
        }
Пример #5
0
        public void ExitHandleDefinition(FunctionAST data)
        {
            this.visitor.Visit(data);
            var function = this.visitor.ResultStack.Pop();

            LLVM.DumpValue(function);

            LLVM.RunFunctionPassManager(this.passManager, function);
            LLVM.DumpValue(function); // Dump the function for exposition purposes.
        }
Пример #6
0
        public void ExitHandleTopLevelExpression(FunctionAST data)
        {
            this.visitor.Visit(data);
            var anonymousFunction = this.visitor.ResultStack.Pop();

            LLVM.DumpValue(anonymousFunction); // Dump the function for exposition purposes.
            var dFunc = (Program.D)Marshal.GetDelegateForFunctionPointer(LLVM.GetPointerToGlobal(this.ee, anonymousFunction), typeof(Program.D));

            LLVM.RunFunctionPassManager(this.passManager, anonymousFunction);

            LLVM.DumpValue(anonymousFunction); // Dump the function for exposition purposes.
            Console.WriteLine("Evaluated to " + dFunc());
        }
Пример #7
0
        public ExprAST ParseTopLevelExpr()
        {
            var e = ParseExpression();

            if (e == null)
            {
                return(LogError("Expression failed"));
            }

            var func = new FunctionAST(new PrototypeAST(Type.Void, "", new List <ArgTypePair>()), e);

            Visit(func);
            return(func);
        }
Пример #8
0
        public FunctionAST FunctionASTVisit(FunctionAST node)
        {
            this.namedValues.Clear();
            this.Visit(node.Proto);
            LLVMValueRef function = valueStack.Pop();

            this.ReturnType = node.Proto.ReturnType;
            try
            {
                Visit(node.Body);
            }
            catch (Exception)
            {
                LLVM.DeleteFunction(function);
                throw new Exception("Block Parsing Failed");
            }
            LLVM.VerifyFunction(function, LLVMVerifierFailureAction.LLVMPrintMessageAction);
            LLVM.RunFunctionPassManager(FPM, function);
            this.valueStack.Push(function);

            return(node);
        }
Пример #9
0
 public void ExitHandleTopLevelExpression(FunctionAST data)
 {
     this.visitor.Visit(data);
     LLVM.DumpValue(this.visitor.ResultStack.Pop());
 }
Пример #10
0
 public void EnterHandleTopLevelExpression(FunctionAST data)
 {
 }
Пример #11
0
 public void ExitHandleDefinition(FunctionAST data)
 {
     this.visitor.Visit(data);
     LLVM.DumpValue(this.visitor.ResultStack.Pop());
 }
Пример #12
0
 public void EnterHandleDefinition(FunctionAST data)
 {
 }