dschuff added a comment. Otherwise it looks good to me, although @majnemer would know more about the subtleties of what IR actually gets generated.
================ Comment at: lib/CodeGen/CGCleanup.h:630 static const EHPersonality MSVC_CxxFrameHandler3; + static const EHPersonality GNU_Wasm_CPlusCPlus; ---------------- aheejin wrote: > dschuff wrote: > > We might consider having 2 personalities: one for use with builtin > > exceptions, and other for emulated exceptions? I'm imagining that with this > > style of IR we might be able to do emulated exceptions better than we have > > for emscripten today. We don't have to think about that now, but maybe the > > name of the personality might reflect it: e.g. `GNU_Wasm_CPlusPlus_Native` > > (or builtin) vs `GNU_Wasm_CPlusPlus_Emulated` (or external). > (We talked in person :) ) I'll think about it. But I guess we can change the > name once we start implementing that feature? Sounds good. BTW this should actually be `GNU_Wasm_CPlusPlus` instead of `GNU_Wasm_CPlusCPlus` ================ Comment at: lib/CodeGen/CGException.cpp:1534 + // In case of wasm personality, we need to pass the exception value to + // __clang_call_terminate function. + if (getLangOpts().CPlusPlus && ---------------- aheejin wrote: > dschuff wrote: > > Why? > Not strictly necessarily, because we can modify libcxxabi to our liking. I > was trying to keep the same behavior as Itanium-style libcxxabi. The > `__clang_call_terminate` function that's called when an EH cleanup throws is > as follows: > ``` > ; Function Attrs: noinline noreturn nounwind > > define linkonce_odr hidden void @__clang_call_terminate(i8*) #6 comdat { > > %2 = call i8* @__cxa_begin_catch(i8* %0) #2 > > call void @_ZSt9terminatev() #8 > > unreachable > > } > ``` > > So it calls `__cxa_begin_catch` on the exception value before calling > `std::terminate`. We can change this behavior for wasm if we want, and I > guess we need some proxy object in case of a foreign exception, but anyway I > was trying to keep the behavior the same unless there's any reason not to. Oh I see, we are deviating from MSVC behavior to be more like itanium here. Makes sense. ================ Comment at: lib/CodeGen/CGException.cpp:1541 + } llvm::CallInst *terminateCall = + CGM.getCXXABI().emitTerminateForUnexpectedException(*this, Exn); ---------------- Should this be in an else block? No need to emit it after we emit the call to `__clang_call_terminate` Repository: rC Clang https://reviews.llvm.org/D44931 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits