llvm/0000-clang-mandriva.patch
2016-05-13 22:45:22 +03:00

216 lines
10 KiB
Diff

--- clang/lib/Driver/ToolChains.cpp.mandriva~ 2016-01-13 00:47:59.000000000 +0100
+++ clang/lib/Driver/ToolChains.cpp 2016-01-26 11:16:44.273579956 +0100
@@ -1418,16 +1418,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"};
@@ -1441,7 +1471,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[] = {
@@ -1449,7 +1481,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[] = {"mips-linux-gnu", "mips-mti-linux",
@@ -1471,11 +1511,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",
@@ -3386,6 +3427,9 @@ enum Distro {
UbuntuVivid,
UbuntuWily,
UbuntuXenial,
+ Mandriva,
+ OpenMandriva,
+ ROSA,
UnknownDistro
};
@@ -3403,6 +3447,10 @@ static bool IsUbuntu(enum Distro Distro)
return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
}
+static bool IsMandriva(enum Distro Distro) {
+ return Distro >= Mandriva && Distro < UnknownDistro;
+}
+
static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
llvm::MemoryBuffer::getFile("/etc/lsb-release");
@@ -3411,7 +3459,17 @@ static Distro DetectDistro(const Driver
SmallVector<StringRef, 16> Lines;
Data.split(Lines, "\n");
Distro Version = UnknownDistro;
- for (StringRef Line : Lines)
+ for (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<Distro>(Line.substr(17))
.Case("hardy", UbuntuHardy)
@@ -3432,6 +3490,7 @@ static Distro DetectDistro(const Driver
.Case("wily", UbuntuWily)
.Case("xenial", UbuntuXenial)
.Default(UnknownDistro);
+ }
return Version;
}
@@ -3592,7 +3651,7 @@ static std::string getMultiarchTriple(co
return TargetTriple.str();
}
-static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
+static StringRef getOSLibDir(const enum Distro &Distro, const llvm::Triple &Triple, const ArgList &Args) {
if (isMipsArch(Triple.getArch())) {
// lib32 directory has a special meaning on MIPS targets.
// It contains N32 ABI binaries. Use this folder if produce
@@ -3608,11 +3667,15 @@ 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)
+ if (!IsMandriva(Distro) &&
+ (Triple.getArch() == llvm::Triple::x86 ||
+ Triple.getArch() == llvm::Triple::ppc))
return "lib32";
if (Triple.getArch() == llvm::Triple::x86_64 &&
@@ -3645,7 +3708,7 @@ Linux::Linux(const Driver &D, const llvm
Distro Distro = DetectDistro(D, Arch);
- if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
+ if (IsOpenSUSE(Distro) || IsUbuntu(Distro) || IsMandriva(Distro)) {
ExtraOpts.push_back("-z");
ExtraOpts.push_back("relro");
}
@@ -3665,7 +3728,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");
@@ -3677,12 +3740,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
@@ -3692,7 +3755,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.