wasm-sysroot-usr
authorLLVM Packaging Team <pkg-llvm-team@lists.alioth.debian.org>
Sun, 1 Jan 2023 14:42:15 +0000 (14:42 +0000)
committerSylvestre Ledru <sylvestre@debian.org>
Sun, 1 Jan 2023 14:42:15 +0000 (14:42 +0000)
===================================================================

Gbp-Pq: Topic wasm
Gbp-Pq: Name wasm-sysroot-usr.diff

clang/lib/Driver/ToolChains/WebAssembly.cpp
clang/lib/Driver/ToolChains/WebAssembly.h

index 5bffc0f7ce70ca9d4c8448f210532fc86f9bd442..7754348cde1fcd49a1c54bdd58b7b5c09b9847c5 100644 (file)
@@ -16,6 +16,7 @@
 #include "clang/Driver/Options.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Path.h"
+#include "llvm/Support/VirtualFileSystem.h"
 #include "llvm/Option/ArgList.h"
 
 using namespace clang::driver;
@@ -172,7 +173,7 @@ WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
 
   getProgramPaths().push_back(getDriver().getInstalledDir());
 
-  auto SysRoot = getDriver().SysRoot;
+  std::string SysRoot = computeSysRoot();
   if (getTriple().getOS() == llvm::Triple::UnknownOS) {
     // Theoretically an "unknown" OS should mean no standard libraries, however
     // it could also mean that a custom set of libraries is in use, so just add
@@ -396,6 +397,7 @@ void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
     return;
 
   const Driver &D = getDriver();
+  std::string SysRoot = computeSysRoot();
 
   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
     SmallString<128> P(D.ResourceDir);
@@ -419,27 +421,39 @@ void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
     return;
   }
 
+  // add the multiarch path on e.g. wasm32-wasi
   if (getTriple().getOS() != llvm::Triple::UnknownOS) {
     const std::string MultiarchTriple =
-        getMultiarchTriple(D, getTriple(), D.SysRoot);
-    addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include/" + MultiarchTriple);
+        getMultiarchTriple(D, getTriple(), SysRoot);
+    addSystemInclude(DriverArgs, CC1Args, SysRoot + "/local/include/" + MultiarchTriple);
+    addSystemInclude(DriverArgs, CC1Args, SysRoot + "/local/include");
+    addSystemInclude(DriverArgs, CC1Args, SysRoot + "/include/" + MultiarchTriple);
   }
-  addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include");
+
+  // also add the non-multiarch path, only on a known OS (as above), or when
+  // a sysroot is given, for backwards compatibility with the original driver
+  if (getTriple().getOS() != llvm::Triple::UnknownOS ||
+      !getDriver().SysRoot.empty())
+    addSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
 }
 
 void WebAssembly::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
                                                ArgStringList &CC1Args) const {
+  std::string SysRoot = computeSysRoot();
+
   if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
       !DriverArgs.hasArg(options::OPT_nostdincxx)) {
     if (getTriple().getOS() != llvm::Triple::UnknownOS) {
       const std::string MultiarchTriple =
-          getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
+          getMultiarchTriple(getDriver(), getTriple(), SysRoot);
       addSystemInclude(DriverArgs, CC1Args,
-                       getDriver().SysRoot + "/include/" + MultiarchTriple +
+                       SysRoot + "/include/" + MultiarchTriple +
                            "/c++/v1");
     }
-    addSystemInclude(DriverArgs, CC1Args,
-                     getDriver().SysRoot + "/include/c++/v1");
+
+    // don't include the host architecture's headers in the search path
+    if (!getDriver().SysRoot.empty())
+      addSystemInclude(DriverArgs, CC1Args, SysRoot + "/include/c++/v1");
   }
 }
 
@@ -467,3 +481,15 @@ SanitizerMask WebAssembly::getSupportedSanitizers() const {
 Tool *WebAssembly::buildLinker() const {
   return new tools::wasm::Linker(*this);
 }
+
+std::string WebAssembly::computeSysRoot() const {
+  if (!getDriver().SysRoot.empty())
+    return getDriver().SysRoot;
+
+  std::string Path = "/usr";
+  if (getVFS().exists(Path))
+    return Path;
+
+  return std::string();
+}
+
index a73edce87ece11cc6ba05bf5de82245647e4f724..fe7a428d4196c9ceec6f3e7eac01b95b02f8f83f 100644 (file)
@@ -80,6 +80,8 @@ private:
   std::string getMultiarchTriple(const Driver &D,
                                  const llvm::Triple &TargetTriple,
                                  StringRef SysRoot) const override;
+
+  std::string computeSysRoot() const override;
 };
 
 } // end namespace toolchains