diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -2288,8 +2288,12 @@ void Clang::AddWebAssemblyTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const { - // Default to "hidden" visibility. - if (!Args.hasArg(options::OPT_fvisibility_EQ, + const llvm::Triple &T = getToolChain().getTriple(); + // Default to "hidden" visibility for WebAssembly targets except + // for emscripten which uses the default for compatibility with + // existing code. + if (T.getOS() != llvm::Triple::Emscripten && + !Args.hasArg(options::OPT_fvisibility_EQ, options::OPT_fvisibility_ms_compat)) { CmdArgs.push_back("-fvisibility"); CmdArgs.push_back("hidden"); diff --git a/clang/test/Driver/wasm-toolchain.c b/clang/test/Driver/wasm-toolchain.c --- a/clang/test/Driver/wasm-toolchain.c +++ b/clang/test/Driver/wasm-toolchain.c @@ -12,6 +12,10 @@ // RUN: | FileCheck -check-prefix=FVISIBILITY_DEFAULT %s // FVISIBILITY_DEFAULT-NOT: hidden +// Emscripten is different in that it defaults to default, like other non-WebAssembly targets. +// RUN: %clang %s -### -target wasm32-unknown-emscripten 2>&1 \ +// RUN: | FileCheck -check-prefix=FVISIBILITY_DEFAULT %s + // A basic C link command-line with unknown OS. // RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo %s 2>&1 \