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

Reply via email to