aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CGException.cpp
diff options
context:
space:
mode:
authorHeejin Ahn <aheejin@gmail.com>2021-05-19 01:47:58 -0700
committerHeejin Ahn <aheejin@gmail.com>2021-05-20 13:00:20 -0700
commit3eb12b0ae11fe23dc06e55e526fb45e460f72f1e (patch)
treeab049f9ae826f8021b6138ae8c211abf996f9c21 /clang/lib/CodeGen/CGException.cpp
parent6d19c84cd90369de5cda37f9a7a721e1cd9d0cb8 (diff)
downloadllvm-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.cpp17
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);