Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
^^^^^^^^^^^

Expand Down
30 changes: 22 additions & 8 deletions clang/lib/Basic/Targets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -702,10 +702,17 @@ 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::Emscripten:
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);

Expand All @@ -724,10 +731,17 @@ 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::Emscripten:
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);
case llvm::Triple::UnknownOS:
Expand Down
35 changes: 33 additions & 2 deletions clang/lib/Basic/Targets/OSTargets.h
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
6 changes: 6 additions & 0 deletions clang/lib/Driver/ToolChains/WebAssembly.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
3 changes: 3 additions & 0 deletions clang/lib/Lex/InitHeaderSearch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
31 changes: 23 additions & 8 deletions clang/test/Preprocessor/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -1656,12 +1656,24 @@
// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=wasm64-emscripten \
// RUN: < /dev/null \
// RUN: | FileCheck -match-full-lines -check-prefixes=WEBASSEMBLY,WEBASSEMBLY64,EMSCRIPTEN %s
// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=wasm32-wasi \
// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=wasm32-wasip1 \
// RUN: < /dev/null \
// RUN: | FileCheck -match-full-lines -check-prefixes=WEBASSEMBLY,WEBASSEMBLY32,WEBASSEMBLY-WASI %s
// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=wasm64-wasi \
// RUN: | FileCheck -match-full-lines -check-prefixes=WEBASSEMBLY,WEBASSEMBLY32,WASI,WASIP1 %s
// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=wasm64-wasip1 \
// RUN: < /dev/null \
// RUN: | FileCheck -match-full-lines -check-prefixes=WEBASSEMBLY,WEBASSEMBLY64,WEBASSEMBLY-WASI %s
// RUN: | FileCheck -match-full-lines -check-prefixes=WEBASSEMBLY,WEBASSEMBLY64,WASI,WASIP1 %s
// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=wasm32-wasip2 \
// RUN: < /dev/null \
// RUN: | FileCheck -match-full-lines -check-prefixes=WEBASSEMBLY,WEBASSEMBLY32,WASI,WASIP2 %s
// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=wasm64-wasip2 \
// RUN: < /dev/null \
// RUN: | FileCheck -match-full-lines -check-prefixes=WEBASSEMBLY,WEBASSEMBLY64,WASI,WASIP2 %s
// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=wasm32-wasip3 \
// RUN: < /dev/null \
// RUN: | FileCheck -match-full-lines -check-prefixes=WEBASSEMBLY,WEBASSEMBLY32,WASI,WASIP3 %s
// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=wasm64-wasip3 \
// RUN: < /dev/null \
// RUN: | FileCheck -match-full-lines -check-prefixes=WEBASSEMBLY,WEBASSEMBLY64,WASI,WASIP3 %s
// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple=wasm32-unknown-unknown -x c++ \
// RUN: < /dev/null \
// RUN: | FileCheck -match-full-lines -check-prefixes=WEBASSEMBLY-CXX %s
Expand Down Expand Up @@ -2079,11 +2091,14 @@
// WEBASSEMBLY-NEXT:#define __clang_version__ "{{.*}}"
// WEBASSEMBLY-NEXT:#define __clang_wide_literal_encoding__ {{.*}}
// WEBASSEMBLY-NEXT:#define __llvm__ 1
// WEBASSEMBLY-WASI-NOT:#define __unix
// WEBASSEMBLY-WASI-NOT:#define __unix__
// WASI-NOT:#define __unix
// WASI-NOT:#define __unix__
// EMSCRIPTEN-NEXT:#define __unix 1
// EMSCRIPTEN-NEXT:#define __unix__ 1
// WEBASSEMBLY-WASI-NEXT:#define __wasi__ 1
// WASI-NEXT:#define __wasi__ 1
// WASIP1-NEXT:#define __wasip1__ 1
// WASIP2-NEXT:#define __wasip2__ 1
// WASIP3-NEXT:#define __wasip3__ 1
// WEBASSEMBLY-NOT:#define __wasm_simd128__
// WEBASSEMBLY-NOT:#define __wasm_simd256__
// WEBASSEMBLY-NOT:#define __wasm_simd512__
Expand All @@ -2098,7 +2113,7 @@
// WEBASSEMBLY64-NEXT:#define __wasm64__ 1
// WEBASSEMBLY-NEXT:#define __wasm__ 1
// EMSCRIPTEN:#define unix 1
// WEBASSEMBLY-WASI-NOT:#define unix 1
// WASI-NOT:#define unix 1
// WEBASSEMBLY-CXX-NOT:_REENTRANT
// WEBASSEMBLY-CXX-NOT:__STDCPP_THREADS__
// WEBASSEMBLY-CXX-ATOMICS:#define _REENTRANT 1
Expand Down
4 changes: 4 additions & 0 deletions llvm/docs/ReleaseNotes.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
-----------------------------

Expand Down
8 changes: 6 additions & 2 deletions llvm/include/llvm/TargetParser/Triple.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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.
Expand Down
9 changes: 9 additions & 0 deletions llvm/lib/TargetParser/Triple.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,12 @@ 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";
Expand Down Expand Up @@ -735,6 +741,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)
Expand Down
36 changes: 36 additions & 0 deletions llvm/unittests/TargetParser/TripleTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand All @@ -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());
Expand Down
Loading