Skip to content

Commit 86ed8cb

Browse files
ashleynhtlively
authored andcommitted
[WebAssembly] Add multiple memories feature
Adding to allow users to get this flag into the target features section for future use cases. Reviewed By: tlively, aheejin Differential Revision: https://reviews.llvm.org/D158409
1 parent 7db1853 commit 86ed8cb

File tree

8 files changed

+46
-0
lines changed

8 files changed

+46
-0
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4583,6 +4583,8 @@ def mreference_types : Flag<["-"], "mreference-types">, Group<m_wasm_Features_Gr
45834583
def mno_reference_types : Flag<["-"], "mno-reference-types">, Group<m_wasm_Features_Group>;
45844584
def mextended_const : Flag<["-"], "mextended-const">, Group<m_wasm_Features_Group>;
45854585
def mno_extended_const : Flag<["-"], "mno-extended-const">, Group<m_wasm_Features_Group>;
4586+
def mmultimemory : Flag<["-"], "mmultimemory">, Group<m_wasm_Features_Group>;
4587+
def mno_multimemory : Flag<["-"], "mno-multimemory">, Group<m_wasm_Features_Group>;
45864588
def mexec_model_EQ : Joined<["-"], "mexec-model=">, Group<m_wasm_Features_Driver_Group>,
45874589
Values<"command,reactor">,
45884590
HelpText<"Execution model (WebAssembly only)">,

clang/lib/Basic/Targets/WebAssembly.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const {
5757
.Case("tail-call", HasTailCall)
5858
.Case("reference-types", HasReferenceTypes)
5959
.Case("extended-const", HasExtendedConst)
60+
.Case("multimemory", HasMultiMemory)
6061
.Default(false);
6162
}
6263

