aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-06-10 13:57:25 +0100
committergingerBill <bill@gingerbill.org>2020-06-10 13:57:25 +0100
commitd0920804c35f859d2d7edc80aa53174e478f8291 (patch)
treec68fc0b5c17426fadb57d7e556c01c943cea8ee3 /src
parent97d3d4ff6fae6bfdee518e765b56c2163b432066 (diff)
Stop statement generation after terminating instruction in current block (LLVM C API)
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend.cpp25
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);