--- clang/lib/Driver/ToolChains.cpp.mandriva~ 2015-06-26 20:37:15.000000000 +0200 +++ clang/lib/Driver/ToolChains.cpp 2015-06-27 14:05:15.223881344 +0200 @@ -1265,16 +1265,46 @@ bool Generic_GCC::GCCInstallationDetecto static const char *const AArch64LibDirs[] = {"/lib64", "/lib"}; static const char *const AArch64Triples[] = { "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android", - "aarch64-redhat-linux"}; - static const char *const AArch64beLibDirs[] = {"/lib"}; - static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu", - "aarch64_be-linux-gnu"}; + "aarch64-redhat-linux", "aarch64-mandriva-linux-gnu", + "aarch64-openmandriva-linux-gnu", "aarch64-openmandriva-linux-musl"}; + static const char *const AArch64beLibDirs[] = {"/lib64", "/lib"}; + static const char *const AArch64beTriples[] = { + "aarch64_be-none-linux-gnu", "aarch64_be-linux-gnu", + "aarch64_be-linux-android", "aarch64_be-mandriva-linux-gnu", + "aarch64_be-openmandriva-linux-gnu", "aarch64_be-openmandriva-linux-musl" + }; static const char *const ARMLibDirs[] = {"/lib"}; static const char *const ARMTriples[] = {"arm-linux-gnueabi", - "arm-linux-androideabi"}; - static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf", - "armv7hl-redhat-linux-gnueabi"}; + "arm-linux-androideabi", + "arm-mandriva-linux-gnueabi", + "arm-openmandriva-linux-gnueabi", + "arm-openmandriva-linux-musl", + "arm-openmandriva-linux-musleabi", + "armv6-mandriva-linux-gnueabi", + "armv6-openmandriva-linux-gnueabi", + "armv7-mandriva-linux-gnueabi", + "armv7-openmandriva-linux-gnueabi", + "armv7-openmandriva-linux-musleabi"}; + static const char *const ARMHFTriples[] = { + "arm-linux-gnueabihf", + "armv7hl-redhat-linux-gnueabi", + "arm-mandriva-linux-gnueabihf", + "arm-openmandriva-linux-gnueabihf", + "arm-openmandriva-linux-musleabihf", + "armv7hl-openmandriva-linux-gnueabi", + "armv7hl-openmandriva-linux-gnueabihf", + "armv7hnl-openmandriva-linux-gnueabi", + "armv7hnl-openmandriva-linux-musleabi", + "armv7nl-openmandriva-linux-gnueabihf", + "armv7nl-openmandriva-linux-musleabihf", + "armv6hl-openmandriva-linux-gnueabi", + "armv6hl-openmandriva-linux-gnueabihf", + "armv6hnl-openmandriva-linux-gnueabi", + "armv6hnl-openmandriva-linux-musleabi", + "armv6nl-openmandriva-linux-gnueabihf", + "armv6nl-openmandriva-linux-musleabihf" + }; static const char *const ARMebLibDirs[] = {"/lib"}; static const char *const ARMebTriples[] = {"armeb-linux-gnueabi", "armeb-linux-androideabi"}; @@ -1288,7 +1318,9 @@ bool 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-linux-android", - "x86_64-unknown-linux"}; + "x86_64-unknown-linux", "x86_64-mandriva-linux-gnu", + "x86_64-openmandriva-linux-gnu", + "x86_64-openmandriva-linux-musl"}; static const char *const X32LibDirs[] = {"/libx32"}; static const char *const X86LibDirs[] = {"/lib32", "/lib"}; static const char *const X86Triples[] = { @@ -1296,7 +1328,15 @@ bool Generic_GCC::GCCInstallationDetecto "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux", "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux", "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android", - "i586-linux-gnu"}; + "i586-linux-gnu", "i586-mandriva-linux", "i586-mandriva-linux-gnu", + "i686-mandriva-linux", "i686-mandriva-linux-gnu", + "i586-openmandriva-linux", + "i586-openmandriva-linux-gnu", + "i586-openmandriva-linux-musl", + "i686-openmandriva-linux", + "i686-openmandriva-linux-gnu", + "i686-openmandriva-linux-musl" + }; static const char *const MIPSLibDirs[] = {"/lib"}; static const char *const MIPSTriples[] = { @@ -1317,11 +1357,12 @@ bool Generic_GCC::GCCInstallationDetecto static const char *const PPCLibDirs[] = {"/lib32", "/lib"}; static const char *const PPCTriples[] = { "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe", - "powerpc-suse-linux", "powerpc-montavista-linuxspe"}; + "powerpc-suse-linux", "powerpc-montavista-linuxspe", + "powerpc-mandriva-linux-gnu"}; static const char *const PPC64LibDirs[] = {"/lib64", "/lib"}; static const char *const PPC64Triples[] = { "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu", - "powerpc64-suse-linux", "ppc64-redhat-linux"}; + "powerpc64-suse-linux", "ppc64-redhat-linux", "powerpc64-mandriva-linux"}; static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"}; static const char *const PPC64LETriples[] = { "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu", @@ -2864,6 +2905,9 @@ enum Distro { UbuntuUtopic, UbuntuVivid, UbuntuWily, + Mandriva, + OpenMandriva, + ROSA, UnknownDistro }; @@ -2881,6 +2925,10 @@ static bool IsUbuntu(enum Distro Distro) return Distro >= UbuntuHardy && Distro <= UbuntuWily; } +static bool IsMandriva(enum Distro Distro) { + return Distro >= Mandriva && Distro <= ROSA; +} + static Distro DetectDistro(llvm::Triple::ArchType Arch) { llvm::ErrorOr> File = llvm::MemoryBuffer::getFile("/etc/lsb-release"); @@ -2889,7 +2937,17 @@ static Distro DetectDistro(llvm::Triple: SmallVector Lines; Data.split(Lines, "\n"); Distro Version = UnknownDistro; - for (const StringRef Line : Lines) + for (const StringRef Line : Lines) { + if (Version == UnknownDistro && Line.startswith("DISTRIB_ID=MandrivaLinux")) + // It's either Mandriva or a close derivate, will get details + // from DISTRIB_DESCRIPTION + Version = Mandriva; + if (Version == Mandriva && Line.startswith("DISTRIB_DESCRIPTION=")) { + if(Line.substr(20).find("ROSA") != StringRef::npos) + Version = ROSA; + else if(Line.substr(20).find("Open") != StringRef::npos) + Version = OpenMandriva; + } if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME=")) Version = llvm::StringSwitch(Line.substr(17)) .Case("hardy", UbuntuHardy) @@ -2908,6 +2966,7 @@ static Distro DetectDistro(llvm::Triple: .Case("vivid", UbuntuVivid) .Case("wily", UbuntuWily) .Default(UnknownDistro); + } return Version; } @@ -3083,11 +3142,16 @@ static StringRef getOSLibDir(const llvm: // with a 'lib32' library search path being considered. So we only enable // them when we know we may need it. // + // Also, lib32 is highly distro-specific -- OpenMandriva for one doesn't + // use lib32 (64 bit libs go to lib64, 32 bit libs go to lib) + // // 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) + Distro Distro = DetectDistro(Triple.getArch()); + if (!IsMandriva(Distro) && + (Triple.getArch() == llvm::Triple::x86 || + Triple.getArch() == llvm::Triple::ppc)) return "lib32"; if (Triple.getArch() == llvm::Triple::x86_64 && @@ -3121,7 +3185,7 @@ Linux::Linux(const Driver &D, const llvm Distro Distro = DetectDistro(Arch); - if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) { + if (IsOpenSUSE(Distro) || IsUbuntu(Distro) || IsMandriva(Distro)) { ExtraOpts.push_back("-z"); ExtraOpts.push_back("relro"); } @@ -3141,7 +3205,7 @@ Linux::Linux(const Driver &D, const llvm // ABI requires a mapping between the GOT and the symbol table. // Android loader does not support .gnu.hash. if (!IsMips && !IsAndroid) { - if (IsRedhat(Distro) || IsOpenSUSE(Distro) || + if (IsRedhat(Distro) || IsOpenSUSE(Distro) || IsMandriva(Distro) || (IsUbuntu(Distro) && Distro >= UbuntuMaverick)) ExtraOpts.push_back("--hash-style=gnu"); @@ -3153,12 +3217,12 @@ Linux::Linux(const Driver &D, const llvm if (IsRedhat(Distro)) ExtraOpts.push_back("--no-add-needed"); - if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) || + if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) || IsMandriva(Distro) || (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) || (IsUbuntu(Distro) && Distro >= UbuntuKarmic)) ExtraOpts.push_back("--build-id"); - if (IsOpenSUSE(Distro)) + if (IsOpenSUSE(Distro) || IsMandriva(Distro)) ExtraOpts.push_back("--enable-new-dtags"); // The selection of paths to try here is designed to match the patterns which