https://github.com/sunfishcode created https://github.com/llvm/llvm-project/pull/165345
This adds code to recognize "wasm32-wasip1", "wasm32-wasip2", and "wasm32-wasip3" as explicit targets, and adds a deprecation warning when the "wasm32-wasi" target is used, pointing users to the "wasm32-wasip1" target. Fixes #165344. I'm filing this as a draft PR for now, as I've only just now proposed to make this change in #165344. >From 4809631f529f6f83105d97a4ecbe7c8312f2c5fd Mon Sep 17 00:00:00 2001 From: Dan Gohman <[email protected]> Date: Mon, 27 Oct 2025 19:13:17 -0700 Subject: [PATCH] Rename wasm32-wasi to wasm32-wasip1. This adds code to recognize "wasm32-wasip1", "wasm32-wasip2", and "wasm32-wasip3" as explicit targets, and adds a deprecation warning when the "wasm32-wasi" target is used, pointing users to the "wasm32-wasip1" target. Fixes #165344. --- clang/docs/ReleaseNotes.rst | 4 +++ clang/lib/Basic/Targets.cpp | 26 +++++++++++---- clang/lib/Basic/Targets/OSTargets.h | 35 ++++++++++++++++++-- clang/lib/Driver/ToolChains/WebAssembly.cpp | 6 ++++ clang/lib/Lex/InitHeaderSearch.cpp | 3 ++ llvm/docs/ReleaseNotes.md | 4 +++ llvm/include/llvm/TargetParser/Triple.h | 8 +++-- llvm/lib/TargetParser/Triple.cpp | 6 ++++ llvm/unittests/TargetParser/TripleTest.cpp | 36 +++++++++++++++++++++ 9 files changed, 118 insertions(+), 10 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index e6e33e7a9a280..82c3932fcfe18 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -576,6 +576,10 @@ NetBSD Support WebAssembly Support ^^^^^^^^^^^^^^^^^^^ +- The `wasm32-wasi` target has been renamed to `wasm32-wasip1`. The old + option is still recognized, though by default will emit a deprecation + warning. + AVR Support ^^^^^^^^^^^ diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index f39c698b5d734..f27f53fc1c967 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -702,9 +702,16 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple, !Triple.isOSBinFormatWasm()) return nullptr; switch (os) { - case llvm::Triple::WASI: - return std::make_unique<WASITargetInfo<WebAssembly32TargetInfo>>(Triple, - Opts); + case llvm::Triple::WASI: // Treat "wasi" as "wasip1" for now. + case llvm::Triple::WASIp1: + return std::make_unique<WASIP1TargetInfo<WebAssembly32TargetInfo>>(Triple, + Opts); + case llvm::Triple::WASIp2: + return std::make_unique<WASIP2TargetInfo<WebAssembly32TargetInfo>>(Triple, + Opts); + case llvm::Triple::WASIp3: + return std::make_unique<WASIP3TargetInfo<WebAssembly32TargetInfo>>(Triple, + Opts); case llvm::Triple::Emscripten: return std::make_unique<EmscriptenTargetInfo<WebAssembly32TargetInfo>>( Triple, Opts); @@ -724,9 +731,16 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple, !Triple.isOSBinFormatWasm()) return nullptr; switch (os) { - case llvm::Triple::WASI: - return std::make_unique<WASITargetInfo<WebAssembly64TargetInfo>>(Triple, - Opts); + case llvm::Triple::WASI: // Treat "wasi" as "wasip1" for now. + case llvm::Triple::WASIp1: + return std::make_unique<WASIP1TargetInfo<WebAssembly64TargetInfo>>(Triple, + Opts); + case llvm::Triple::WASIp2: + return std::make_unique<WASIP2TargetInfo<WebAssembly64TargetInfo>>(Triple, + Opts); + case llvm::Triple::WASIp3: + return std::make_unique<WASIP3TargetInfo<WebAssembly64TargetInfo>>(Triple, + Opts); case llvm::Triple::Emscripten: return std::make_unique<EmscriptenTargetInfo<WebAssembly64TargetInfo>>( Triple, Opts); diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h index 4d81c9a83714d..3b7a08213962b 100644 --- a/clang/lib/Basic/Targets/OSTargets.h +++ b/clang/lib/Basic/Targets/OSTargets.h @@ -940,14 +940,45 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyOSTargetInfo } }; -// WASI target +// WASIp1 target template <typename Target> -class LLVM_LIBRARY_VISIBILITY WASITargetInfo +class LLVM_LIBRARY_VISIBILITY WASIP1TargetInfo : public WebAssemblyOSTargetInfo<Target> { void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const final { WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder); Builder.defineMacro("__wasi__"); + Builder.defineMacro("__wasip1__"); + } + +public: + using WebAssemblyOSTargetInfo<Target>::WebAssemblyOSTargetInfo; +}; + +// WASIp2 target +template <typename Target> +class LLVM_LIBRARY_VISIBILITY WASIP2TargetInfo + : public WebAssemblyOSTargetInfo<Target> { + void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, + MacroBuilder &Builder) const final { + WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder); + Builder.defineMacro("__wasi__"); + Builder.defineMacro("__wasip2__"); + } + +public: + using WebAssemblyOSTargetInfo<Target>::WebAssemblyOSTargetInfo; +}; + +// WASIp3 target +template <typename Target> +class LLVM_LIBRARY_VISIBILITY WASIP3TargetInfo + : public WebAssemblyOSTargetInfo<Target> { + void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, + MacroBuilder &Builder) const final { + WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder); + Builder.defineMacro("__wasi__"); + Builder.defineMacro("__wasip3__"); } public: diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp index 5054868b5ff4d..67f6382c4dac9 100644 --- a/clang/lib/Driver/ToolChains/WebAssembly.cpp +++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp @@ -265,6 +265,12 @@ WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple, } getFilePaths().push_back(SysRoot + "/lib/" + MultiarchTriple); } + + if (getTriple().getOS() == llvm::Triple::WASI) { + D.Diag(diag::warn_drv_deprecated_custom) + << "--target=wasm32-wasi" + << "use --target=wasm32-wasip1 instead"; + } } const char *WebAssembly::getDefaultLinker() const { diff --git a/clang/lib/Lex/InitHeaderSearch.cpp b/clang/lib/Lex/InitHeaderSearch.cpp index 3e5f947a82cc3..e30925f4e548c 100644 --- a/clang/lib/Lex/InitHeaderSearch.cpp +++ b/clang/lib/Lex/InitHeaderSearch.cpp @@ -230,6 +230,9 @@ bool InitHeaderSearch::ShouldAddDefaultIncludePaths( case llvm::Triple::Solaris: case llvm::Triple::UEFI: case llvm::Triple::WASI: + case llvm::Triple::WASIp1: + case llvm::Triple::WASIp2: + case llvm::Triple::WASIp3: case llvm::Triple::Win32: case llvm::Triple::ZOS: return false; diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index 36383b12788f9..5b0e814bcbd65 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -139,6 +139,10 @@ Changes to the RISC-V Backend Changes to the WebAssembly Backend ---------------------------------- +- The `wasm32-wasi` target has been renamed to `wasm32-wasip1`. The old + option is still recognized, though by default will emit a deprecation + warning. + Changes to the Windows Target ----------------------------- diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h index 0e82dd212f34d..89bf990d83aa9 100644 --- a/llvm/include/llvm/TargetParser/Triple.h +++ b/llvm/include/llvm/TargetParser/Triple.h @@ -241,7 +241,10 @@ class Triple { AMDPAL, // AMD PAL Runtime HermitCore, // HermitCore Unikernel/Multikernel Hurd, // GNU/Hurd - WASI, // Experimental WebAssembly OS + WASI, // Deprecated alias of WASI 0.1; in the future will be WASI 1.0. + WASIp1, // WASI 0.1 + WASIp2, // WASI 0.2 + WASIp3, // WASI 0.3 Emscripten, ShaderModel, // DirectX ShaderModel LiteOS, @@ -743,7 +746,8 @@ class Triple { /// Tests whether the OS is WASI. bool isOSWASI() const { - return getOS() == Triple::WASI; + return getOS() == Triple::WASI || getOS() == Triple::WASIp1 || + getOS() == Triple::WASIp2 || getOS() == Triple::WASIp3; } /// Tests whether the OS is Emscripten. diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index 11ba9ee32f66a..80d500dcc4fc6 100644 --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -324,6 +324,9 @@ StringRef Triple::getOSTypeName(OSType Kind) { case TvOS: return "tvos"; case UEFI: return "uefi"; case WASI: return "wasi"; + case WASIp1: return "wasip1"; + case WASIp2: return "wasip2"; + case WASIp3: return "wasip3"; case WatchOS: return "watchos"; case Win32: return "windows"; case ZOS: return "zos"; @@ -735,6 +738,9 @@ static Triple::OSType parseOS(StringRef OSName) { .StartsWith("amdpal", Triple::AMDPAL) .StartsWith("hermit", Triple::HermitCore) .StartsWith("hurd", Triple::Hurd) + .StartsWith("wasip1", Triple::WASIp1) + .StartsWith("wasip2", Triple::WASIp2) + .StartsWith("wasip3", Triple::WASIp3) .StartsWith("wasi", Triple::WASI) .StartsWith("emscripten", Triple::Emscripten) .StartsWith("shadermodel", Triple::ShaderModel) diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp index 3e803691cfd1f..367788af6c0bd 100644 --- a/llvm/unittests/TargetParser/TripleTest.cpp +++ b/llvm/unittests/TargetParser/TripleTest.cpp @@ -614,6 +614,24 @@ TEST(TripleTest, ParsedIDs) { EXPECT_EQ(Triple::WASI, T.getOS()); EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + T = Triple("wasm32-unknown-wasip1"); + EXPECT_EQ(Triple::wasm32, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::WASIp1, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + + T = Triple("wasm32-unknown-wasip2"); + EXPECT_EQ(Triple::wasm32, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::WASIp2, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + + T = Triple("wasm32-unknown-wasip3"); + EXPECT_EQ(Triple::wasm32, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::WASIp3, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + T = Triple("wasm64-unknown-unknown"); EXPECT_EQ(Triple::wasm64, T.getArch()); EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); @@ -626,6 +644,24 @@ TEST(TripleTest, ParsedIDs) { EXPECT_EQ(Triple::WASI, T.getOS()); EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + T = Triple("wasm64-unknown-wasip1"); + EXPECT_EQ(Triple::wasm64, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::WASIp1, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + + T = Triple("wasm64-unknown-wasip2"); + EXPECT_EQ(Triple::wasm64, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::WASIp2, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + + T = Triple("wasm64-unknown-wasip3"); + EXPECT_EQ(Triple::wasm64, T.getArch()); + EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); + EXPECT_EQ(Triple::WASIp3, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + T = Triple("avr-unknown-unknown"); EXPECT_EQ(Triple::avr, T.getArch()); EXPECT_EQ(Triple::UnknownVendor, T.getVendor()); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
