From 692791f0bd4d952b291d7a6ba3eeb6c97379476f Mon Sep 17 00:00:00 2001 From: whitequark Date: Sat, 25 Jul 2015 07:01:25 +0300 Subject: [PATCH] Make sure a landing pad returns {i8*} to soothe LLVM codegen. --- artiq/compiler/transforms/llvm_ir_generator.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/artiq/compiler/transforms/llvm_ir_generator.py b/artiq/compiler/transforms/llvm_ir_generator.py index 79f214097..a88058b96 100644 --- a/artiq/compiler/transforms/llvm_ir_generator.py +++ b/artiq/compiler/transforms/llvm_ir_generator.py @@ -588,9 +588,11 @@ class LLVMIRGenerator: return llinsn def process_LandingPad(self, insn): - lllandingpad = self.llbuilder.landingpad(self.llty_of_type(insn.type), + lllandingpad = self.llbuilder.landingpad(ll.LiteralStructType([ll.IntType(8).as_pointer()]), self.llbuiltin("__artiq_personality")) - llexnnameptr = self.llbuilder.gep(lllandingpad, [self.llindex(0), self.llindex(0)]) + llrawexn = self.llbuilder.extract_value(lllandingpad, 0) + llexn = self.llbuilder.bitcast(llrawexn, self.llty_of_type(insn.type)) + llexnnameptr = self.llbuilder.gep(llexn, [self.llindex(0), self.llindex(0)]) llexnname = self.llbuilder.load(llexnnameptr) for target, typ in insn.clauses(): @@ -602,11 +604,15 @@ class LLVMIRGenerator: ir.Constant(typ.name, ir.TExceptionTypeInfo())) lllandingpad.add_clause(ll.CatchClause(llclauseexnname)) - llmatchingclause = self.llbuilder.icmp_unsigned('==', llexnname, llclauseexnname) - with self.llbuilder.if_then(llmatchingclause): + if typ is None: self.llbuilder.branch(self.map(target)) + else: + llmatchingclause = self.llbuilder.icmp_unsigned('==', llexnname, llclauseexnname) + with self.llbuilder.if_then(llmatchingclause): + self.llbuilder.branch(self.map(target)) - self.llbuilder.resume(lllandingpad) + if self.llbuilder.basic_block.terminator is None: + self.llbuilder.resume(lllandingpad) - return lllandingpad + return llexn