[PATCH] D79655: [WebAssembly] Handle exception specifications
Heejin Ahn via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri May 15 21:54:30 PDT 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rGbca347508c86: [WebAssembly] Handle exception specifications (authored by aheejin).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D79655/new/
https://reviews.llvm.org/D79655
Files:
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/CodeGen/CGException.cpp
clang/test/CodeGenCXX/wasm-eh.cpp
Index: clang/test/CodeGenCXX/wasm-eh.cpp
===================================================================
--- clang/test/CodeGenCXX/wasm-eh.cpp
+++ clang/test/CodeGenCXX/wasm-eh.cpp
@@ -1,7 +1,6 @@
// REQUIRES: webassembly-registered-target
// RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fms-extensions -fexceptions -fcxx-exceptions -fwasm-exceptions -target-feature +exception-handling -emit-llvm -o - -std=c++11 | FileCheck %s
// RUN: %clang_cc1 %s -triple wasm64-unknown-unknown -fms-extensions -fexceptions -fcxx-exceptions -fwasm-exceptions -target-feature +exception-handling -emit-llvm -o - -std=c++11 | FileCheck %s
-// RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fms-extensions -fexceptions -fcxx-exceptions -fwasm-exceptions -target-feature +exception-handling -S -o - -std=c++11 | FileCheck %s --check-prefix=ASSEMBLY
void may_throw();
void dont_throw() noexcept;
@@ -385,9 +384,27 @@
// CHECK: unreachable
+// RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fms-extensions -fexceptions -fcxx-exceptions -fwasm-exceptions -target-feature +exception-handling -emit-llvm -std=c++11 2>&1 | FileCheck %s --check-prefix=WARNING
+
+// Wasm ignores dynamic exception specifications with types at the moment.
+// Checks if a warning message is printed.
+void test9() throw(int) {
+}
+// 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.
+void test10() throw() {
+ throw 3;
+}
+// WARNING: warning: 'test10' has a non-throwing exception specification but can still throw
+// WARNING: function declared non-throwing here
+
// Here we only check if the command enables wasm exception handling in the
// backend so that exception handling instructions can be generated in .s file.
+// RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -fms-extensions -fexceptions -fcxx-exceptions -fwasm-exceptions -target-feature +exception-handling -S -o - -std=c++11 | FileCheck %s --check-prefix=ASSEMBLY
+
// ASSEMBLY: try
// ASSEMBLY: catch
// ASSEMBLY: rethrow
Index: clang/lib/CodeGen/CGException.cpp
===================================================================
--- clang/lib/CodeGen/CGException.cpp
+++ clang/lib/CodeGen/CGException.cpp
@@ -20,6 +20,7 @@
#include "clang/AST/StmtCXX.h"
#include "clang/AST/StmtObjC.h"
#include "clang/AST/StmtVisitor.h"
+#include "clang/Basic/DiagnosticSema.h"
#include "clang/Basic/TargetBuiltins.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
@@ -468,6 +469,18 @@
// 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
+ // case of throw with types, we ignore it and print a warning for now.
+ // TODO Correctly handle exception specification in wasm
+ if (getTarget().getCXXABI() == TargetCXXABI::WebAssembly) {
+ if (EST == EST_DynamicNone)
+ EHStack.pushTerminate();
+ else
+ CGM.getDiags().Report(D->getLocation(),
+ diag::warn_wasm_dynamic_exception_spec_ignored)
+ << FD->getExceptionSpecSourceRange();
+ return;
+ }
unsigned NumExceptions = Proto->getNumExceptions();
EHFilterScope *Filter = EHStack.pushFilter(NumExceptions);
@@ -544,6 +557,14 @@
// 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
+ // case of throw with types, we ignore it and print a warning for now.
+ // TODO Correctly handle exception specification in wasm
+ if (getTarget().getCXXABI() == TargetCXXABI::WebAssembly) {
+ if (EST == EST_DynamicNone)
+ EHStack.popTerminate();
+ return;
+ }
EHFilterScope &filterScope = cast<EHFilterScope>(*EHStack.begin());
emitFilterDispatchBlock(*this, filterScope);
EHStack.popFilter();
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -1590,6 +1590,8 @@
"exception specification of %0 uses itself">;
def err_exception_spec_incomplete_type : Error<
"exception specification needed for member of incomplete class %0">;
+def warn_wasm_dynamic_exception_spec_ignored : Warning<
+ "dynamic exception specifications with types are currently ignored in wasm">;
// C++ access checking
def err_class_redeclared_with_different_access : Error<
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79655.264417.patch
Type: text/x-patch
Size: 4821 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200516/c521c763/attachment-0001.bin>
More information about the cfe-commits
mailing list