diff options
| author | gingerBill <bill@gingerbill.org> | 2020-06-10 13:57:25 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-06-10 13:57:25 +0100 |
| commit | d0920804c35f859d2d7edc80aa53174e478f8291 (patch) | |
| tree | c68fc0b5c17426fadb57d7e556c01c943cea8ee3 /src/llvm_backend.cpp | |
| parent | 97d3d4ff6fae6bfdee518e765b56c2163b432066 (diff) | |
Stop statement generation after terminating instruction in current block (LLVM C API)
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 45d1ccf52..acd2d550b 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3878,7 +3878,32 @@ lbValue lb_emit_logical_binary_expr(lbProcedure *p, TokenKind op, Ast *left, Ast } +bool lb_is_instr_terminating(LLVMValueRef instr) { + + if (instr != nullptr) { + LLVMOpcode op = LLVMGetInstructionOpcode(instr); + switch (op) { + case LLVMRet: + case LLVMBr: + case LLVMSwitch: + case LLVMIndirectBr: + case LLVMInvoke: + case LLVMUnreachable: + case LLVMCallBr: + return true; + } + } + return false; +} + void lb_build_stmt(lbProcedure *p, Ast *node) { + if (p->curr_block != nullptr) { + LLVMValueRef last_instr = LLVMGetLastInstruction(p->curr_block->block); + if (lb_is_instr_terminating(last_instr)) { + return; + } + } + u64 prev_state_flags = p->module->state_flags; defer (p->module->state_flags = prev_state_flags); |