blob: f8e4d2bdb629fedcfdfead9889acdeafb12786e4 [file] [log] [blame]
From 882d3b0428073001897e65cb95405ae31bc643fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin@martin.st>
Date: Fri, 18 Jun 2021 22:59:58 +0300
Subject: [PATCH] [llvm-rc] Don't rewrite the arch in the default triple unless
necessary
When the default target arch isn't one that is supported as a
windows target, we want to set a suitable architecture (so that
Clang tests that run plain 'llvm-windres' succeed checks for e.g.
"#ifdef _WIN32"). But if the default target architecture is
usable, don't rewrite it. (Rewriting it, by e.g.
"T.setArch(T.getArch())", normalizes the spelling of the architecture,
e.g. changing i686 to i386. Such a change can make clang unable
to find the right sysroot.)
This can't, unfortunately, practically be tested very well because
it is entirely dependent on the default triple of the llvm build.
---
tools/llvm-rc/llvm-rc.cpp | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/tools/llvm-rc/llvm-rc.cpp b/tools/llvm-rc/llvm-rc.cpp
index 8a4ef95cfabd..b45c7a07309e 100644
--- a/tools/llvm-rc/llvm-rc.cpp
+++ b/tools/llvm-rc/llvm-rc.cpp
@@ -145,7 +145,7 @@ ErrorOr<std::string> findClang(const char *Argv0) {
return Path;
}
-Triple::ArchType getDefaultArch(Triple::ArchType Arch) {
+bool isUsableDefaultArch(Triple::ArchType Arch) {
switch (Arch) {
case Triple::x86:
case Triple::x86_64:
@@ -154,17 +154,23 @@ Triple::ArchType getDefaultArch(Triple::ArchType Arch) {
case Triple::aarch64:
// These work properly with the clang driver, setting the expected
// defines such as _WIN32 etc.
- return Arch;
+ return true;
default:
// Other archs aren't set up for use with windows as target OS, (clang
- // doesn't define e.g. _WIN32 etc), so set a reasonable default arch.
- return Triple::x86_64;
+ // doesn't define e.g. _WIN32 etc), so with them we need to set a
+ // different default arch.
+ return false;
}
}
+Triple::ArchType getDefaultFallbackArch() {
+ return Triple::x86_64;
+}
+
std::string getClangClTriple() {
Triple T(sys::getDefaultTargetTriple());
- T.setArch(getDefaultArch(T.getArch()));
+ if (!isUsableDefaultArch(T.getArch()))
+ T.setArch(getDefaultFallbackArch());
T.setOS(Triple::Win32);
T.setVendor(Triple::PC);
T.setEnvironment(Triple::MSVC);
@@ -174,7 +180,8 @@ std::string getClangClTriple() {
std::string getMingwTriple() {
Triple T(sys::getDefaultTargetTriple());
- T.setArch(getDefaultArch(T.getArch()));
+ if (!isUsableDefaultArch(T.getArch()))
+ T.setArch(getDefaultFallbackArch());
if (T.isWindowsGNUEnvironment())
return T.str();
// Write out the literal form of the vendor/env here, instead of
--
2.25.1