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 @@ -77,11 +77,12 @@ return s == "i386pe" || s == "i386pep" || s == "thumb2pe" || s == "arm64pe"; } -static bool isPETarget(std::vector &v) { +static bool targetMatches(std::vector &v, + std::function targetFilter) { for (auto it = v.begin(); it + 1 != v.end(); ++it) { if (StringRef(*it) != "-m") continue; - return isPETargetName(*(it + 1)); + return targetFilter(*(it + 1)); } // Expand response files (arguments in the form of @) // to allow detecting the -m argument from arguments in them. @@ -90,7 +91,7 @@ for (auto it = expandedArgs.begin(); it + 1 != expandedArgs.end(); ++it) { if (StringRef(*it) != "-m") continue; - return isPETargetName(*(it + 1)); + return targetFilter(*(it + 1)); } return false; } @@ -129,6 +130,13 @@ return f; } + // Deduce the flavor from the target. + if (targetMatches(v, [](StringRef s) { + return s.contains("linux") || s.contains("elf"); + })) { + return Gnu; + } + // Deduct the flavor from argv[0]. StringRef arg0 = path::filename(v[0]); if (arg0.endswith_lower(".exe")) @@ -152,7 +160,7 @@ std::vector args(argv, argv + argc); switch (parseFlavor(args)) { case Gnu: - if (isPETarget(args)) + if (targetMatches(args, isPETargetName)) return !mingw::link(args, canExitEarly(), llvm::outs(), llvm::errs()); return !elf::link(args, canExitEarly(), llvm::outs(), llvm::errs()); case WinLink: