]> granicus.if.org Git - clang/commitdiff
[WebAssembly] Remove uses of ThreadModel
authorThomas Lively <tlively@google.com>
Thu, 28 Feb 2019 18:39:08 +0000 (18:39 +0000)
committerThomas Lively <tlively@google.com>
Thu, 28 Feb 2019 18:39:08 +0000 (18:39 +0000)
Summary:
In the clang UI, replaces -mthread-model posix with -matomics as the
source of truth on threading. In the backend, replaces
-thread-model=posix with the atomics target feature, which is now
collected on the WebAssemblyTargetMachine along with all other used
features. These collected features will also be used to emit the
target features section in the future.

The default configuration for the backend is thread-model=posix and no
atomics, which was previously an invalid configuration. This change
makes the default valid because the thread model is ignored.

A side effect of this change is that objects are never emitted with
passive segments. It will instead be up to the linker to decide
whether sections should be active or passive based on whether atomics
are used in the final link.

Reviewers: aheejin, sbc100, dschuff

Subscribers: mehdi_amini, jgravelle-google, hiraditya, sunfish, steven_wu, dexonsmith, rupprecht, jfb, jdoerfert, cfe-commits, llvm-commits

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D58742

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@355112 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Driver/Options.td
include/clang/Driver/ToolChain.h
lib/Driver/Driver.cpp
lib/Driver/ToolChains/Clang.cpp
lib/Driver/ToolChains/WebAssembly.cpp
lib/Driver/ToolChains/WebAssembly.h
test/Driver/wasm-toolchain.c
test/Preprocessor/wasm-target-features.c

index dd597550d2f2649929d7c077b07e642c892817c7..8a68e68a2d74fa1b95dca59e133e3526eb5d53f1 100644 (file)
@@ -2160,6 +2160,8 @@ def msign_ext : Flag<["-"], "msign-ext">, Group<m_wasm_Features_Group>;
 def mno_sign_ext : Flag<["-"], "mno-sign-ext">, Group<m_wasm_Features_Group>;
 def mexception_handing : Flag<["-"], "mexception-handling">, Group<m_wasm_Features_Group>;
 def mno_exception_handing : Flag<["-"], "mno-exception-handling">, Group<m_wasm_Features_Group>;
+def matomics : Flag<["-"], "matomics">, Group<m_wasm_Features_Group>;
+def mno_atomics : Flag<["-"], "mno-atomics">, Group<m_wasm_Features_Group>;
 def mbulk_memory : Flag<["-"], "mbulk-memory">, Group<m_wasm_Features_Group>;
 def mno_bulk_memory : Flag<["-"], "mno-bulk-memory">, Group<m_wasm_Features_Group>;
 
index e82675d33455ff1dca71f675398bcc2cb827b4b3..eec49ec3dde5ab1446b9ef2613c0bcf0538c4d49 100644 (file)
@@ -453,9 +453,7 @@ public:
   virtual bool SupportsEmbeddedBitcode() const { return false; }
 
   /// getThreadModel() - Which thread model does this target use?
-  virtual std::string getThreadModel(const llvm::opt::ArgList &) const {
-    return "posix";
-  }
+  virtual std::string getThreadModel() const { return "posix"; }
 
   /// isThreadModelSupported() - Does this target support a thread model?
   virtual bool isThreadModelSupported(const StringRef Model) const;
index b405390d44e31e6edaa1e3e47d4db678e670f904..eb03e6e87cc02ccca3c5a287aa8a3c1403c03fa0 100644 (file)
@@ -1528,7 +1528,7 @@ void Driver::PrintVersion(const Compilation &C, raw_ostream &OS) const {
     if (TC.isThreadModelSupported(A->getValue()))
       OS << "Thread model: " << A->getValue();
   } else
-    OS << "Thread model: " << TC.getThreadModel(C.getArgs());
+    OS << "Thread model: " << TC.getThreadModel();
   OS << '\n';
 
   // Print out the install directory.
index e7fb3fe403c56440cca4c519b485afa09630badf..ff48360b666bfa527b8bdc7130c0df02db852d41 100644 (file)
@@ -3830,7 +3830,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
     CmdArgs.push_back(A->getValue());
   }
   else
-    CmdArgs.push_back(Args.MakeArgString(TC.getThreadModel(Args)));
+    CmdArgs.push_back(Args.MakeArgString(TC.getThreadModel()));
 
   Args.AddLastArg(CmdArgs, options::OPT_fveclib);
 
