diff --git a/llvm/include/llvm/CodeGen/MachineModuleInfo.h b/llvm/include/llvm/CodeGen/MachineModuleInfo.h index e7574bffe3be..70a771ee368f 100644 --- a/llvm/include/llvm/CodeGen/MachineModuleInfo.h +++ b/llvm/include/llvm/CodeGen/MachineModuleInfo.h @@ -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 Sites); diff --git a/llvm/lib/Target/X86/X86WinEHState.cpp b/llvm/lib/Target/X86/X86WinEHState.cpp index 38dc5db3430b..d1206ec0ee08 100644 --- a/llvm/lib/Target/X86/X86WinEHState.cpp +++ b/llvm/lib/Target/X86/X86WinEHState.cpp @@ -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? diff --git a/llvm/test/CodeGen/WinEH/wineh-statenumbering.ll b/llvm/test/CodeGen/WinEH/wineh-statenumbering.ll index fcbb8bd2fc3d..b54843635ab8 100644 --- a/llvm/test/CodeGen/WinEH/wineh-statenumbering.ll +++ b/llvm/test/CodeGen/WinEH/wineh-statenumbering.ll @@ -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*)