aboutsummaryrefslogtreecommitdiff
path: root/tools/lld/lld.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lld/lld.cpp')
-rw-r--r--tools/lld/lld.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/tools/lld/lld.cpp b/tools/lld/lld.cpp
index 09f8079010d4..64e9aea25e39 100644
--- a/tools/lld/lld.cpp
+++ b/tools/lld/lld.cpp
@@ -16,7 +16,7 @@
//
//===----------------------------------------------------------------------===//
-#include "lld/Driver/Driver.h"
+#include "lld/Common/Driver.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
@@ -34,6 +34,7 @@ enum Flavor {
Gnu, // -flavor gnu
WinLink, // -flavor link
Darwin, // -flavor darwin
+ Wasm, // -flavor wasm
};
LLVM_ATTRIBUTE_NORETURN static void die(const Twine &S) {
@@ -44,11 +45,22 @@ LLVM_ATTRIBUTE_NORETURN static void die(const Twine &S) {
static Flavor getFlavor(StringRef S) {
return StringSwitch<Flavor>(S)
.CasesLower("ld", "ld.lld", "gnu", Gnu)
+ .CasesLower("wasm", "ld-wasm", Wasm)
.CaseLower("link", WinLink)
- .CaseLower("darwin", Darwin)
+ .CasesLower("ld64", "ld64.lld", "darwin", Darwin)
.Default(Invalid);
}
+static bool isPETarget(const std::vector<const char *> &V) {
+ for (auto It = V.begin(); It + 1 != V.end(); ++It) {
+ if (StringRef(*It) != "-m")
+ continue;
+ StringRef S = *(It + 1);
+ return S == "i386pe" || S == "i386pep" || S == "thumb2pe" || S == "arm64pe";
+ }
+ return false;
+}
+
static Flavor parseProgname(StringRef Progname) {
#if __APPLE__
// Use Darwin driver for "ld" on Darwin.
@@ -101,11 +113,15 @@ int main(int Argc, const char **Argv) {
std::vector<const char *> Args(Argv, Argv + Argc);
switch (parseFlavor(Args)) {
case Gnu:
+ if (isPETarget(Args))
+ return !mingw::link(Args);
return !elf::link(Args, true);
case WinLink:
- return !coff::link(Args);
+ return !coff::link(Args, true);
case Darwin:
return !mach_o::link(Args);
+ case Wasm:
+ return !wasm::link(Args, true);
default:
die("lld is a generic driver.\n"
"Invoke ld.lld (Unix), ld (macOS) or lld-link (Windows) instead.");