File arm-suse-support.patch of Package llvm

Index: tools/clang/lib/Driver/Tools.cpp
===================================================================
--- tools/clang/lib/Driver/Tools.cpp.orig
+++ tools/clang/lib/Driver/Tools.cpp
@@ -611,6 +611,11 @@ static StringRef getARMFloatABI(const Dr
     }
 
     case llvm::Triple::Linux: {
+      StringRef ArchName = getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
+      if (Triple.getEnvironment() == llvm::Triple::GNUEABIHF || ArchName.startswith("v7")) {
+        FloatABI = "hard";
+        break;
+      } else
       if (Triple.getEnvironment() == llvm::Triple::GNUEABI) {
         FloatABI = "softfp";
         break;
@@ -623,6 +627,9 @@ static StringRef getARMFloatABI(const Dr
       case llvm::Triple::GNUEABI:
         FloatABI = "softfp";
         break;
+      case llvm::Triple::GNUEABIHF:
+        FloatABI = "hard";
+        break;
       case llvm::Triple::EABI:
         // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
         FloatABI = "softfp";
@@ -665,6 +672,7 @@ void Clang::AddARMTargetArgs(const ArgLi
     // Select the default based on the platform.
     switch(Triple.getEnvironment()) {
     case llvm::Triple::ANDROIDEABI:
+    case llvm::Triple::GNUEABIHF:
     case llvm::Triple::GNUEABI:
       ABIName = "aapcs-linux";
       break;
@@ -730,10 +738,11 @@ void Clang::AddARMTargetArgs(const ArgLi
 
   // Setting -msoft-float effectively disables NEON because of the GCC
   // implementation, although the same isn't true of VFP or VFP3.
-  if (FloatABI == "soft") {
+//  if (FloatABI == "soft") {
+// we do not use neon on suse so far, disabling it always to avoid incompatible ABI
     CmdArgs.push_back("-target-feature");
     CmdArgs.push_back("-neon");
-  }
+//  }
 
   // Kernel code has more strict alignment requirements.
   if (KernelOrKext) {
@@ -5062,8 +5071,9 @@ void linuxtools::Assemble::ConstructJob(
     CmdArgs.push_back("-many");
   } else if (getToolChain().getArch() == llvm::Triple::arm) {
     StringRef MArch = getToolChain().getArchName();
-    if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
-      CmdArgs.push_back("-mfpu=neon");
+// we do not use neon on suse so far, disabling it always to avoid incompatible ABI
+//    if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
+//      CmdArgs.push_back("-mfpu=neon");
   } else if (getToolChain().getArch() == llvm::Triple::mips ||
              getToolChain().getArch() == llvm::Triple::mipsel ||
              getToolChain().getArch() == llvm::Triple::mips64 ||
Index: tools/clang/lib/Driver/ToolChains.cpp
===================================================================
--- tools/clang/lib/Driver/ToolChains.cpp.orig
+++ tools/clang/lib/Driver/ToolChains.cpp
@@ -1185,6 +1185,9 @@ Generic_GCC::GCCInstallationDetector::GC
   static const char *const ARMLibDirs[] = { "/lib" };
   static const char *const ARMTriples[] = {
     "arm-linux-gnueabi",
+    "armv5el-suse-linux-gnueabi",
+    "armv7hl-suse-linux-gnueabi",
+    "armv7hl-suse-linux-gnueabihf",
     "arm-linux-androideabi"
   };
 
openSUSE Build Service is sponsored by