mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 12:26:52 +08:00
[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:
@@ -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);
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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*)
|
||||
|
||||
Reference in New Issue
Block a user