index f076b528ce4b8e8ff5b95ab1464c09feeda8e351..ce28d447ff2b6fc2f13a513fc53f5671455aac55 100644 (file)
@@ -20,27 +20,6 @@ using namespace clang::driver::toolchains;
 using namespace clang;
 using namespace llvm::opt;
 
-void parseThreadArgs(const Driver &Driver, const ArgList &DriverArgs,
-                     bool &Pthread, StringRef &ThreadModel,
-                     bool CheckForErrors = true) {
-  // Default value for -pthread / -mthread-model options, each being false /
-  // "single".
-  Pthread =
-      DriverArgs.hasFlag(options::OPT_pthread, options::OPT_no_pthread, false);
-  ThreadModel =
-      DriverArgs.getLastArgValue(options::OPT_mthread_model, "single");
-  if (!CheckForErrors)
-    return;
-
-  // Did user explicitly specify -mthread-model / -pthread?
-  bool HasThreadModel = DriverArgs.hasArg(options::OPT_mthread_model);
-  bool HasPthread = Pthread && DriverArgs.hasArg(options::OPT_pthread);
-  // '-pthread' cannot be used with '-mthread-model single'
-  if (HasPthread && HasThreadModel && ThreadModel == "single")
-    Driver.Diag(diag::err_drv_argument_not_allowed_with)
-        << "-pthread" << "-mthread-model single";
-}
-
 wasm::Linker::Linker(const ToolChain &TC)
     : GnuTool("wasm::Linker", "lld", TC) {}
 
@@ -145,15 +124,36 @@ void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
                          options::OPT_fno_use_init_array, true))
     CC1Args.push_back("-fuse-init-array");
 
-  // Either '-mthread-model posix' or '-pthread' sets '-target-feature
-  // +atomics'. We intentionally didn't create '-matomics' and set the atomics
-  // target feature here depending on the other two options.
-  bool Pthread = false;
-  StringRef ThreadModel = "";
-  parseThreadArgs(getDriver(), DriverArgs, Pthread, ThreadModel);
-  if (Pthread || ThreadModel != "single") {
+  // '-pthread' implies '-target-feature +atomics' and
+  // '-target-feature +bulk-memory'
+  if (DriverArgs.hasFlag(options::OPT_pthread, options::OPT_no_pthread,
+                         false)) {
+    if (DriverArgs.hasFlag(options::OPT_mno_atomics, options::OPT_matomics,
+                           false))
+      getDriver().Diag(diag::err_drv_argument_not_allowed_with)
+          << "-pthread"
+          << "-mno-atomics";
+    if (DriverArgs.hasFlag(options::OPT_mno_bulk_memory,
+                           options::OPT_mbulk_memory, false))
+      getDriver().Diag(diag::err_drv_argument_not_allowed_with)
+          << "-pthread"
+          << "-mno-bulk-memory";
     CC1Args.push_back("-target-feature");
     CC1Args.push_back("+atomics");
+    CC1Args.push_back("-target-feature");
+    CC1Args.push_back("+bulk-memory");
+  }
+
+  // '-matomics' implies '-mbulk-memory'
+  if (DriverArgs.hasFlag(options::OPT_matomics, options::OPT_mno_atomics,
+                         false)) {
+    if (DriverArgs.hasFlag(options::OPT_mno_bulk_memory,
+                           options::OPT_mbulk_memory, false))
+      getDriver().Diag(diag::err_drv_argument_not_allowed_with)
+          << "-matomics"
+          << "-mno-bulk-memory";
+    CC1Args.push_back("-target-feature");
+    CC1Args.push_back("+bulk-memory");
   }
 }
 
@@ -212,17 +212,6 @@ void WebAssembly::AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
   }
 }
 
-std::string WebAssembly::getThreadModel(const ArgList &DriverArgs) const {
-  // The WebAssembly MVP does not yet support threads. We set this to "posix"
-  // when '-pthread' is set.
-  bool Pthread = false;
-  StringRef ThreadModel = "";
-  parseThreadArgs(getDriver(), DriverArgs, Pthread, ThreadModel, false);
-  if (Pthread)
-    return "posix";
-  return ThreadModel;
-}
-
 Tool *WebAssembly::buildLinker() const {
   return new tools::wasm::Linker(*this);
 }
