Index: cfe/trunk/include/clang/Driver/Options.td =================================================================== --- cfe/trunk/include/clang/Driver/Options.td +++ cfe/trunk/include/clang/Driver/Options.td @@ -2177,6 +2177,8 @@ def mno_atomics : Flag<["-"], "mno-atomics">, Group; def mbulk_memory : Flag<["-"], "mbulk-memory">, Group; def mno_bulk_memory : Flag<["-"], "mno-bulk-memory">, Group; +def mmutable_globals : Flag<["-"], "mmutable-globals">, Group; +def mno_mutable_globals : Flag<["-"], "mno-mutable-globals">, Group; def mamdgpu_debugger_abi : Joined<["-"], "mamdgpu-debugger-abi=">, Flags<[HelpHidden]>, Index: cfe/trunk/lib/Basic/Targets/WebAssembly.h =================================================================== --- cfe/trunk/lib/Basic/Targets/WebAssembly.h +++ cfe/trunk/lib/Basic/Targets/WebAssembly.h @@ -35,6 +35,7 @@ bool HasExceptionHandling = false; bool HasBulkMemory = false; bool HasAtomics = false; + bool HasMutableGlobals = false; public: explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &) Index: cfe/trunk/lib/Basic/Targets/WebAssembly.cpp =================================================================== --- cfe/trunk/lib/Basic/Targets/WebAssembly.cpp +++ cfe/trunk/lib/Basic/Targets/WebAssembly.cpp @@ -42,6 +42,7 @@ .Case("exception-handling", HasExceptionHandling) .Case("bulk-memory", HasBulkMemory) .Case("atomics", HasAtomics) + .Case("mutable-globals", HasMutableGlobals) .Default(false); } @@ -71,6 +72,8 @@ Builder.defineMacro("__wasm_bulk_memory__"); if (HasAtomics) Builder.defineMacro("__wasm_atomics__"); + if (HasMutableGlobals) + Builder.defineMacro("__wasm_mutable_globals__"); } void WebAssemblyTargetInfo::setSIMDLevel(llvm::StringMap &Features, @@ -94,6 +97,7 @@ Features["nontrapping-fptoint"] = true; Features["sign-ext"] = true; Features["atomics"] = true; + Features["mutable-globals"] = true; setSIMDLevel(Features, SIMD128); } // Other targets do not consider user-configured features here, but while we @@ -110,6 +114,8 @@ Features["bulk-memory"] = true; if (HasAtomics) Features["atomics"] = true; + if (HasMutableGlobals) + Features["mutable-globals"] = true; return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); } @@ -173,6 +179,14 @@ HasAtomics = false; continue; } + if (Feature == "+mutable-globals") { + HasMutableGlobals = true; + continue; + } + if (Feature == "-mutable-globals") { + HasMutableGlobals = false; + continue; + } Diags.Report(diag::err_opt_not_valid_with_opt) << Feature << "-target-feature"; Index: cfe/trunk/test/Preprocessor/wasm-target-features.c =================================================================== --- cfe/trunk/test/Preprocessor/wasm-target-features.c +++ cfe/trunk/test/Preprocessor/wasm-target-features.c @@ -71,6 +71,15 @@ // PTHREAD:#define __wasm_atomics__ 1{{$}} // RUN: %clang -E -dM %s -o - 2>&1 \ +// RUN: -target wasm32-unknown-unknown -mmutable-globals \ +// RUN: | FileCheck %s -check-prefix=MUTABLE-GLOBALS +// RUN: %clang -E -dM %s -o - 2>&1 \ +// RUN: -target wasm64-unknown-unknown -mmutable-globals \ +// RUN: | FileCheck %s -check-prefix=MUTABLE-GLOBALS +// +// MUTABLE-GLOBALS:#define __wasm_mutable_globals__ 1{{$}} + +// RUN: %clang -E -dM %s -o - 2>&1 \ // RUN: -target wasm32-unknown-unknown -mcpu=mvp \ // RUN: | FileCheck %s -check-prefix=MVP // RUN: %clang -E -dM %s -o - 2>&1 \ @@ -84,6 +93,7 @@ // MVP-NOT:#define __wasm_exception_handling__ // MVP-NOT:#define __wasm_bulk_memory__ // MVP-NOT:#define __wasm_atomics__ +// MVP-NOT:#define __wasm_mutable_globals__ // RUN: %clang -E -dM %s -o - 2>&1 \ // RUN: -target wasm32-unknown-unknown -mcpu=bleeding-edge \ @@ -96,6 +106,7 @@ // BLEEDING-EDGE-DAG:#define __wasm_sign_ext__ 1{{$}} // BLEEDING-EDGE-DAG:#define __wasm_simd128__ 1{{$}} // BLEEDING-EDGE-DAG:#define __wasm_atomics__ 1{{$}} +// BLEEDING-EDGE-DAG:#define __wasm_mutable_globals__ 1{{$}} // BLEEDING-EDGE-NOT:#define __wasm_unimplemented_simd128__ 1{{$}} // RUN: %clang -E -dM %s -o - 2>&1 \ Index: llvm/trunk/lib/Target/WebAssembly/WebAssembly.td =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssembly.td +++ llvm/trunk/lib/Target/WebAssembly/WebAssembly.td @@ -51,6 +51,10 @@ SubtargetFeature<"bulk-memory", "HasBulkMemory", "true", "Enable bulk memory operations">; +def FeatureMutableGlobals : + SubtargetFeature<"mutable-globals", "HasMutableGlobals", "true", + "Enable mutable globals">; + //===----------------------------------------------------------------------===// // Architectures. //===----------------------------------------------------------------------===// Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h @@ -44,6 +44,7 @@ bool HasSignExt = false; bool HasExceptionHandling = false; bool HasBulkMemory = false; + bool HasMutableGlobals = false; /// String name of used CPU. std::string CPUString; @@ -97,6 +98,7 @@ bool hasSignExt() const { return HasSignExt; } bool hasExceptionHandling() const { return HasExceptionHandling; } bool hasBulkMemory() const { return HasBulkMemory; } + bool hasMutableGlobals() const { return HasMutableGlobals; } /// Parses features string setting specified subtarget options. Definition of /// function is auto generated by tblgen. Index: llvm/trunk/test/CodeGen/WebAssembly/mutable-globals.ll =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/mutable-globals.ll +++ llvm/trunk/test/CodeGen/WebAssembly/mutable-globals.ll @@ -0,0 +1,16 @@ +; RUN: llc < %s -mattr=+mutable-globals | FileCheck %s + +; Test that mutable globals is properly emitted into the target features section + +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +define void @foo() { + ret void +} + +; CHECK-LABEL: .custom_section.target_features +; CHECK-NEXT: .int8 1 +; CHECK-NEXT: .int8 43 +; CHECK-NEXT: .int8 15 +; CHECK-NEXT: .ascii "mutable-globals"