65 lines
2.2 KiB
Diff
65 lines
2.2 KiB
Diff
From c6bd154add332d11db005c62d30fc99430495d4c Mon Sep 17 00:00:00 2001
|
|
From: jeremyd2019 <github@jdrake.com>
|
|
Date: Thu, 10 Apr 2025 14:20:10 -0700
|
|
Subject: [PATCH] [LLD] [MinGW] Fall back to using default target if no -m flag
|
|
given. (#134700)
|
|
|
|
On Cygwin at least, GCC is not passing any -m flag to the linker, so
|
|
fall back to the default target triple to determine if we need to apply
|
|
i386-specific behaviors.
|
|
|
|
Fixes #134558
|
|
---
|
|
lld/MinGW/Driver.cpp | 14 ++++++++++++--
|
|
1 file changed, 12 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/lld/MinGW/Driver.cpp b/lld/MinGW/Driver.cpp
|
|
index bda272b64b..46c8d3c471 100644
|
|
--- a/lld/MinGW/Driver.cpp
|
|
+++ b/lld/MinGW/Driver.cpp
|
|
@@ -172,6 +172,14 @@ static std::string searchLibrary(StringRef name,
|
|
return "";
|
|
}
|
|
|
|
+static bool isI386Target(const opt::InputArgList &args,
|
|
+ const Triple &defaultTarget) {
|
|
+ auto *a = args.getLastArg(OPT_m);
|
|
+ if (a)
|
|
+ return StringRef(a->getValue()) == "i386pe";
|
|
+ return defaultTarget.getArch() == Triple::x86;
|
|
+}
|
|
+
|
|
namespace lld {
|
|
namespace coff {
|
|
bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
|
|
@@ -217,6 +225,8 @@ bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
|
|
return false;
|
|
}
|
|
|
|
+ Triple defaultTarget(Triple::normalize(sys::getDefaultTargetTriple()));
|
|
+
|
|
std::vector<std::string> linkArgs;
|
|
auto add = [&](const Twine &s) { linkArgs.push_back(s.str()); };
|
|
|
|
@@ -225,7 +235,7 @@ bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
|
|
|
|
if (auto *a = args.getLastArg(OPT_entry)) {
|
|
StringRef s = a->getValue();
|
|
- if (args.getLastArgValue(OPT_m) == "i386pe" && s.starts_with("_"))
|
|
+ if (isI386Target(args, defaultTarget) && s.starts_with("_"))
|
|
add("-entry:" + s.substr(1));
|
|
else if (!s.empty())
|
|
add("-entry:" + s);
|
|
@@ -522,7 +532,7 @@ bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
|
|
for (auto *a : args.filtered(OPT_Xlink))
|
|
add(a->getValue());
|
|
|
|
- if (args.getLastArgValue(OPT_m) == "i386pe")
|
|
+ if (isI386Target(args, defaultTarget))
|
|
add("-alternatename:__image_base__=___ImageBase");
|
|
else
|
|
add("-alternatename:__image_base__=__ImageBase");
|
|
--
|
|
2.50.1.windows.1
|
|
|