Index: llvm/trunk/lib/Target/ARM/ARMSubtarget.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/ARMSubtarget.cpp +++ llvm/trunk/lib/Target/ARM/ARMSubtarget.cpp @@ -150,7 +150,9 @@ // MCAsmInfo isn't always present (e.g. in opt) so we can't initialize this // directly from it, but we can try to make sure they're consistent when both // available. - UseSjLjEH = isTargetDarwin() && !isTargetWatchABI(); + UseSjLjEH = (isTargetDarwin() && !isTargetWatchABI() && + Options.ExceptionModel == ExceptionHandling::None) || + Options.ExceptionModel == ExceptionHandling::SjLj; assert((!TM.getMCAsmInfo() || (TM.getMCAsmInfo()->getExceptionHandlingType() == ExceptionHandling::SjLj) == UseSjLjEH) && Index: llvm/trunk/test/CodeGen/ARM/sjljehprepare-lower-empty-struct.ll =================================================================== --- llvm/trunk/test/CodeGen/ARM/sjljehprepare-lower-empty-struct.ll +++ llvm/trunk/test/CodeGen/ARM/sjljehprepare-lower-empty-struct.ll @@ -4,6 +4,7 @@ ; RUN: llc -mtriple=armv7-apple-ios -O3 < %s | FileCheck %s ; RUN: llc -mtriple=armv7-apple-watchos -O3 < %s | FileCheck %s ; RUN: llc -mtriple=armv7k-apple-ios < %s | FileCheck %s --check-prefix=CHECK-WATCH +; RUN: llc -mtriple=armv7-linux -exception-model sjlj -O3 < %s | FileCheck %s --check-prefix=CHECK-LINUX ; SjLjEHPrepare shouldn't crash when lowering empty structs. ; @@ -17,6 +18,12 @@ ; CHECK: bl __Unwind_SjLj_Register ; CHECK-NEXT: {{[A-Z][a-zA-Z0-9]*}}: ; CHECK-NEXT: bl _bar +; CHECK: bl __Unwind_SjLj_Resume + +; CHECK-LINUX: bl _Unwind_SjLj_Register +; CHECK-LINUX-NEXT: .{{[A-Z][a-zA-Z0-9]*}}: +; CHECK-LINUX-NEXT: bl bar +; CHECK-LINUX: bl _Unwind_SjLj_Resume ; CHECK-WATCH-NOT: bl __Unwind_SjLj_Register