@@ -96,6 +97,8 @@ void WebAssemblyTargetInfo::getTargetDefines(const LangOptions &Opts,
9697
Builder.defineMacro("__wasm_reference_types__");
9798
if (HasExtendedConst)
9899
Builder.defineMacro("__wasm_extended_const__");
100+
if (HasMultiMemory)
101+
Builder.defineMacro("__wasm_multimemory__");
99102

100103
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
101104
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
@@ -152,6 +155,7 @@ bool WebAssemblyTargetInfo::initFeatureMap(
152155
Features["mutable-globals"] = true;
153156
Features["tail-call"] = true;
154157
Features["reference-types"] = true;
158+
Features["multimemory"] = true;
155159
setSIMDLevel(Features, SIMD128, true);
156160
} else if (CPU == "generic") {
157161
Features["sign-ext"] = true;
@@ -260,6 +264,14 @@ bool WebAssemblyTargetInfo::handleTargetFeatures(
260264
HasExtendedConst = false;
261265
continue;
262266
}
267+
if (Feature == "+multimemory") {
268+
HasMultiMemory = true;
269+
continue;
270+
}
271+
if (Feature == "-multimemory") {
272+
HasMultiMemory = false;
273+
continue;
274+
}
263275

264276
Diags.Report(diag::err_opt_not_valid_with_opt)
265277
<< Feature << "-target-feature";

clang/lib/Basic/Targets/WebAssembly.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {
6363
bool HasTailCall = false;
6464
bool HasReferenceTypes = false;
6565
bool HasExtendedConst = false;
66+
bool HasMultiMemory = false;
6667

6768
std::string ABI;
6869

clang/test/Driver/wasm-features.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,12 @@
4141
// DEFAULT-NOT: "-target-feature" "-nontrapping-fptoint"
4242
// MVP-NOT: "-target-feature" "+nontrapping-fptoint"
4343
// BLEEDING-EDGE-NOT: "-target-feature" "-nontrapping-fptoint"
44+
45+
// RUN: %clang --target=wasm32-unknown-unknown -### %s -mmultimemory 2>&1 | FileCheck %s -check-prefix=MULTIMEMORY
46+
// RUN: %clang --target=wasm32-unknown-unknown -### %s -mno-multimemory 2>&1 | FileCheck %s -check-prefix=NO-MULTIMEMORY
47+
48+
// MULTIMEMORY: "-target-feature" "+multimemory"
49+
// NO-MULTIMEMORY: "-target-feature" "-multimemory"
50+
// DEFAULT-NOT: "-target-feature" "-multimemory"
51+
// MVP-NOT: "-target-feature" "+multimemory"
52+
// BLEEDING-EDGE-NOT: "-target-feature" "-multimemory"

clang/test/Preprocessor/wasm-target-features.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,16 @@
114114
// RUN: | FileCheck %s -check-prefix=EXTENDED-CONST
115115
//
116116
// EXTENDED-CONST:#define __wasm_extended_const__ 1{{$}}
117+
//
118+
// RUN: %clang -E -dM %s -o - 2>&1 \
119+
// RUN: -target wasm32-unknown-unknown -mmultimemory \
120+
// RUN: | FileCheck %s -check-prefix=MULTIMEMORY
121+
// RUN: %clang -E -dM %s -o - 2>&1 \
122+
// RUN: -target wasm64-unknown-unknown -mmultimemory \
123+
// RUN: | FileCheck %s -check-prefix=MULTIMEMORY
124+
//
125+
// MULTIMEMORY:#define __wasm_multimemory__ 1{{$}}
126+
//
117127

118128
// RUN: %clang -E -dM %s -o - 2>&1 \
119129
// RUN: -target wasm32-unknown-unknown -mcpu=mvp \
@@ -133,6 +143,7 @@
133143
// MVP-NOT:#define __wasm_tail_call__
134144
// MVP-NOT:#define __wasm_reference_types__
135145
// MVP-NOT:#define __wasm_extended_const__
146+
// MVP-NOT:#define __wasm_multimemory__
136147

137148
// RUN: %clang -E -dM %s -o - 2>&1 \
138149
// RUN: -target wasm32-unknown-unknown -mcpu=bleeding-edge \
@@ -148,6 +159,7 @@
148159
// BLEEDING-EDGE-DAG:#define __wasm_atomics__ 1{{$}}
149160
// BLEEDING-EDGE-DAG:#define __wasm_mutable_globals__ 1{{$}}
150161
// BLEEDING-EDGE-DAG:#define __wasm_tail_call__ 1{{$}}
162+
// BLEEDING-EDGE-DAG:#define __wasm_multimemory__ 1{{$}}
151163
// BLEEDING-EDGE-NOT:#define __wasm_unimplemented_simd128__ 1{{$}}
152164
// BLEEDING-EDGE-NOT:#define __wasm_exception_handling__ 1{{$}}
153165
// BLEEDING-EDGE-NOT:#define __wasm_multivalue__ 1{{$}}

llvm/lib/Target/WebAssembly/WebAssembly.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ def FeatureExtendedConst :
7171
SubtargetFeature<"extended-const", "HasExtendedConst", "true",
7272
"Enable extended const expressions">;
7373

74+
def FeatureMultiMemory :
75+
SubtargetFeature<"multimemory", "HasMultiMemory", "true",
76+
"Enable multiple memories">;
77+
7478
//===----------------------------------------------------------------------===//
7579
// Architectures.
7680
//===----------------------------------------------------------------------===//

llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ def HasExtendedConst :
7070
Predicate<"Subtarget->hasExtendedConst()">,
7171
AssemblerPredicate<(all_of FeatureExtendedConst), "extended-const">;
7272

73+
def HasMultiMemory :
74+
Predicate<"Subtarget->hasMultiMemory()">,
75+
AssemblerPredicate<(all_of FeatureMultiMemory), "multimemory">;
76+
7377
//===----------------------------------------------------------------------===//
7478
// WebAssembly-specific DAG Node Types.
7579
//===----------------------------------------------------------------------===//

llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo {
4949
bool HasTailCall = false;
5050
bool HasReferenceTypes = false;
5151
bool HasExtendedConst = false;
52+
bool HasMultiMemory = false;
5253

5354
/// What processor and OS we're targeting.
5455
Triple TargetTriple;
@@ -101,6 +102,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo {
101102
bool hasMutableGlobals() const { return HasMutableGlobals; }
102103
bool hasTailCall() const { return HasTailCall; }
103104
bool hasReferenceTypes() const { return HasReferenceTypes; }
105+
bool hasMultiMemory() const { return HasMultiMemory; }
104106

105107
/// Parses features string setting specified subtarget options. Definition of
106108
/// function is auto generated by tblgen.

0 commit comments

Comments
 (0)