Index: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -1437,8 +1437,11 @@ // Don't emit any special code for the cleanuppad instruction. It just marks // the start of an EH scope/funclet. FuncInfo.MBB->setIsEHScopeEntry(); - FuncInfo.MBB->setIsEHFuncletEntry(); - FuncInfo.MBB->setIsCleanupFuncletEntry(); + auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn()); + if (Pers != EHPersonality::Wasm_CXX) { + FuncInfo.MBB->setIsEHFuncletEntry(); + FuncInfo.MBB->setIsCleanupFuncletEntry(); + } } /// When an invoke or a cleanupret unwinds to the next EH pad, there are @@ -1458,6 +1461,7 @@ classifyEHPersonality(FuncInfo.Fn->getPersonalityFn()); bool IsMSVCCXX = Personality == EHPersonality::MSVC_CXX; bool IsCoreCLR = Personality == EHPersonality::CoreCLR; + bool IsWasmCXX = Personality == EHPersonality::Wasm_CXX; bool IsSEH = isAsynchronousEHPersonality(Personality); while (EHPadBB) { @@ -1472,7 +1476,8 @@ // personalities. UnwindDests.emplace_back(FuncInfo.MBBMap[EHPadBB], Prob); UnwindDests.back().first->setIsEHScopeEntry(); - UnwindDests.back().first->setIsEHFuncletEntry(); + if (!IsWasmCXX) + UnwindDests.back().first->setIsEHFuncletEntry(); break; } else if (auto *CatchSwitch = dyn_cast(Pad)) { // Add the catchpad handlers to the possible destinations. Index: llvm/trunk/test/CodeGen/WebAssembly/exception.ll =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/exception.ll +++ llvm/trunk/test/CodeGen/WebAssembly/exception.ll @@ -164,8 +164,7 @@ ; CHECK: try ; CHECK: call foo@FUNCTION ; CHECK: catch_all -; TODO This should be removed too in a later patch -; CHECK-NO T: get_global $push{{.+}}=, __stack_pointer@GLOBAL +; CHECK-NOT: get_global $push{{.+}}=, __stack_pointer@GLOBAL ; CHECK: call __cxa_end_catch@FUNCTION ; CHECK-NOT: set_global __stack_pointer@GLOBAL, $pop{{.+}} ; CHECK: end_try