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); }
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); } }
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); }
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); }