index 6ededd84ec6f04fad8c54fe77a477375aa2a3ce0..2d9210ac04cb1ea36113773ca33c52ffcb046152 100644 (file)
@@ -64,7 +64,6 @@ private:
       llvm::opt::ArgStringList &CC1Args) const override;
   void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
                            llvm::opt::ArgStringList &CmdArgs) const override;
-  std::string getThreadModel(const llvm::opt::ArgList &) const override;
 
   const char *getDefaultLinker() const override { return "wasm-ld"; }
 
index 22867117ffd53a466d1f2e510c268dcf78ddad54..bdef316c85cb84f39b17e53d234ff4f67c4c036f 100644 (file)
 // COMPILE: clang{{.*}}" "-cc1" {{.*}} "-internal-isystem" "/foo/include/wasm32-wasi-musl" "-internal-isystem" "/foo/include"
 
 // Thread-related command line tests.
-// - '-mthread-model' sets '-target-feature +matomics'
-// - '-phread' sets both '-target-featuer +atomics' and '-mthread-model posix'
-
-// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo %s -mthread-model posix 2>&1 | FileCheck -check-prefix=POSIX %s
-// POSIX: clang{{.*}}" "-cc1" {{.*}} "-target-feature" "+atomics"
 
+// '-pthread' sets '-target-feature +atomics' and '-target-feature +bulk-memory'
 // RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo %s -pthread 2>&1 | FileCheck -check-prefix=PTHREAD %s
-// PTHREAD: clang{{.*}}" "-cc1" {{.*}} "-mthread-model" "posix" {{.*}} "-target-feature" "+atomics"
+// PTHREAD: clang{{.*}}" "-cc1" {{.*}} "-target-feature" "+atomics" "-target-feature" "+bulk-memory"
+
+// '-pthread' not allowed with '-mno-atomics'
+// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo %s -pthread -mno-atomics 2>&1 | FileCheck -check-prefix=PTHREAD_NO_ATOMICS %s
+// PTHREAD_NO_ATOMICS: invalid argument '-pthread' not allowed with '-mno-atomics'
+
+// '-pthread' not allowed with '-mno-bulk-memory'
+// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo %s -pthread -mno-bulk-memory 2>&1 | FileCheck -check-prefix=PTHREAD_NO_BULKMEM %s
+// PTHREAD_NO_BULKMEM: invalid argument '-pthread' not allowed with '-mno-bulk-memory'
 
-// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo %s -pthread -mthread-model single 2>&1 | FileCheck -check-prefix=THREAD_OPT_ERROR %s
-// THREAD_OPT_ERROR: invalid argument '-pthread' not allowed with '-mthread-model single'
+// '-matomics' not allowed with '-mno-bulk-memory'
+// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo %s -matomics -mno-bulk-memory 2>&1 | FileCheck -check-prefix=ATOMICS_NO_BULKMEM %s
+// ATOMICS_NO_BULKMEM: invalid argument '-matomics' not allowed with '-mno-bulk-memory'
index 3ab22500c1504ff6d9b67407edf150936e31ac40..80e299247c723fa900a0dd5f8808e90ff9402495 100644 (file)
@@ -6,7 +6,7 @@
 // RUN:   | FileCheck %s -check-prefix=SIMD128
 //
 // SIMD128:#define __wasm_simd128__ 1{{$}}
-//
+
 // RUN: %clang -E -dM %s -o - 2>&1 \
 // RUN:     -target wasm32-unknown-unknown -munimplemented-simd128 \
 // RUN:   | FileCheck %s -check-prefix=SIMD128-UNIMPLEMENTED
@@ -15,7 +15,7 @@
 // RUN:   | FileCheck %s -check-prefix=SIMD128-UNIMPLEMENTED
 //
 // SIMD128-UNIMPLEMENTED:#define __wasm_unimplemented_simd128__ 1{{$}}
-//
+
 // RUN: %clang -E -dM %s -o - 2>&1 \
 // RUN:     -target wasm32-unknown-unknown -mnontrapping-fptoint \
 // RUN:   | FileCheck %s -check-prefix=NONTRAPPING-FPTOINT
@@ -24,7 +24,7 @@
 // RUN:   | FileCheck %s -check-prefix=NONTRAPPING-FPTOINT
 //
 // NONTRAPPING-FPTOINT:#define __wasm_nontrapping_fptoint__ 1{{$}}
