llvm13/llvm-3.5-detect-hardfloat.patch
Eugene Shatokhin 7b77fc65f5 Sync to 2014.1
2014-12-19 11:29:21 +03:00

92 lines
4.9 KiB
Diff

--- llvm-3.5.0.src/lib/Support/Triple.cpp.detectHardfloat~ 2014-07-18 16:28:19.000000000 +0200
+++ llvm-3.5.0.src/lib/Support/Triple.cpp 2014-09-05 22:24:04.378819536 +0200
@@ -335,8 +335,8 @@ static Triple::OSType parseOS(StringRef
.Default(Triple::UnknownOS);
}
-static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
- return StringSwitch<Triple::EnvironmentType>(EnvironmentName)
+static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName, StringRef ArchName, StringRef VendorName) {
+ Triple::EnvironmentType t = StringSwitch<Triple::EnvironmentType>(EnvironmentName)
.StartsWith("eabihf", Triple::EABIHF)
.StartsWith("eabi", Triple::EABI)
.StartsWith("gnueabihf", Triple::GNUEABIHF)
@@ -349,6 +349,15 @@ static Triple::EnvironmentType parseEnvi
.StartsWith("itanium", Triple::Itanium)
.StartsWith("cygnus", Triple::Cygnus)
.Default(Triple::UnknownEnvironment);
+ if(t == Triple::GNUEABI) {
+ // There's some special cases where -gnueabi actually means
+ // GNUEABIHF, such as
+ // armv7hl-linux-gnueabi (Fedora) and
+ // armv7a-hardfloat-linux-gnueabi (Gentoo)
+ if(ArchName.find('h') != StringRef::npos || VendorName.equals("hardfloat"))
+ return Triple::GNUEABIHF;
+ }
+ return t;
}
static Triple::ObjectFormatType parseFormat(StringRef EnvironmentName) {
@@ -409,7 +418,7 @@ Triple::Triple(const Twine &Str)
SubArch(parseSubArch(getArchName())),
Vendor(parseVendor(getVendorName())),
OS(parseOS(getOSName())),
- Environment(parseEnvironment(getEnvironmentName())),
+ Environment(parseEnvironment(getEnvironmentName(), getArchName(), getVendorName())),
ObjectFormat(parseFormat(getEnvironmentName())) {
if (ObjectFormat == Triple::UnknownObjectFormat)
ObjectFormat = getDefaultFormat(*this);
@@ -444,7 +453,7 @@ Triple::Triple(const Twine &ArchStr, con
SubArch(parseSubArch(ArchStr.str())),
Vendor(parseVendor(VendorStr.str())),
OS(parseOS(OSStr.str())),
- Environment(parseEnvironment(EnvironmentStr.str())),
+ Environment(parseEnvironment(EnvironmentStr.str(), ArchStr.str(), VendorStr.str())),
ObjectFormat(parseFormat(EnvironmentStr.str())) {
if (ObjectFormat == Triple::UnknownObjectFormat)
ObjectFormat = getDefaultFormat(*this);
@@ -471,7 +480,7 @@ std::string Triple::normalize(StringRef
OS = parseOS(Components[2]);
EnvironmentType Environment = UnknownEnvironment;
if (Components.size() > 3)
- Environment = parseEnvironment(Components[3]);
+ Environment = parseEnvironment(Components[3], Components[0], Components[1]);
ObjectFormatType ObjectFormat = UnknownObjectFormat;
if (Components.size() > 4)
ObjectFormat = parseFormat(Components[4]);
@@ -514,7 +523,7 @@ std::string Triple::normalize(StringRef
Valid = OS != UnknownOS;
break;
case 3:
- Environment = parseEnvironment(Comp);
+ Environment = parseEnvironment(Comp, Components[0], Components[1]);
Valid = Environment != UnknownEnvironment;
if (!Valid) {
ObjectFormat = parseFormat(Comp);
--- llvm-3.5.0.src/tools/clang/lib/Driver/Tools.cpp.detectHardfloat~ 2014-09-05 22:22:15.101354343 +0200
+++ llvm-3.5.0.src/tools/clang/lib/Driver/Tools.cpp 2014-09-05 22:22:15.104687701 +0200
@@ -635,7 +635,7 @@ StringRef tools::arm::getARMFloatABI(con
FloatABI = "hard";
break;
case llvm::Triple::GNUEABI:
- FloatABI = "softfp";
+ FloatABI = (Triple.getVendorName().equals("hardfloat") || Triple.getArchName().find('h')!=StringRef::npos) ? "hard" : "softfp";
break;
case llvm::Triple::EABIHF:
FloatABI = "hard";
@@ -7197,13 +7197,13 @@ static StringRef getLinuxDynamicLinker(c
return "/lib/ld-linux-aarch64_be.so.1";
else if (ToolChain.getArch() == llvm::Triple::arm ||
ToolChain.getArch() == llvm::Triple::thumb) {
- if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
+ if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF || (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABI && (ToolChain.getTriple().getVendorName().equals("hardfloat") || ToolChain.getTriple().getArchName().find('h')!=StringRef::npos)))
return "/lib/ld-linux-armhf.so.3";
else
return "/lib/ld-linux.so.3";
} else if (ToolChain.getArch() == llvm::Triple::armeb ||
ToolChain.getArch() == llvm::Triple::thumbeb) {
- if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
+ if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF || (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABI && (ToolChain.getTriple().getVendorName().equals("hardfloat") || ToolChain.getTriple().getArchName().find('h')!=StringRef::npos)))
return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
else
return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */