forked from OSchip/llvm-project
[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
This commit is contained in:
parent
6d19c84cd9
commit
3eb12b0ae1
|
@ -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);
|
||||
|
||||
|
|
|
@ -381,7 +381,7 @@ void test8() {
|
|||
// RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fms-extensions -fexceptions -fcxx-exceptions -exception-model=wasm -target-feature +exception-handling -emit-llvm -o - -std=c++11 2>&1 | FileCheck %s --check-prefix=WARNING-DEFAULT
|
||||
// RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fms-extensions -fexceptions -fcxx-exceptions -exception-model=wasm -target-feature +exception-handling -Wwasm-exception-spec -emit-llvm -o - -std=c++11 2>&1 | FileCheck %s --check-prefix=WARNING-ON
|
||||
// RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fms-extensions -fexceptions -fcxx-exceptions -exception-model=wasm -target-feature +exception-handling -Wno-wasm-exception-spec -emit-llvm -o - -std=c++11 2>&1 | FileCheck %s --check-prefix=WARNING-OFF
|
||||
// RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fexceptions -fcxx-exceptions -emit-llvm -o - -std=c++11 2>&1 | FileCheck %s --check-prefix=NOT-WASM-EH
|
||||
// RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fexceptions -fcxx-exceptions -emit-llvm -o - -std=c++11 2>&1 | FileCheck %s --check-prefix=EM-EH-WARNING
|
||||
|
||||
// Wasm EH ignores dynamic exception specifications with types at the moment.
|
||||
// This is controlled by -Wwasm-exception-spec, which is on by default. This
|
||||
|
@ -392,7 +392,7 @@ void test9() throw(int) {
|
|||
// WARNING-DEFAULT: warning: dynamic exception specifications with types are currently ignored in wasm
|
||||
// WARNING-ON: warning: dynamic exception specifications with types are currently ignored in wasm
|
||||
// WARNING-OFF-NOT: warning: dynamic exception specifications with types are currently ignored in wasm
|
||||
// NOT-WASM-EH-NOT: warning: dynamic exception specifications with types are currently ignored in wasm
|
||||
// EM-EH-WARNING: warning: dynamic exception specifications with types are currently ignored in wasm
|
||||
|
||||
// Wasm curremtly treats 'throw()' in the same way as 'noexept'. Check if the
|
||||
// same warning message is printed as if when a 'noexcept' function throws.
|
||||
|
|
Loading…
Reference in New Issue