-//
+
 // RUN: %clang -E -dM %s -o - 2>&1 \
 // RUN:     -target wasm32-unknown-unknown -msign-ext \
 // RUN:   | FileCheck %s -check-prefix=SIGN-EXT
@@ -33,7 +33,7 @@
 // RUN:   | FileCheck %s -check-prefix=SIGN-EXT
 //
 // SIGN-EXT:#define __wasm_sign_ext__ 1{{$}}
-//
+
 // RUN: %clang -E -dM %s -o - 2>&1 \
 // RUN:     -target wasm32-unknown-unknown -mexception-handling \
 // RUN:   | FileCheck %s -check-prefix=EXCEPTION-HANDLING
@@ -42,7 +42,7 @@
 // RUN:   | FileCheck %s -check-prefix=EXCEPTION-HANDLING
 //
 // EXCEPTION-HANDLING:#define __wasm_exception_handling__ 1{{$}}
-//
+
 // RUN: %clang -E -dM %s -o - 2>&1 \
 // RUN:     -target wasm32-unknown-unknown -mbulk-memory \
 // RUN:   | FileCheck %s -check-prefix=BULK-MEMORY
 // RUN:   | FileCheck %s -check-prefix=BULK-MEMORY
 //
 // BULK-MEMORY:#define __wasm_bulk_memory__ 1{{$}}
-//
-// We don't use -matomics directly and '-mthread-model posix' sets the atomics
-// target feature.
+
 // RUN: %clang -E -dM %s -o - 2>&1 \
-// RUN:     -target wasm32-unknown-unknown -mthread-model posix \
+// RUN:     -target wasm32-unknown-unknown -matomics \
 // RUN:   | FileCheck %s -check-prefix=ATOMICS
 // RUN: %clang -E -dM %s -o - 2>&1 \
-// RUN:     -target wasm64-unknown-unknown -mthread-model posix \
+// RUN:     -target wasm64-unknown-unknown -matomics \
 // RUN:   | FileCheck %s -check-prefix=ATOMICS
 //
-// ATOMICS:#define __wasm_atomics__ 1{{$}}
+// ATOMICS-DAG:#define __wasm_atomics__ 1{{$}}
+// ATOMICS-DAG:#define __wasm_bulk_memory__ 1{{$}}
+
+// RUN: %clang -E -dM %s -o - 2>&1 \
+// RUN:     -target wasm32-unknown-unknown -pthread \
+// RUN:   | FileCheck %s -check-prefix=PTHREAD
+// RUN: %clang -E -dM %s -o - 2>&1 \
+// RUN:     -target wasm64-unknown-unknown -pthread \
+// RUN:   | FileCheck %s -check-prefix=PTHREAD
 //
+// PTHREAD-DAG:#define __wasm_atomics__ 1{{$}}
+// PTHREAD-DAG:#define __wasm_bulk_memory__ 1{{$}}
+
 // RUN: %clang -E -dM %s -o - 2>&1 \
 // RUN:     -target wasm32-unknown-unknown -mcpu=mvp \
 // RUN:   | FileCheck %s -check-prefix=MVP
@@ -77,7 +86,7 @@
 // MVP-NOT:#define __wasm_exception_handling__
 // MVP-NOT:#define __wasm_bulk_memory__
 // MVP-NOT:#define __wasm_atomics__
-//
+
 // RUN: %clang -E -dM %s -o - 2>&1 \
 // RUN:     -target wasm32-unknown-unknown -mcpu=bleeding-edge \
 // RUN:   | FileCheck %s -check-prefix=BLEEDING-EDGE
@@ -90,7 +99,7 @@
 // BLEEDING-EDGE-DAG:#define __wasm_simd128__ 1{{$}}
 // BLEEDING-EDGE-DAG:#define __wasm_atomics__ 1{{$}}
 // BLEEDING-EDGE-NOT:#define __wasm_unimplemented_simd128__ 1{{$}}
-//
+
 // RUN: %clang -E -dM %s -o - 2>&1 \
 // RUN:     -target wasm32-unknown-unknown -mcpu=bleeding-edge -mno-simd128 \
 // RUN:   | FileCheck %s -check-prefix=BLEEDING-EDGE-NO-SIMD128