diff -up llvm-project-release-10.x/clang/include/clang/Driver/Distro.h.1~ llvm-project-release-10.x/clang/include/clang/Driver/Distro.h --- llvm-project-release-10.x/clang/include/clang/Driver/Distro.h.1~ 2020-02-03 15:05:29.000000000 +0100 +++ llvm-project-release-10.x/clang/include/clang/Driver/Distro.h 2020-02-03 15:55:08.167087633 +0100 @@ -67,6 +67,8 @@ public: UbuntuDisco, UbuntuEoan, UbuntuFocal, + OpenMandriva, + ROSA, UnknownDistro }; @@ -131,6 +133,10 @@ public: return DistroVal == Gentoo; } + bool IsMandriva() const { + return DistroVal == OpenMandriva || DistroVal == ROSA; + } + /// @} }; diff -up llvm-project-release-10.x/clang/lib/Driver/Distro.cpp.1~ llvm-project-release-10.x/clang/lib/Driver/Distro.cpp --- llvm-project-release-10.x/clang/lib/Driver/Distro.cpp.1~ 2020-02-03 15:05:29.000000000 +0100 +++ llvm-project-release-10.x/clang/lib/Driver/Distro.cpp 2020-02-03 15:56:38.882091633 +0100 @@ -42,7 +42,7 @@ static Distro::DistroType DetectDistro(l SmallVector Lines; Data.split(Lines, "\n"); Distro::DistroType Version = Distro::UnknownDistro; - for (StringRef Line : Lines) + for (StringRef Line : Lines) { if (Version == Distro::UnknownDistro && Line.startswith("DISTRIB_CODENAME=")) Version = llvm::StringSwitch(Line.substr(17)) .Case("hardy", Distro::UbuntuHardy) @@ -71,6 +71,18 @@ static Distro::DistroType DetectDistro(l .Case("eoan", Distro::UbuntuEoan) .Case("focal", Distro::UbuntuFocal) .Default(Distro::UnknownDistro); + + else if (Version == Distro::UnknownDistro && Line.startswith("DISTRIB_ID=MandrivaLinux")) + // It's a Mandriva derivate -- will get details + // from DISTRIB_DESCRIPTION + Version = Distro::OpenMandriva; + else if (Version == Distro::OpenMandriva && Line.startswith("DISTRIB_DESCRIPTION=")) { + if (Line.substr(20).find("ROSA") != StringRef::npos) + Version = Distro::ROSA; + else + Version = Distro::OpenMandriva; + } + } if (Version != Distro::UnknownDistro) return Version; } diff -up llvm-project-release-10.x/clang/lib/Driver/ToolChains/Gnu.cpp.1~ llvm-project-release-10.x/clang/lib/Driver/ToolChains/Gnu.cpp --- llvm-project-release-10.x/clang/lib/Driver/ToolChains/Gnu.cpp.1~ 2020-02-03 15:05:29.000000000 +0100 +++ llvm-project-release-10.x/clang/lib/Driver/ToolChains/Gnu.cpp 2020-02-03 15:52:26.515080505 +0100 @@ -1997,7 +1997,10 @@ void Generic_GCC::GCCInstallationDetecto static const char *const AArch64LibDirs[] = {"/lib64", "/lib"}; static const char *const AArch64Triples[] = { "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux", - "aarch64-suse-linux", "aarch64-linux-android"}; + "aarch64-suse-linux", "aarch64-linux-android", "aarch64-mandriva-linux-gnu", + "aarch64-openmandriva-linux-gnu", "aarch64-openmandriva-linux-musl" + "aarch64-rosa-linux-gnu", "aarch64-rosa-linux-musl" + }; static const char *const AArch64beLibDirs[] = {"/lib"}; static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu", "aarch64_be-linux-gnu"}; @@ -2008,7 +2011,40 @@ void Generic_GCC::GCCInstallationDetecto static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf", "armv7hl-redhat-linux-gnueabi", "armv6hl-suse-linux-gnueabi", - "armv7hl-suse-linux-gnueabi"}; + "armv7hl-suse-linux-gnueabi" + "arm-mandriva-linux-gnueabihf", + "armv7l-mandriva-linux-gnueabihf", + "armv7hl-mandriva-linux-gnueabihf", + "armv7hnl-mandriva-linux-gnueabihf", + "armv8l-mandriva-linux-gnueabihf", + "armv8hl-mandriva-linux-gnueabihf", + "armv8hnl-mandriva-linux-gnueabihf", + "armv8hcnl-mandriva-linux-gnueabihf", + "arm-mandriva-linux-musleabihf", + "armv7l-mandriva-linux-musleabihf", + "armv7hl-mandriva-linux-musleabihf", + "armv7hnl-mandriva-linux-musleabihf", + "armv8l-mandriva-linux-musleabihf", + "armv8hl-mandriva-linux-musleabihf", + "armv8hnl-mandriva-linux-musleabihf", + "armv8hcnl-mandriva-linux-musleabihf", + "arm-openmandriva-linux-gnueabihf", + "armv7l-openmandriva-linux-gnueabihf", + "armv7hl-openmandriva-linux-gnueabihf", + "armv7hnl-openmandriva-linux-gnueabihf", + "armv8l-openmandriva-linux-gnueabihf", + "armv8hl-openmandriva-linux-gnueabihf", + "armv8hnl-openmandriva-linux-gnueabihf", + "armv8hcnl-openmandriva-linux-gnueabihf", + "arm-openmandriva-linux-musleabihf", + "armv7l-openmandriva-linux-musleabihf", + "armv7hl-openmandriva-linux-musleabihf", + "armv7hnl-openmandriva-linux-musleabihf", + "armv8l-openmandriva-linux-musleabihf", + "armv8hl-openmandriva-linux-musleabihf", + "armv8hnl-openmandriva-linux-musleabihf", + "armv8hcnl-openmandriva-linux-musleabihf", + }; static const char *const ARMebLibDirs[] = {"/lib"}; static const char *const ARMebTriples[] = {"armeb-linux-gnueabi", "armeb-linux-androideabi"}; @@ -2025,7 +2061,11 @@ void Generic_GCC::GCCInstallationDetecto "x86_64-redhat-linux", "x86_64-suse-linux", "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", "x86_64-slackware-linux", "x86_64-unknown-linux", - "x86_64-amazon-linux", "x86_64-linux-android"}; + "x86_64-amazon-linux", "x86_64-linux-android" + "x86_64-mandriva-linux-gnu", "x86_64-mandriva-linux-musl", + "x86_64-openmandriva-linux-gnu", "x86_64-openmandriva-linux-musl", + "x86_64-openmandriva-linux-gnux32", "x86_64-openmandriva-linux-muslx32" + }; static const char *const X32LibDirs[] = {"/libx32"}; static const char *const X86LibDirs[] = {"/lib32", "/lib"}; static const char *const X86Triples[] = { @@ -2034,7 +2074,12 @@ void Generic_GCC::GCCInstallationDetecto "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux", "i486-slackware-linux", "i686-montavista-linux", "i586-linux-gnu", "i686-linux-android", "i386-gnu", "i486-gnu", - "i586-gnu", "i686-gnu"}; + "i586-gnu", "i686-gnu" + "i586-mandriva-linux-gnu", "i586-openmandriva-linux-gnu", + "i586-mandriva-linux-musl", "i586-openmandriva-linux-musl", + "i686-mandriva-linux-gnu", "i686-openmandriva-linux-gnu", + "i686-mandriva-linux-musl", "i686-openmandriva-linux-musl" + }; static const char *const MIPSLibDirs[] = {"/lib"}; static const char *const MIPSTriples[] = { diff -up llvm-project-release-10.x/clang/lib/Driver/ToolChains/Linux.cpp.1~ llvm-project-release-10.x/clang/lib/Driver/ToolChains/Linux.cpp --- llvm-project-release-10.x/clang/lib/Driver/ToolChains/Linux.cpp.1~ 2020-02-03 15:05:29.000000000 +0100 +++ llvm-project-release-10.x/clang/lib/Driver/ToolChains/Linux.cpp 2020-02-03 15:52:26.515080505 +0100 @@ -166,7 +166,7 @@ std::string Linux::getMultiarchTriple(co return TargetTriple.str(); } -static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) { +static StringRef getOSLibDir(const Distro &distro, const llvm::Triple &Triple, const ArgList &Args) { if (Triple.isMIPS()) { if (Triple.isAndroid()) { StringRef CPUName; @@ -194,12 +194,18 @@ static StringRef getOSLibDir(const llvm: // FIXME: This is a bit of a hack. We should really unify this code for // reasoning about oslibdir spellings with the lib dir spellings in the // GCCInstallationDetector, but that is a more significant refactoring. - if (Triple.getArch() == llvm::Triple::x86 || - Triple.getArch() == llvm::Triple::ppc) + // + // lib32 is distro specific -- we don't do it on OpenMandriva, where 64bit + // goes to lib64 and 32bit goes to lib + + if (!distro.IsMandriva() && + (Triple.getArch() == llvm::Triple::x86 || + Triple.getArch() == llvm::Triple::ppc)) return "lib32"; if (Triple.getArch() == llvm::Triple::x86_64 && - Triple.getEnvironment() == llvm::Triple::GNUX32) + (Triple.getEnvironment() == llvm::Triple::GNUX32 || + Triple.getEnvironment() == llvm::Triple::MuslX32)) return "libx32"; if (Triple.getArch() == llvm::Triple::riscv32) @@ -248,7 +254,7 @@ Linux::Linux(const Driver &D, const llvm } if (Distro.IsOpenSUSE() || Distro.IsUbuntu() || Distro.IsAlpineLinux() || - Triple.isAndroid()) { + Distro.IsMandriva() || Triple.isAndroid()) { ExtraOpts.push_back("-z"); ExtraOpts.push_back("relro"); } @@ -289,6 +295,7 @@ Linux::Linux(const Driver &D, const llvm // Hexagon linker/loader does not support .gnu.hash if (!IsMips && !IsHexagon) { if (Distro.IsRedhat() || Distro.IsOpenSUSE() || Distro.IsAlpineLinux() || + Distro.IsMandriva() || (Distro.IsUbuntu() && Distro >= Distro::UbuntuMaverick) || (IsAndroid && !Triple.isAndroidVersionLT(23))) ExtraOpts.push_back("--hash-style=gnu"); @@ -304,7 +311,7 @@ Linux::Linux(const Driver &D, const llvm ExtraOpts.push_back("--build-id"); #endif - if (IsAndroid || Distro.IsOpenSUSE()) + if (IsAndroid || Distro.IsOpenSUSE() || Distro.IsMandriva()) ExtraOpts.push_back("--enable-new-dtags"); // The selection of paths to try here is designed to match the patterns which @@ -314,7 +321,7 @@ Linux::Linux(const Driver &D, const llvm // to the link paths. path_list &Paths = getFilePaths(); - const std::string OSLibDir = getOSLibDir(Triple, Args); + const std::string OSLibDir = getOSLibDir(Distro, Triple, Args); const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot); // Add the multilib suffixed paths where they are available.