diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index cb6a9b242421..b8d31690d1af 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -2314,6 +2314,10 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( Prefixes.push_back("/opt/rh/devtoolset-2/root/usr"); } + if (TargetTriple.getVendor() == llvm::Triple::Rosa) { + Prefixes.push_back(concat(SysRoot, "/system")); + } + // Fall back to /usr which is used by most non-Solaris systems. Prefixes.push_back(concat(SysRoot, "/usr")); } diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index d525b417b4ea..2b93f401733e 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -302,6 +302,7 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) const bool IsHexagon = Arch == llvm::Triple::hexagon; const bool IsRISCV = Triple.isRISCV(); const bool IsCSKY = Triple.isCSKY(); + const bool IsRosa = Triple.getVendor() == llvm::Triple::Rosa; if (IsCSKY && !SelectedMultilibs.empty()) SysRoot = SysRoot + SelectedMultilibs.back().osSuffix(); @@ -341,8 +342,12 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) // used. We need add both libo32 and /lib. if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel) { Generic_GCC::AddMultilibPaths(D, SysRoot, "libo32", MultiarchTriple, Paths); - addPathIfExists(D, concat(SysRoot, "/libo32"), Paths); - addPathIfExists(D, concat(SysRoot, "/usr/libo32"), Paths); + if (!IsRosa) { + addPathIfExists(D, concat(SysRoot, "/libo32"), Paths); + addPathIfExists(D, concat(SysRoot, "/usr/libo32"), Paths); + } else { + addPathIfExists(D, concat(SysRoot, "/system/libo32"), Paths); + } } Generic_GCC::AddMultilibPaths(D, SysRoot, OSLibDir, MultiarchTriple, Paths); @@ -360,18 +365,30 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) Paths); } - addPathIfExists(D, concat(SysRoot, "/usr/lib", MultiarchTriple), Paths); - addPathIfExists(D, concat(SysRoot, "/usr", OSLibDir), Paths); + if (!IsRosa) { + addPathIfExists(D, concat(SysRoot, "/usr/lib", MultiarchTriple), Paths); + addPathIfExists(D, concat(SysRoot, "/usr", OSLibDir), Paths); + } else { + addPathIfExists(D, concat(SysRoot, "/system/lib", MultiarchTriple), Paths); + addPathIfExists(D, concat(SysRoot, "/system", OSLibDir), Paths); + } if (IsRISCV) { StringRef ABIName = tools::riscv::getRISCVABI(Args, Triple); addPathIfExists(D, concat(SysRoot, "/", OSLibDir, ABIName), Paths); - addPathIfExists(D, concat(SysRoot, "/usr", OSLibDir, ABIName), Paths); + if (!IsRosa) + addPathIfExists(D, concat(SysRoot, "/usr", OSLibDir, ABIName), Paths); + else + addPathIfExists(D, concat(SysRoot, "/system", OSLibDir, ABIName), Paths); } Generic_GCC::AddMultiarchPaths(D, SysRoot, OSLibDir, Paths); - addPathIfExists(D, concat(SysRoot, "/lib"), Paths); - addPathIfExists(D, concat(SysRoot, "/usr/lib"), Paths); + if (!IsRosa) { + addPathIfExists(D, concat(SysRoot, "/lib"), Paths); + addPathIfExists(D, concat(SysRoot, "/usr/lib"), Paths); + } else { + addPathIfExists(D, concat(SysRoot, "/system/lib"), Paths); + } } ToolChain::RuntimeLibType Linux::GetDefaultRuntimeLibType() const { @@ -572,6 +589,9 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const { return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker"; } if (Triple.isMusl()) { + if (Triple.getVendor() == llvm::Triple::Rosa) + return "/system/bin/linker"; + std::string ArchName; bool IsArm = false;