mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-15 12:39:19 +00:00
[WebAssembly] Don't inline -emscripten-cxx-exceptions-allowed functions
Functions specified in `-emscripten-cxx-exceptions-allowed`, which is set by Emscripten's `EXCEPTION_CATCHING_ALLOWED` setting, can be inlined in LLVM middle ends before we reach WebAssemblyLowerEmscriptenEHSjLj pass in the wasm backend and thus don't get transformed for exception catching. This fixes the issue by adding `--force-attribute=FUNC_NAME:noinline` for each function name in `-emscripten-cxx-exceptions-allowed`, which adds `noinline` attribute to the specified function and thus excludes the function from inlining candidates in optimization passes. Fixes the remaining half of https://github.com/emscripten-core/emscripten/issues/10721. Reviewed By: sbc100 Differential Revision: https://reviews.llvm.org/D99259
This commit is contained in:
parent
9d45579279
commit
a6aae5f7fc
@ -294,6 +294,36 @@ void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
|
||||
CC1Args.push_back("-target-feature");
|
||||
CC1Args.push_back("+exception-handling");
|
||||
}
|
||||
|
||||
for (const Arg *A : DriverArgs.filtered(options::OPT_mllvm)) {
|
||||
StringRef Opt = A->getValue(0);
|
||||
if (Opt.startswith("-emscripten-cxx-exceptions-allowed")) {
|
||||
// '-mllvm -emscripten-cxx-exceptions-allowed' should be used with
|
||||
// '-mllvm -enable-emscripten-cxx-exceptions'
|
||||
bool EmExceptionArgExists = false;
|
||||
for (const Arg *A : DriverArgs.filtered(options::OPT_mllvm)) {
|
||||
if (StringRef(A->getValue(0)) == "-enable-emscripten-cxx-exceptions") {
|
||||
EmExceptionArgExists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!EmExceptionArgExists)
|
||||
getDriver().Diag(diag::err_drv_argument_only_allowed_with)
|
||||
<< "-mllvm -emscripten-cxx-exceptions-allowed"
|
||||
<< "-mllvm -enable-emscripten-cxx-exceptions";
|
||||
|
||||
// Prevent functions specified in -emscripten-cxx-exceptions-allowed list
|
||||
// from being inlined before reaching the wasm backend.
|
||||
StringRef FuncNamesStr = Opt.split('=').second;
|
||||
SmallVector<StringRef, 4> FuncNames;
|
||||
FuncNamesStr.split(FuncNames, ',');
|
||||
for (auto Name : FuncNames) {
|
||||
CC1Args.push_back("-mllvm");
|
||||
CC1Args.push_back(DriverArgs.MakeArgString("--force-attribute=" + Name +
|
||||
":noinline"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
|
||||
|
@ -79,6 +79,21 @@
|
||||
// RUN: | FileCheck -check-prefix=PTHREAD_NO_SIGN_EXT %s
|
||||
// PTHREAD_NO_SIGN_EXT: invalid argument '-pthread' not allowed with '-mno-sign-ext'
|
||||
|
||||
// '-mllvm -emscripten-cxx-exceptions-allowed=foo,bar' sets
|
||||
// '-mllvm --force-attribute=foo:noinline -mllvm --force-attribute=bar:noinline'
|
||||
// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown \
|
||||
// RUN: --sysroot=/foo %s -mllvm -enable-emscripten-cxx-exceptions \
|
||||
// RUN: -mllvm -emscripten-cxx-exceptions-allowed=foo,bar 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=EMSCRIPTEN_EH_ALLOWED_NOINLINE %s
|
||||
// EMSCRIPTEN_EH_ALLOWED_NOINLINE: clang{{.*}}" "-cc1" {{.*}} "-mllvm" "--force-attribute=foo:noinline" "-mllvm" "--force-attribute=bar:noinline"
|
||||
|
||||
// '-mllvm -emscripten-cxx-exceptions-allowed' only allowed with
|
||||
// '-mllvm -enable-emscripten-cxx-exceptions'
|
||||
// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown \
|
||||
// RUN: --sysroot=/foo %s -mllvm -emscripten-cxx-exceptions-allowed 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=EMSCRIPTEN_EH_ALLOWED_WO_ENABLE %s
|
||||
// EMSCRIPTEN_EH_ALLOWED_WO_ENABLE: invalid argument '-mllvm -emscripten-cxx-exceptions-allowed' only allowed with '-mllvm -enable-emscripten-cxx-exceptions'
|
||||
|
||||
// '-fwasm-exceptions' sets +exception-handling
|
||||
// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown \
|
||||
// RUN: --sysroot=/foo %s -fwasm-exceptions 2>&1 \
|
||||
|
Loading…
x
Reference in New Issue
Block a user