diff options
| author | Timon Kruiper <timonkruiper@gmail.com> | 2021-01-10 17:36:01 +0100 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-01-10 17:47:34 -0800 |
| commit | e1d8073d2fc0df6fbc5ce983312e3da374a9889b (patch) | |
| tree | 11d8c5aa24c3c09dfec529c2d9f150511623c7b9 /src/codegen/llvm.zig | |
| parent | 2117489e05ddf7cc4653feecbf47b3637276d6b6 (diff) | |
| download | zig-e1d8073d2fc0df6fbc5ce983312e3da374a9889b.tar.gz zig-e1d8073d2fc0df6fbc5ce983312e3da374a9889b.zip | |
stage2: add support for loops in LLVM backend
A simple `while(true) {}` loop generates the following LLVMIR:
```
define i32 @main() {
Entry:
br label %Loop
Loop: ; preds = %Loop, %Entry
br label %Loop
}
```
Also implement TZIR printing for loops and add a corresponding test.
Diffstat (limited to 'src/codegen/llvm.zig')
| -rw-r--r-- | src/codegen/llvm.zig | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index d6515f9ec6..5d753c41cb 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -396,6 +396,7 @@ pub const LLVMIRModule = struct { .condbr => try self.genCondBr(inst.castTag(.condbr).?), .intcast => try self.genIntCast(inst.castTag(.intcast).?), .load => try self.genLoad(inst.castTag(.load).?), + .loop => try self.genLoop(inst.castTag(.loop).?), .not => try self.genNot(inst.castTag(.not).?), .ret => try self.genRet(inst.castTag(.ret).?), .retvoid => self.genRetVoid(inst.castTag(.retvoid).?), @@ -559,6 +560,17 @@ pub const LLVMIRModule = struct { return null; } + fn genLoop(self: *LLVMIRModule, inst: *Inst.Loop) !?*const llvm.Value { + const loop_block = self.context.appendBasicBlock(self.llvm_func, "Loop"); + _ = self.builder.buildBr(loop_block); + + self.builder.positionBuilderAtEnd(loop_block); + try self.genBody(inst.body); + + _ = self.builder.buildBr(loop_block); + return null; + } + fn genNot(self: *LLVMIRModule, inst: *Inst.UnOp) !?*const llvm.Value { return self.builder.buildNot(try self.resolveInst(inst.operand), ""); } |
