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" };