ARM: make sure backend is consistent about exception handling method.
authorTim Northover <tnorthover@apple.com>
Wed, 18 Nov 2015 21:10:39 +0000 (21:10 +0000)
committerTim Northover <tnorthover@apple.com>
Wed, 18 Nov 2015 21:10:39 +0000 (21:10 +0000)
It turns out we decide whether to use SjLj exceptions or some alternative in
two separate places in the backend, and they disagreed with each other. This
led to inconsistent code and is generally a terrible idea.

So make them consistent and add an assert that they *do* match (unfortunately
MCAsmInfo isn't available in opt, so it can't be used to initialise the CodeGen
version directly).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253502 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMSubtarget.cpp
lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp
test/CodeGen/ARM/eh-resume-darwin.ll
test/CodeGen/ARM/sjljehprepare-lower-empty-struct.ll
test/CodeGen/Thumb/thumb-shrink-wrapping.ll

index 52b188949fb28a3a0424252bf3c5f1a87428d89d..9e3cd36d49eff0ad451fc95af1b502230be61670 100644 (file)
@@ -26,6 +26,7 @@
 #include "llvm/IR/Attributes.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/GlobalValue.h"
+#include "llvm/MC/MCAsmInfo.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Target/TargetInstrInfo.h"
 #include "llvm/Target/TargetOptions.h"
@@ -151,8 +152,15 @@ void ARMSubtarget::initializeEnvironment() {
   UseNaClTrap = false;
   GenLongCalls = false;
   UnsafeFPMath = false;
-  UseSjLjEH = (isTargetDarwin() &&
-               TargetTriple.getSubArch() != Triple::ARMSubArch_v7k);
+
+  // 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() && !isTargetWatchOS();
+  assert((!TM.getMCAsmInfo() ||
+          (TM.getMCAsmInfo()->getExceptionHandlingType() ==
+           ExceptionHandling::SjLj) == UseSjLjEH) &&
+         "inconsistent sjlj choice between CodeGen and MC");
 }
 
 void ARMSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
index 2114fa964731068d8ea1f0a5cacf25628ea5d1bd..bda37f6616a8dd3d89bcdb39922984b29fe72be0 100644 (file)
@@ -33,8 +33,9 @@ ARMMCAsmInfoDarwin::ARMMCAsmInfoDarwin(const Triple &TheTriple) {
   SupportsDebugInformation = true;
 
   // Exceptions handling
-  ExceptionsType = TheTriple.isWatchOS() ? ExceptionHandling::DwarfCFI
-                                         : ExceptionHandling::SjLj;
+  ExceptionsType = TheTriple.isOSDarwin() && !TheTriple.isWatchOS()
+                       ? ExceptionHandling::SjLj
+                       : ExceptionHandling::DwarfCFI;
 
   UseIntegratedAssembler = true;
 }
index 6ac025c6f05b15fc798bb1369ff3c98294c5bcd1..d3a8481275f317d7511f498388c06957a7927b4f 100644 (file)
@@ -1,4 +1,5 @@
 ; RUN: llc < %s -mtriple=armv7-apple-ios -arm-atomic-cfg-tidy=0 | FileCheck %s -check-prefix=IOS
+; RUN: llc < %s -mtriple=armv7k-apple-ios -arm-atomic-cfg-tidy=0 | FileCheck %s -check-prefix=IOS
 ; RUN: llc < %s -mtriple=armv7k-apple-watchos -arm-atomic-cfg-tidy=0 | FileCheck %s -check-prefix=WATCHOS
 
 declare void @func()
index 5d015738623af23f3b53535d2f26ba12366478ad..b44b447b3dffb7a9fda78dd2d603976705ee73e2 100644 (file)
@@ -2,6 +2,7 @@
 ; RUN: llc -mtriple=armv7-apple-ios -O1 < %s | FileCheck %s
 ; RUN: llc -mtriple=armv7-apple-ios -O2 < %s | FileCheck %s
 ; RUN: llc -mtriple=armv7-apple-ios -O3 < %s | FileCheck %s
+; RUN: llc -mtriple=armv7k-apple-ios < %s | FileCheck %s
 
 ; SjLjEHPrepare shouldn't crash when lowering empty structs.
 ;
index 62f78258e7d2476eb4f2619665b54c68a2b42fec..09c2ae3b4f7201f30fc56cb1f6a00f4cb585591f 100644 (file)
@@ -22,7 +22,7 @@
 ;
 ; Prologue code.
 ; CHECK: push {r7, lr}
-; CHECK-NEXT: sub sp, #8
+; CHECK: sub sp, #8
 ;
 ; Compare the arguments and jump to exit.
 ; After the prologue is set.
@@ -418,7 +418,7 @@ if.end:                                           ; preds = %for.body, %if.else
 ;
 ; Prologue code.
 ; CHECK: push {[[TMP:r[0-9]+]], lr}
-; CHECK-NEXT: sub sp, #16
+; CHECK: sub sp, #16
 ;
 ; DISABLE: cmp r0, #0
 ; DISABLE-NEXT: beq [[ELSE_LABEL:LBB[0-9_]+]]