[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
This commit is contained in:
Reid Kleckner
2015-09-16 17:19:44 +00:00
parent 6f6f137e49
commit 84ebff4a5e
3 changed files with 25 additions and 6 deletions

View 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);

View 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?

View 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*)