aboutsummaryrefslogtreecommitdiff
path: root/tools/lld
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lld')
-rw-r--r--tools/lld/CMakeLists.txt7
-rw-r--r--tools/lld/lld.cpp22
2 files changed, 24 insertions, 5 deletions
diff --git a/tools/lld/CMakeLists.txt b/tools/lld/CMakeLists.txt
index 2df10697ff66..d8829493fc22 100644
--- a/tools/lld/CMakeLists.txt
+++ b/tools/lld/CMakeLists.txt
@@ -7,16 +7,19 @@ add_lld_tool(lld
)
target_link_libraries(lld
- lldDriver
+ PRIVATE
lldCOFF
+ lldDriver
lldELF
+ lldMinGW
+ lldWasm
)
install(TARGETS lld
RUNTIME DESTINATION bin)
if(NOT LLD_SYMLINKS_TO_CREATE)
- set(LLD_SYMLINKS_TO_CREATE lld-link ld.lld)
+ set(LLD_SYMLINKS_TO_CREATE lld-link ld.lld ld64.lld wasm-ld)
endif()
foreach(link ${LLD_SYMLINKS_TO_CREATE})
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.");