diff --git a/lld/test/MinGW/driver.test b/lld/test/MinGW/driver.test --- a/lld/test/MinGW/driver.test +++ b/lld/test/MinGW/driver.test @@ -246,6 +246,7 @@ VERSION: LLD {{.*}} (compatible with GNU linkers) RUN: ld.lld -m i386pep --help 2>&1 | FileCheck -check-prefix=HELP %s +RUN: ld.lld -fallback-gnu-driver mingw --help 2>&1 | FileCheck -check-prefix=HELP %s HELP: USAGE: HELP: --enable-auto-import diff --git a/lld/tools/lld/lld.cpp b/lld/tools/lld/lld.cpp --- a/lld/tools/lld/lld.cpp +++ b/lld/tools/lld/lld.cpp @@ -78,7 +78,33 @@ return s == "i386pe" || s == "i386pep" || s == "thumb2pe" || s == "arm64pe"; } +enum GnuDriver { MinGWDriver, ELFDriver, InvalidDriver }; + +static GnuDriver getDriver(StringRef s) { + return StringSwitch(s) + .CaseLower("elf", ELFDriver) + .CaseLower("mingw", MinGWDriver) + .Default(InvalidDriver); +} + static bool isPETarget(std::vector &v) { + GnuDriver fallbackDriver = +#ifdef LLD_DEFAULT_LD_LLD_IS_MINGW + MinGWDriver; +#else + ELFDriver; +#endif + + // Parse -fallback-gnu-driver option. + if (v.size() > 1 && v[1] == StringRef("-fallback-gnu-driver")) { + if (v.size() <= 2) + die("missing arg value for '-fallback-gnu-driver'"); + fallbackDriver = getDriver(v[2]); + if (fallbackDriver == InvalidDriver) + die("Unknown fallback gnu driver: " + StringRef(v[2])); + v.erase(v.begin() + 1, v.begin() + 3); + } + for (auto it = v.begin(); it + 1 != v.end(); ++it) { if (StringRef(*it) != "-m") continue; @@ -96,11 +122,7 @@ return isPETargetName(*(it + 1)); } -#ifdef LLD_DEFAULT_LD_LLD_IS_MINGW - return true; -#else - return false; -#endif + return fallbackDriver == MinGWDriver; } static Flavor parseProgname(StringRef progname) {