Skip to content

Commit 2bb1740

Browse files
committed
Integrate LLD for ELF and Mach-O targets too
Requires LLD 5.0, otherwise LDC aborts due to conflicting command-line options.
1 parent 91ed27c commit 2bb1740

File tree

3 files changed

+50
-4
lines changed

3 files changed

+50
-4
lines changed

CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ endif()
2020
#
2121

2222
find_package(LLVM 3.5 REQUIRED
23-
all-targets analysis asmparser asmprinter bitreader bitwriter codegen core debuginfocodeview debuginfodwarf debuginfomsf debuginfopdb globalisel instcombine ipa ipo instrumentation irreader libdriver linker lto mc mcdisassembler mcparser objcarcopts object option profiledata scalaropts selectiondag support tablegen target transformutils vectorize ${EXTRA_LLVM_MODULES})
23+
all-targets analysis asmparser asmprinter bitreader bitwriter codegen core debuginfocodeview debuginfodwarf debuginfomsf debuginfopdb globalisel instcombine ipa ipo instrumentation irreader libdriver linker lto mc mcdisassembler mcparser objcarcopts object option passes profiledata scalaropts selectiondag support tablegen target transformutils vectorize ${EXTRA_LLVM_MODULES})
2424
math(EXPR LDC_LLVM_VER ${LLVM_VERSION_MAJOR}*100+${LLVM_VERSION_MINOR})
2525
# Remove LLVMTableGen library from list of libraries
2626
string(REGEX MATCH "^-.*LLVMTableGen[^;]*;|;-.*LLVMTableGen[^;]*" LLVM_TABLEGEN_LIBRARY "${LLVM_LIBRARIES}")
@@ -572,9 +572,9 @@ add_custom_target(${LDMD_EXE} ALL DEPENDS ${LDMD_EXE_FULL})
572572
set(LDC_LINKERFLAG_LIST "${SANITIZE_LDFLAGS};${LLVM_LIBRARIES};${LLVM_LDFLAGS}")
573573
if(LDC_WITH_LLD)
574574
if(MSVC)
575-
list(APPEND LDC_LINKERFLAG_LIST lldCOFF.lib lldCore.lib lldDriver.lib)
575+
list(APPEND LDC_LINKERFLAG_LIST lldDriver.lib lldCOFF.lib lldELF.lib lldMachO.lib lldYAML.lib lldReaderWriter.lib lldConfig.lib lldCore.lib)
576576
else()
577-
set(LDC_LINKERFLAG_LIST "-llldCOFF;-llldCore;-llldDriver;${LDC_LINKERFLAG_LIST}")
577+
set(LDC_LINKERFLAG_LIST "-llldDriver;-llldCOFF;-llldELF;-llldMachO;-llldYAML;-llldReaderWriter;-llldConfig;-llldCore;${LDC_LINKERFLAG_LIST}")
578578
endif()
579579
endif()
580580

driver/cl_options-llvm.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,18 @@ std::string getFeaturesStr() {
100100
}
101101
#endif // LDC_LLVM_VER < 307
102102
}
103+
104+
#if LDC_WITH_LLD && LDC_LLVM_VER >= 500
105+
// LLD 5.0 uses the shared header too (for LTO) and exposes some wrappers in
106+
// the lld namespace. Define them here to prevent the LLD object from being
107+
// linked in with its conflicting command-line options.
108+
namespace lld {
109+
TargetOptions InitTargetOptionsFromCodeGenFlags() {
110+
return ::InitTargetOptionsFromCodeGenFlags();
111+
}
112+
113+
CodeModel::Model GetCodeModelFromCMModel() {
114+
return CMModel;
115+
}
116+
}
117+
#endif // LDC_WITH_LLD && LDC_LLVM_VER >= 500

driver/linker-gcc.cpp

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
#include "llvm/Target/TargetMachine.h"
2121
#include "llvm/Target/TargetOptions.h"
2222

23+
#if LDC_WITH_LLD
24+
#include "lld/Driver/Driver.h"
25+
#endif
26+
2327
//////////////////////////////////////////////////////////////////////////////
2428

2529
static llvm::cl::opt<std::string>
@@ -398,7 +402,7 @@ void ArgsBuilder::addArch() {
398402
}
399403

400404
//////////////////////////////////////////////////////////////////////////////
401-
// (Yet unused) specialization for plain ld.
405+
// Specialization for plain ld.
402406

403407
class LdArgsBuilder : public ArgsBuilder {
404408
void addSanitizers() override {}
@@ -430,6 +434,33 @@ class LdArgsBuilder : public ArgsBuilder {
430434

431435
int linkObjToBinaryGcc(llvm::StringRef outputPath, bool useInternalLinker,
432436
llvm::cl::boolOrDefault fullyStaticFlag) {
437+
#if LDC_WITH_LLD
438+
if (useInternalLinker) {
439+
LdArgsBuilder argsBuilder;
440+
argsBuilder.build(outputPath, fullyStaticFlag);
441+
442+
const auto fullArgs =
443+
getFullArgs("ld.lld", argsBuilder.args, global.params.verbose);
444+
445+
bool success = false;
446+
if (global.params.targetTriple->isOSBinFormatELF()) {
447+
success = lld::elf::link(fullArgs
448+
#if LDC_LLVM_VER >= 400
449+
,
450+
false // CanExitEarly
451+
#endif
452+
);
453+
} else if (global.params.targetTriple->isOSBinFormatMachO()) {
454+
success = lld::mach_o::link(fullArgs);
455+
}
456+
457+
if (!success)
458+
error(Loc(), "linking with LLD failed");
459+
460+
return success ? 0 : 1;
461+
}
462+
#endif
463+
433464
// find gcc for linking
434465
const std::string tool = getGcc();
435466

0 commit comments

Comments
 (0)