Hi,
the attached patch adds support for OpenMandriva and Linux distributions
derived from it (Mandriva, ROSA).

It adds a couple of compiler triplets, distribution detection code and
proper defaults.

ttyl
bero
--- clang/lib/Driver/ToolChains.cpp.orig	2014-02-28 16:44:32.163725792 +0100
+++ clang/lib/Driver/ToolChains.cpp	2014-02-28 17:36:02.182529287 +0100
@@ -1297,12 +1297,26 @@ bool Generic_GCC::GCCInstallationDetecto
   // lifetime or initialization issues.
   static const char *const AArch64LibDirs[] = { "/lib" };
   static const char *const AArch64Triples[] = { "aarch64-none-linux-gnu",
-                                                "aarch64-linux-gnu" };
+                                                "aarch64-linux-gnu",
+                                                "aarch64-mandriva-linux-gnu" };
 
   static const char *const ARMLibDirs[] = { "/lib" };
   static const char *const ARMTriples[] = { "arm-linux-gnueabi",
-                                            "arm-linux-androideabi" };
+                                            "arm-linux-androideabi",
+                                            "arm-mandriva-linux-gnueabi",
+                                            "arm-mandriva-linux-androideabi",
+                                            "armv6-mandriva-linux-gnueabi",
+                                            "armv6-mandriva-linux-androideabi",
+                                            "armv7-mandriva-linux-gnueabi",
+                                            "armv7-mandriva-linux-androideabi" };
   static const char *const ARMHFTriples[] = { "arm-linux-gnueabihf",
+                                              "arm-mandriva-linux-gnueabihf",
+					      "armv6-mandriva-linux-gnueabihf",
+					      "armv6hl-mandriva-linux-gnueabi",
+					      "armv6hl-mandriva-linux-gnueabihf",
+					      "armv7-mandriva-linux-gnueabihf",
+					      "armv7hl-mandriva-linux-gnueabi",
+					      "armv7hl-mandriva-linux-gnueabihf",
                                               "armv7hl-redhat-linux-gnueabi" };
 
   static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
@@ -1310,11 +1324,12 @@ bool Generic_GCC::GCCInstallationDetecto
     "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", "x86_64-pc-linux-gnu",
     "x86_64-redhat-linux6E", "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-linux-android", "x86_64-mandriva-linux-gnu"
   };
   static const char *const X86LibDirs[] = { "/lib32", "/lib" };
   static const char *const X86Triples[] = {
     "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu", "i386-linux-gnu",
+    "i586-mandriva-linux-gnu", "i686-mandriva-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"
@@ -1338,12 +1353,13 @@ 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",
+                                              "powerpc64-mandriva-linux",
                                               "ppc64-redhat-linux" };
   static const char *const PPC64LELibDirs[] = { "/lib64", "/lib" };
   static const char *const PPC64LETriples[] = { "powerpc64le-linux-gnu",
@@ -2647,6 +2663,9 @@ enum Distro {
   UbuntuRaring,
   UbuntuSaucy,
   UbuntuTrusty,
+  Mandriva,
+  OpenMandriva,
+  ROSA,
   UnknownDistro
 };
 
@@ -2666,6 +2685,10 @@ static bool IsUbuntu(enum Distro Distro)
   return Distro >= UbuntuHardy && Distro <= UbuntuTrusty;
 }
 
+static bool IsMandriva(enum Distro Distro) {
+  return Distro >= Mandriva && Distro <= ROSA;
+}
+
 static Distro DetectDistro(llvm::Triple::ArchType Arch) {
   OwningPtr<llvm::MemoryBuffer> File;
   if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
@@ -2673,7 +2696,15 @@ static Distro DetectDistro(llvm::Triple:
     SmallVector<StringRef, 8> Lines;
     Data.split(Lines, "\n");
     Distro Version = UnknownDistro;
-    for (unsigned i = 0, s = Lines.size(); i != s; ++i)
+    for (unsigned i = 0, s = Lines.size(); i != s; ++i) {
+      if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_ID=MandrivaLinux"))
+        Version = Mandriva; // It's either Mandriva or a close derivate, will get details from DISTRIB_DESCRIPTION
+      if (Version == Mandriva && Lines[i].startswith("DISTRIB_DESCRIPTION=")) {
+        if(Lines[i].substr(20).find("ROSA") != StringRef::npos)
+          Version = ROSA;
+        else if(Lines[i].substr(20).find("Open") != StringRef::npos)
+          Version = OpenMandriva;
+      }
       if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
         Version = llvm::StringSwitch<Distro>(Lines[i].substr(17))
           .Case("hardy", UbuntuHardy)
@@ -2690,6 +2721,7 @@ static Distro DetectDistro(llvm::Triple:
           .Case("saucy", UbuntuSaucy)
           .Case("trusty", UbuntuTrusty)
           .Default(UnknownDistro);
+    }
     return Version;
   }
 
@@ -2821,11 +2853,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.
   //
+  // And of course lib32 is highly distro-specific -- OpenMandriva for one doesn't
+  // use lib32.
+  //
   // 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";
 
   return Triple.isArch32Bit() ? "lib" : "lib64";
@@ -2854,7 +2891,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");
   }
@@ -2874,7 +2911,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");
 
@@ -2887,12 +2924,12 @@ Linux::Linux(const Driver &D, const llvm
     ExtraOpts.push_back("--no-add-needed");
 
   if (Distro == DebianSqueeze || Distro == DebianWheezy ||
-      Distro == DebianJessie || IsOpenSUSE(Distro) ||
+      Distro == DebianJessie || 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
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to