diff options
| author | Reid Kleckner <rnk@google.com> | 2015-09-16 17:19:44 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2015-09-16 17:19:44 +0000 |
| commit | 84ebff4a5eb2b96c71c70890157ebb2f514f5fad (patch) | |
| tree | 51367f7df5c9fd1ac2f93c35a263a2f771bdb8ed /llvm | |
| parent | 6f6f137e497fb979da20519fc9dce437d8e75ab0 (diff) | |
| download | bcm5719-llvm-84ebff4a5eb2b96c71c70890157ebb2f514f5fad.tar.gz bcm5719-llvm-84ebff4a5eb2b96c71c70890157ebb2f514f5fad.zip | |
[WinEH] Skip state numbering when no EH pads are present
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.
llvm-svn: 247820
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/CodeGen/MachineModuleInfo.h | 9 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86WinEHState.cpp | 14 | ||||
| -rw-r--r-- | llvm/test/CodeGen/WinEH/wineh-statenumbering.ll | 8 |
3 files changed, 25 insertions, 6 deletions
diff --git a/llvm/include/llvm/CodeGen/MachineModuleInfo.h b/llvm/include/llvm/CodeGen/MachineModuleInfo.h index e7574bffe3b..70a771ee368 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<unsigned> Sites); diff --git a/llvm/lib/Target/X86/X86WinEHState.cpp b/llvm/lib/Target/X86/X86WinEHState.cpp index 38dc5db3430..d1206ec0ee0 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 fcbb8bd2fc3..b54843635ab 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*) |

