diff options
Diffstat (limited to 'tools/lld')
-rw-r--r-- | tools/lld/CMakeLists.txt | 7 | ||||
-rw-r--r-- | tools/lld/lld.cpp | 22 |
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."); |