Index: llvm-toolchain-snapshot_19~++20240220124703+f122268c0441/clang/lib/Driver/ToolChains/WebAssembly.cpp =================================================================== --- llvm-toolchain-snapshot_19~++20240220124703+f122268c0441.orig/clang/lib/Driver/ToolChains/WebAssembly.cpp +++ llvm-toolchain-snapshot_19~++20240220124703+f122268c0441/clang/lib/Driver/ToolChains/WebAssembly.cpp @@ -200,7 +200,7 @@ WebAssembly::WebAssembly(const Driver &D 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 @@ -426,6 +426,7 @@ void WebAssembly::AddClangSystemIncludeA return; const Driver &D = getDriver(); + std::string SysRoot = computeSysRoot(); if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) { SmallString<128> P(D.ResourceDir); @@ -449,12 +450,20 @@ void WebAssembly::AddClangSystemIncludeA 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, @@ -505,6 +514,17 @@ 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(); +} + void WebAssembly::addLibCxxIncludePaths( const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const { @@ -515,18 +535,22 @@ void WebAssembly::addLibCxxIncludePaths( getMultiarchTriple(D, getTriple(), SysRoot); bool IsKnownOs = (getTriple().getOS() != llvm::Triple::UnknownOS); - std::string Version = detectLibcxxVersion(LibPath); - if (Version.empty()) - return; - // First add the per-target include path if the OS is known. if (IsKnownOs) { - std::string TargetDir = LibPath + "/" + MultiarchTriple + "/c++/" + Version; - addSystemInclude(DriverArgs, CC1Args, TargetDir); + std::string Version = detectLibcxxVersion(LibPath + "/" + MultiarchTriple); + if (!Version.empty()) { + std::string TargetDir = LibPath + "/" + MultiarchTriple + "/c++/" + Version; + addSystemInclude(DriverArgs, CC1Args, TargetDir); + } } // Second add the generic one. - addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version); + // don't include the host architecture's headers in the search path + if (!getDriver().SysRoot.empty()) { + std::string Version = detectLibcxxVersion(LibPath); + if (!Version.empty()) + addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version); + } } void WebAssembly::addLibStdCXXIncludePaths( @@ -573,8 +597,11 @@ void WebAssembly::addLibStdCXXIncludePat addSystemInclude(DriverArgs, CC1Args, TargetDir); } - // Second add the generic one. - addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version); - // Third the backward one. - addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version + "/backward"); + // don't include the host architecture's headers in the search path + if (!getDriver().SysRoot.empty()) { + // Second add the generic one. + addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version); + // Third the backward one. + addSystemInclude(DriverArgs, CC1Args, LibPath + "/c++/" + Version + "/backward"); + } } Index: llvm-toolchain-snapshot_19~++20240220124703+f122268c0441/clang/lib/Driver/ToolChains/WebAssembly.h =================================================================== --- llvm-toolchain-snapshot_19~++20240220124703+f122268c0441.orig/clang/lib/Driver/ToolChains/WebAssembly.h +++ llvm-toolchain-snapshot_19~++20240220124703+f122268c0441/clang/lib/Driver/ToolChains/WebAssembly.h @@ -88,6 +88,8 @@ private: llvm::opt::ArgStringList &CC1Args) const; void addLibStdCXXIncludePaths(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const; + + std::string computeSysRoot() const override; }; } // end namespace toolchains