コード例 #1
0
        public override void jumpToNext(Statement nextLine)
        {
            nextBlock = nextLine.block;
            AllocaInstruction alloc = builder.CreateAlloca(Parser.i8p, "returnAddress");
            BlockAddress      addr  = BlockAddress.Get(Parser.function, nextBlock);

            builder.CreateStore(addr, alloc);
            Parser.variables.returnAddresses.Push(alloc);
            Parser.variables.returnBlocks.Add(nextLine.block);
        }
コード例 #2
0
        public override void jumpToNext(Statement nextLine)
        {
            AllocaInstruction alloc = Parser.variables.returnAddresses.Pop();
            Value             addr  = builder.CreateLoad(alloc, "block2Address");
            IndirectBrInst    ind   = builder.CreateIndirectBr(addr, 1);

            foreach (BasicBlock returnBlock in Parser.variables.returnBlocks)
            {
                ind.addDestination(returnBlock);
            }
        }
コード例 #3
0
        public override void processGoto()
        {
            BasicBlock        loopBlock  = Parser.variables.forLines[controlVariable.name].nextBlock;
            AllocaInstruction alloc      = Parser.variables.numbers[controlVariable.name];
            Value             controlVal = builder.CreateLoad(alloc, "controlVal");

            controlVal = builder.CreateFAdd(controlVal, increment, "tempIncrement");
            builder.CreateStore(controlVal, alloc);
            Value comparison = builder.CreateFCmp(Predicate.OrderedGreaterThan, controlVal, limit, "tempLimitTest");

            builder.CreateCondBranch(comparison, nextBlock, loopBlock);
        }
コード例 #4
0
        public override LLVM.BasicBlock code()
        {
            block   = bb();
            builder = new IRBuilder(block);

            if (!Parser.variables.limits.ContainsKey(controlVariable.name))
            {
                throw new CompileException("NEXT statement has no matching FOR statement");
            }

            AllocaInstruction limitAlloc = Parser.variables.limits[controlVariable.name];

            limit = builder.CreateLoad(limitAlloc, "limit_" + controlVariable.name);

            AllocaInstruction incrementAlloc = Parser.variables.increments[controlVariable.name];

            increment = builder.CreateLoad(incrementAlloc, "increment_" + controlVariable.name);

            // Can't do any actual stuff now because we don't know where the FOR statement is!

            return(block);
        }