[WinEH] Skip state numbering when no EH pads are present
authorReid Kleckner <rnk@google.com>
Wed, 16 Sep 2015 17:19:44 +0000 (17:19 +0000)
committerReid Kleckner <rnk@google.com>
Wed, 16 Sep 2015 17:19:44 +0000 (17:19 +0000)
Otherwise we'd try to emit the thunk that passes the LSDA to
__CxxFrameHandler3. We don't emit the LSDA if there were no landingpads,
so we'd end up with an assembler error when trying to write the COFF
object.

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

include/llvm/CodeGen/MachineModuleInfo.h
lib/Target/X86/X86WinEHState.cpp
test/CodeGen/WinEH/wineh-statenumbering.ll

index e7574bffe3bef79a353b00c06267a79a0d7409b0..70a771ee368f72a1641111b255a39e12d8cbc52d 100644 (file)
@@ -252,6 +252,9 @@ public:
   bool callsUnwindInit() const { return CallsUnwindInit; }
   void setCallsUnwindInit(bool b) { CallsUnwindInit = b; }
 
+  bool hasEHFunclets() const { return HasEHFunclets; }
+  void setHasEHFunclets(bool V) { HasEHFunclets = V; }
+
   bool usesVAFloatArgument() const {
     return UsesVAFloatArgument;
   }
@@ -365,12 +368,6 @@ public:
     return LandingPads;
   }
 
-  bool hasEHFunclets() const {
-    return HasEHFunclets;
-  }
-
-  void setHasEHFunclets(bool V) { HasEHFunclets = true; }
-
   /// setCallSiteLandingPad - Map the landing pad's EH symbol to the call
   /// site indexes.
   void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef<unsigned> Sites);
index 38dc5db3430b8fae41d6bf66f921b58bc7424793..d1206ec0ee08d5ed16a97c9e5f250164a276287b 100644 (file)
@@ -167,6 +167,20 @@ bool WinEHStatePass::runOnFunction(Function &F) {
   if (!isMSVCEHPersonality(Personality))
     return false;
 
+  // Skip this function if there are no EH pads and we aren't using IR-level
+  // outlining.
+  if (WinEHParentName.empty()) {
+    bool HasPads = false;
+    for (BasicBlock &BB : F) {
+      if (BB.isEHPad()) {
+        HasPads = true;
+        break;
+      }
+    }
+    if (!HasPads)
+      return false;
+  }
+
   // Disable frame pointer elimination in this function.
   // FIXME: Do the nested handlers need to keep the parent ebp in ebp, or can we
   // use an arbitrary register?
index fcbb8bd2fc3de7bd6a362242ee1f5e119217394f..b54843635ab8b4b22b91c44b1244fa34857ef96d 100644 (file)
@@ -82,6 +82,14 @@ unreachable.for.entry:                            ; preds = %entry
   unreachable
 }
 
+define i32 @nopads() #0 personality i32 (...)* @__CxxFrameHandler3 {
+  ret i32 0
+}
+
+; CHECK-LABEL: define i32 @nopads()
+; CHECK-NEXT: ret i32 0
+; CHECK-NOT: __ehhandler$nopads
+
 declare void @g(i32) #0
 
 declare x86_stdcallcc void @_CxxThrowException(i8*, %eh.ThrowInfo*)