Skip to content

Commit b4be38f

Browse files
committedMay 17, 2018
[WebAssembly] Add Wasm personality and isScopedEHPersonality()
Summary: - Add wasm personality function - Re-categorize the existing `isFuncletEHPersonality()` function into two different functions: `isFuncletEHPersonality()` and `isScopedEHPersonality(). This becomes necessary as wasm EH uses scoped EH instructions (catchswitch, catchpad/ret, and cleanuppad/ret) but not outlined funclets. - Changed some callsites of `isFuncletEHPersonality()` to `isScopedEHPersonality()` if they are related to scoped EH IR-level stuff. Reviewers: majnemer, dschuff, rnk Subscribers: jfb, sbc100, jgravelle-google, eraman, JDevlieghere, sunfish, llvm-commits Differential Revision: https://reviews.llvm.org/D45559 llvm-svn: 332667
1 parent ecb3e50 commit b4be38f

File tree

12 files changed

+53
-33
lines changed

12 files changed

+53
-33
lines changed
 

‎llvm/include/llvm/Analysis/EHPersonalities.h

+18-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ enum class EHPersonality {
3232
MSVC_Win64SEH,
3333
MSVC_CXX,
3434
CoreCLR,
35-
Rust
35+
Rust,
36+
Wasm_CXX
3637
};
3738

3839
/// See if the given exception handling personality function is one
@@ -74,6 +75,22 @@ inline bool isFuncletEHPersonality(EHPersonality Pers) {
7475
llvm_unreachable("invalid enum");
7576
}
7677

78+
/// Returns true if this personality uses scope-style EH IR instructions:
79+
/// catchswitch, catchpad/ret, and cleanuppad/ret.
80+
inline bool isScopedEHPersonality(EHPersonality Pers) {
81+
switch (Pers) {
82+
case EHPersonality::MSVC_CXX:
83+
case EHPersonality::MSVC_X86SEH:
84+
case EHPersonality::MSVC_Win64SEH:
85+
case EHPersonality::CoreCLR:
86+
case EHPersonality::Wasm_CXX:
87+
return true;
88+
default:
89+
return false;
90+
}
91+
llvm_unreachable("invalid enum");
92+
}
93+
7794
/// Return true if this personality may be safely removed if there
7895
/// are no invoke instructions remaining in the current function.
7996
inline bool isNoOpWithoutInvoke(EHPersonality Pers) {

‎llvm/lib/Analysis/EHPersonalities.cpp

+16-14
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,21 @@ EHPersonality llvm::classifyEHPersonality(const Value *Pers) {
2525
if (!F)
2626
return EHPersonality::Unknown;
2727
return StringSwitch<EHPersonality>(F->getName())
28-
.Case("__gnat_eh_personality", EHPersonality::GNU_Ada)
29-
.Case("__gxx_personality_v0", EHPersonality::GNU_CXX)
30-
.Case("__gxx_personality_seh0",EHPersonality::GNU_CXX)
31-
.Case("__gxx_personality_sj0", EHPersonality::GNU_CXX_SjLj)
32-
.Case("__gcc_personality_v0", EHPersonality::GNU_C)
33-
.Case("__gcc_personality_seh0",EHPersonality::GNU_C)
34-
.Case("__gcc_personality_sj0", EHPersonality::GNU_C_SjLj)
35-
.Case("__objc_personality_v0", EHPersonality::GNU_ObjC)
36-
.Case("_except_handler3", EHPersonality::MSVC_X86SEH)
37-
.Case("_except_handler4", EHPersonality::MSVC_X86SEH)
38-
.Case("__C_specific_handler", EHPersonality::MSVC_Win64SEH)
39-
.Case("__CxxFrameHandler3", EHPersonality::MSVC_CXX)
40-
.Case("ProcessCLRException", EHPersonality::CoreCLR)
41-
.Case("rust_eh_personality", EHPersonality::Rust)
28+
.Case("__gnat_eh_personality", EHPersonality::GNU_Ada)
29+
.Case("__gxx_personality_v0", EHPersonality::GNU_CXX)
30+
.Case("__gxx_personality_seh0", EHPersonality::GNU_CXX)
31+
.Case("__gxx_personality_sj0", EHPersonality::GNU_CXX_SjLj)
32+
.Case("__gcc_personality_v0", EHPersonality::GNU_C)
33+
.Case("__gcc_personality_seh0", EHPersonality::GNU_C)
34+
.Case("__gcc_personality_sj0", EHPersonality::GNU_C_SjLj)
35+
.Case("__objc_personality_v0", EHPersonality::GNU_ObjC)
36+
.Case("_except_handler3", EHPersonality::MSVC_X86SEH)
37+
.Case("_except_handler4", EHPersonality::MSVC_X86SEH)
38+
.Case("__C_specific_handler", EHPersonality::MSVC_Win64SEH)
39+
.Case("__CxxFrameHandler3", EHPersonality::MSVC_CXX)
40+
.Case("ProcessCLRException", EHPersonality::CoreCLR)
41+
.Case("rust_eh_personality", EHPersonality::Rust)
42+
.Case("__gxx_wasm_personality_v0", EHPersonality::Wasm_CXX)
4243
.Default(EHPersonality::Unknown);
4344
}
4445

@@ -55,6 +56,7 @@ StringRef llvm::getEHPersonalityName(EHPersonality Pers) {
5556
case EHPersonality::MSVC_CXX: return "__CxxFrameHandler3";
5657
case EHPersonality::CoreCLR: return "ProcessCLRException";
5758
case EHPersonality::Rust: return "rust_eh_personality";
59+
case EHPersonality::Wasm_CXX: return "__gxx_wasm_personality_v0";
5860
case EHPersonality::Unknown: llvm_unreachable("Unknown EHPersonality!");
5961
}
6062

‎llvm/lib/Analysis/MustExecute.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void llvm::computeLoopSafetyInfo(LoopSafetyInfo *SafetyInfo, Loop *CurLoop) {
5252
Function *Fn = CurLoop->getHeader()->getParent();
5353
if (Fn->hasPersonalityFn())
5454
if (Constant *PersonalityFn = Fn->getPersonalityFn())
55-
if (isFuncletEHPersonality(classifyEHPersonality(PersonalityFn)))
55+
if (isScopedEHPersonality(classifyEHPersonality(PersonalityFn)))
5656
SafetyInfo->BlockColors = colorEHFunclets(*Fn);
5757
}
5858

‎llvm/lib/CodeGen/DwarfEHPrepare.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,9 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls(Function &Fn) {
195195
if (Resumes.empty())
196196
return false;
197197

198-
// Check the personality, don't do anything if it's funclet-based.
198+
// Check the personality, don't do anything if it's scope-based.
199199
EHPersonality Pers = classifyEHPersonality(Fn.getPersonalityFn());
200-
if (isFuncletEHPersonality(Pers))
200+
if (isScopedEHPersonality(Pers))
201201
return false;
202202

203203
LLVMContext &Ctx = Fn.getContext();

‎llvm/lib/CodeGen/MachineVerifier.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,7 @@ MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
646646
!(AsmInfo &&
647647
AsmInfo->getExceptionHandlingType() == ExceptionHandling::SjLj &&
648648
BB && isa<SwitchInst>(BB->getTerminator())) &&
649-
!isFuncletEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
649+
!isScopedEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
650650
report("MBB has more than one landing pad successor", MBB);
651651

652652
// Call AnalyzeBranch. If it succeeds, there several more conditions to check.

‎llvm/lib/CodeGen/WinEHPrepare.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ using namespace llvm;
4141
static cl::opt<bool> DisableDemotion(
4242
"disable-demotion", cl::Hidden,
4343
cl::desc(
44-
"Clone multicolor basic blocks but do not demote cross funclet values"),
44+
"Clone multicolor basic blocks but do not demote cross scopes"),
4545
cl::init(false));
4646

4747
static cl::opt<bool> DisableCleanups(
@@ -106,8 +106,8 @@ bool WinEHPrepare::runOnFunction(Function &Fn) {
106106
// Classify the personality to see what kind of preparation we need.
107107
Personality = classifyEHPersonality(Fn.getPersonalityFn());
108108

109-
// Do nothing if this is not a funclet-based personality.
110-
if (!isFuncletEHPersonality(Personality))
109+
// Do nothing if this is not a scope-based personality.
110+
if (!isScopedEHPersonality(Personality))
111111
return false;
112112

113113
DL = &Fn.getParent()->getDataLayout();

‎llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2567,6 +2567,7 @@ static bool isCatchAll(EHPersonality Personality, Constant *TypeInfo) {
25672567
case EHPersonality::MSVC_Win64SEH:
25682568
case EHPersonality::MSVC_CXX:
25692569
case EHPersonality::CoreCLR:
2570+
case EHPersonality::Wasm_CXX:
25702571
return TypeInfo->isNullValue();
25712572
}
25722573
llvm_unreachable("invalid enum");

‎llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -504,11 +504,11 @@ static bool functionHasLines(Function &F) {
504504
return false;
505505
}
506506

507-
static bool isUsingFuncletBasedEH(Function &F) {
507+
static bool isUsingScopeBasedEH(Function &F) {
508508
if (!F.hasPersonalityFn()) return false;
509509

510510
EHPersonality Personality = classifyEHPersonality(F.getPersonalityFn());
511-
return isFuncletEHPersonality(Personality);
511+
return isScopedEHPersonality(Personality);
512512
}
513513

514514
static bool shouldKeepInEntry(BasicBlock::iterator It) {
@@ -551,8 +551,8 @@ void GCOVProfiler::emitProfileNotes() {
551551
DISubprogram *SP = F.getSubprogram();
552552
if (!SP) continue;
553553
if (!functionHasLines(F)) continue;
554-
// TODO: Functions using funclet-based EH are currently not supported.
555-
if (isUsingFuncletBasedEH(F)) continue;
554+
// TODO: Functions using scope-based EH are currently not supported.
555+
if (isUsingScopeBasedEH(F)) continue;
556556

557557
// gcov expects every function to start with an entry block that has a
558558
// single successor, so split the entry block to make sure of that.
@@ -630,8 +630,8 @@ bool GCOVProfiler::emitProfileArcs() {
630630
DISubprogram *SP = F.getSubprogram();
631631
if (!SP) continue;
632632
if (!functionHasLines(F)) continue;
633-
// TODO: Functions using funclet-based EH are currently not supported.
634-
if (isUsingFuncletBasedEH(F)) continue;
633+
// TODO: Functions using scope-based EH are currently not supported.
634+
if (isUsingScopeBasedEH(F)) continue;
635635
if (!Result) Result = true;
636636

637637
unsigned Edges = 0;

‎llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@ bool ObjCARCContract::runOnFunction(Function &F) {
550550

551551
DenseMap<BasicBlock *, ColorVector> BlockColors;
552552
if (F.hasPersonalityFn() &&
553-
isFuncletEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
553+
isScopedEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
554554
BlockColors = colorEHFunclets(F);
555555

556556
LLVM_DEBUG(llvm::dbgs() << "**** ObjCARC Contract ****\n");

‎llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ void ObjCARCOpt::OptimizeIndividualCalls(Function &F) {
722722

723723
DenseMap<BasicBlock *, ColorVector> BlockColors;
724724
if (F.hasPersonalityFn() &&
725-
isFuncletEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
725+
isScopedEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
726726
BlockColors = colorEHFunclets(F);
727727

728728
// Visit all objc_* calls in F.

‎llvm/lib/Transforms/Utils/EscapeEnumerator.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ IRBuilder<> *EscapeEnumerator::Next() {
7373
F.setPersonalityFn(PersFn);
7474
}
7575

76-
if (isFuncletEHPersonality(classifyEHPersonality(F.getPersonalityFn()))) {
77-
report_fatal_error("Funclet EH not supported");
76+
if (isScopedEHPersonality(classifyEHPersonality(F.getPersonalityFn()))) {
77+
report_fatal_error("Scoped EH not supported");
7878
}
7979

8080
LandingPadInst *LPad =

‎llvm/lib/Transforms/Utils/InlineFunction.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1569,7 +1569,7 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI,
15691569
Instruction *CallSiteEHPad = nullptr;
15701570
if (CallerPersonality) {
15711571
EHPersonality Personality = classifyEHPersonality(CallerPersonality);
1572-
if (isFuncletEHPersonality(Personality)) {
1572+
if (isScopedEHPersonality(Personality)) {
15731573
Optional<OperandBundleUse> ParentFunclet =
15741574
CS.getOperandBundle(LLVMContext::OB_funclet);
15751575
if (ParentFunclet)

0 commit comments

Comments
 (0)
Please sign in to comment.