diff options
author | Heejin Ahn <aheejin@gmail.com> | 2021-05-19 01:47:58 -0700 |
---|---|---|
committer | Heejin Ahn <aheejin@gmail.com> | 2021-05-20 13:00:20 -0700 |
commit | 3eb12b0ae11fe23dc06e55e526fb45e460f72f1e (patch) | |
tree | ab049f9ae826f8021b6138ae8c211abf996f9c21 /clang/lib/CodeGen/CGException.cpp | |
parent | 6d19c84cd90369de5cda37f9a7a721e1cd9d0cb8 (diff) | |
download | llvm-3eb12b0ae11fe23dc06e55e526fb45e460f72f1e.zip llvm-3eb12b0ae11fe23dc06e55e526fb45e460f72f1e.tar.gz llvm-3eb12b0ae11fe23dc06e55e526fb45e460f72f1e.tar.bz2 |
[WebAssembly] Warn on exception spec for Emscripten EH
It turns out we have not correctly supported exception spec all along in
Emscripten EH. Emscripten EH supports `throw()` but not `throw` with
types. See https://bugs.llvm.org/show_bug.cgi?id=50396.
Wasm EH also only supports `throw()` but not `throw` with types, and we
have been printing a warning message for the latter. This prints the
same warning message for `throw` with types when Emscripten EH is used,
or more precisely, when Wasm EH is not used. (So this will print the
warning messsage even when `-fno-exceptions` is used but I think that
should be fine. It's cumbersome to do a complilcated option checking in
CGException.cpp and options checkings are mostly done in elsewhere.)
Reviewed By: dschuff, kripken
Differential Revision: https://reviews.llvm.org/D102791
Diffstat (limited to 'clang/lib/CodeGen/CGException.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGException.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp index 2467922..9f65e9e 100644 --- a/clang/lib/CodeGen/CGException.cpp +++ b/clang/lib/CodeGen/CGException.cpp @@ -486,9 +486,9 @@ void CodeGenFunction::EmitStartEHSpec(const Decl *D) { // encode these in an object file but MSVC doesn't do anything with it. if (getTarget().getCXXABI().isMicrosoft()) return; - // In wasm we currently treat 'throw()' in the same way as 'noexcept'. In + // In Wasm EH we currently treat 'throw()' in the same way as 'noexcept'. In // case of throw with types, we ignore it and print a warning for now. - // TODO Correctly handle exception specification in wasm + // TODO Correctly handle exception specification in Wasm EH if (CGM.getLangOpts().hasWasmExceptions()) { if (EST == EST_DynamicNone) EHStack.pushTerminate(); @@ -498,6 +498,19 @@ void CodeGenFunction::EmitStartEHSpec(const Decl *D) { << FD->getExceptionSpecSourceRange(); return; } + // Currently Emscripten EH only handles 'throw()' but not 'throw' with + // types. 'throw()' handling will be done in JS glue code so we don't need + // to do anything in that case. Just print a warning message in case of + // throw with types. + // TODO Correctly handle exception specification in Emscripten EH + if (getTarget().getCXXABI() == TargetCXXABI::WebAssembly && + CGM.getLangOpts().getExceptionHandling() == + LangOptions::ExceptionHandlingKind::None && + EST == EST_Dynamic) + CGM.getDiags().Report(D->getLocation(), + diag::warn_wasm_dynamic_exception_spec_ignored) + << FD->getExceptionSpecSourceRange(); + unsigned NumExceptions = Proto->getNumExceptions(); EHFilterScope *Filter = EHStack.pushFilter(NumExceptions); |