Fix __builtin_setjmp in combination with sjlj exception handling.
authorMatthias Braun <matze@braunis.de>
Thu, 16 Jul 2015 22:34:16 +0000 (22:34 +0000)
committerMatthias Braun <matze@braunis.de>
Thu, 16 Jul 2015 22:34:16 +0000 (22:34 +0000)
commit3cd00c17396dd786d533ba71dafdcab9a7694804
tree98555ff515628864ac05b51daa9448347407f2a4
parent7e5de9c96beb1bb47a34d974c7939bf37c2c5605
Fix __builtin_setjmp in combination with sjlj exception handling.

llvm.eh.sjlj.setjmp was used as part of the SjLj exception handling
style but is also used in clang to implement __builtin_setjmp.  The ARM
backend needs to output additional dispatch tables for the SjLj
exception handling style, these tables however can't be emitted if
llvm.eh.sjlj.setjmp is simply used for __builtin_setjmp and no actual
landing pad blocks exist.

To solve this issue a new llvm.eh.sjlj.setup_dispatch intrinsic is
introduced which is used instead of llvm.eh.sjlj.setjmp in the SjLj
exception handling lowering, so we can differentiate between the case
where we actually need to setup a dispatch table and the case where we
just need the __builtin_setjmp semantic.

Differential Revision: http://reviews.llvm.org/D9313

llvm-svn: 242481
llvm/include/llvm/CodeGen/ISDOpcodes.h
llvm/include/llvm/IR/Intrinsics.td
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
llvm/lib/CodeGen/SjLjEHPrepare.cpp
llvm/lib/Target/ARM/ARMISelLowering.cpp
llvm/lib/Target/ARM/ARMISelLowering.h
llvm/lib/Target/ARM/ARMInstrInfo.td
llvm/test/CodeGen/ARM/setjmp_longjmp.ll [new file with mode: 0644]