Skip to content

Commit a7095ca

Browse files
committed
Integrate LLD 6.0.0+ for ELF and Mach-O targets
LLD 5.0.0+ would work too, but as there's a new lldCommon library for LLD 6.0.0 (and no more lldConfig), simply require 6.0.0+ to keep the CMake setup reasonably simple.
1 parent 00ba0d9 commit a7095ca

File tree

3 files changed

+48
-12
lines changed

3 files changed

+48
-12
lines changed

CMakeLists.txt

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -449,14 +449,20 @@ if(NOT DEFINED LDC_WITH_LLD)
449449
endif()
450450
unset(CMAKE_REQUIRED_FLAGS)
451451
unset(CMAKE_REQUIRED_INCLUDES)
452+
# translate 1/0 to ON/OFF
453+
if(LDC_WITH_LLD)
454+
set(LDC_WITH_LLD ON)
455+
else()
456+
set(LDC_WITH_LLD OFF)
457+
endif()
452458
else()
453459
set(LDC_WITH_LLD OFF)
454460
endif()
455461
endif()
456462
if(LDC_WITH_LLD)
457-
message(STATUS "Building LDC with LLD support")
458463
append("-DLDC_WITH_LLD" LDC_CXXFLAGS)
459464
endif()
465+
message(STATUS "Building LDC with integrated LLD: ${LDC_WITH_LLD} (LDC_WITH_LLD=${LDC_WITH_LLD})")
460466

461467
#
462468
# Enable building with riscv-llvm, for full RISC-V support.
@@ -560,21 +566,23 @@ add_custom_target(${LDMD_EXE} ALL DEPENDS ${LDMD_EXE_FULL})
560566

561567
# Figure out how to link the main LDC executable, for which we need to take the
562568
# LLVM flags into account.
563-
set(LDC_LINKERFLAG_LIST "${SANITIZE_LDFLAGS};${LLVM_LIBRARIES};${LLVM_LDFLAGS}")
569+
set(LDC_LINKERFLAG_LIST ${SANITIZE_LDFLAGS} ${LLVM_LIBRARIES} ${LLVM_LDFLAGS})
564570
if(LDC_WITH_LLD)
571+
# ELF and Mach-O formats supported since LLD 6.0.0, otherwise just Windows COFF
565572
if(NOT (LDC_LLVM_VER LESS 600))
566573
if(MSVC)
567-
list(APPEND LDC_LINKERFLAG_LIST lldCOFF.lib lldCommon.lib lldCore.lib lldDriver.lib)
568-
elseif(APPLE)
569-
set(LDC_LINKERFLAG_LIST "-llldCOFF;-llldCommon;-llldCore;-llldDriver;${LDC_LINKERFLAG_LIST};-lxml2")
574+
set(LDC_LINKERFLAG_LIST lldDriver.lib lldCOFF.lib lldELF.lib lldMachO.lib lldYAML.lib lldReaderWriter.lib lldCommon.lib lldCore.lib ${LDC_LINKERFLAG_LIST})
570575
else()
571-
set(LDC_LINKERFLAG_LIST "-llldCOFF;-llldCommon;-llldCore;-llldDriver;${LDC_LINKERFLAG_LIST}")
576+
set(LDC_LINKERFLAG_LIST -llldDriver -llldCOFF -llldELF -llldMachO -llldYAML -llldReaderWriter -llldCommon -llldCore ${LDC_LINKERFLAG_LIST})
577+
endif()
578+
if(APPLE) # bug, should be fixed in LLVM 6.0.1
579+
list(APPEND LDC_LINKERFLAG_LIST -lxml2)
572580
endif()
573581
else()
574582
if(MSVC)
575-
list(APPEND LDC_LINKERFLAG_LIST lldCOFF.lib lldCore.lib lldDriver.lib)
583+
set(LDC_LINKERFLAG_LIST lldCOFF.lib lldCore.lib lldDriver.lib ${LDC_LINKERFLAG_LIST})
576584
else()
577-
set(LDC_LINKERFLAG_LIST "-llldCOFF;-llldCore;-llldDriver;${LDC_LINKERFLAG_LIST}")
585+
set(LDC_LINKERFLAG_LIST -llldCOFF -llldCore -llldDriver ${LDC_LINKERFLAG_LIST})
578586
endif()
579587
endif()
580588
endif()
@@ -593,7 +601,7 @@ if(LDC_ENABLE_PLUGINS)
593601
set(LDC_LINKERFLAG_LIST "${LDC_LINKERFLAG_LIST};-Wl,--export-dynamic")
594602
endif()
595603
endif()
596-
message(STATUS "Building LDC with plugin support ${LDC_ENABLE_PLUGINS} (LDC_ENABLE_PLUGINS=${LDC_ENABLE_PLUGINS})")
604+
message(STATUS "Building LDC with plugin support: ${LDC_ENABLE_PLUGINS} (LDC_ENABLE_PLUGINS=${LDC_ENABLE_PLUGINS})")
597605

598606
set(LDC_LINK_MANUALLY OFF)
599607
if(UNIX AND (CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")))

driver/linker-gcc.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
#include "llvm/Target/TargetMachine.h"
2424
#include "llvm/Target/TargetOptions.h"
2525

26+
#if LDC_WITH_LLD && LDC_LLVM_VER >= 600
27+
#include "lld/Common/Driver.h"
28+
#endif
29+
2630
//////////////////////////////////////////////////////////////////////////////
2731

2832
static llvm::cl::opt<std::string>
@@ -594,7 +598,7 @@ void ArgsBuilder::addTargetFlags() {
594598
}
595599

596600
//////////////////////////////////////////////////////////////////////////////
597-
// (Yet unused) specialization for plain ld.
601+
// Specialization for plain ld.
598602

599603
class LdArgsBuilder : public ArgsBuilder {
600604
void addSanitizers(const llvm::Triple &triple) override {}
@@ -628,6 +632,30 @@ class LdArgsBuilder : public ArgsBuilder {
628632

629633
int linkObjToBinaryGcc(llvm::StringRef outputPath, bool useInternalLinker,
630634
llvm::cl::boolOrDefault fullyStaticFlag) {
635+
#if LDC_WITH_LLD && LDC_LLVM_VER >= 600
636+
if (useInternalLinker) {
637+
LdArgsBuilder argsBuilder;
638+
argsBuilder.build(outputPath, fullyStaticFlag);
639+
640+
const auto fullArgs =
641+
getFullArgs("ld.lld", argsBuilder.args, global.params.verbose);
642+
643+
bool success = false;
644+
if (global.params.targetTriple->isOSBinFormatELF()) {
645+
success = lld::elf::link(fullArgs, /*CanExitEarly*/ false);
646+
} else if (global.params.targetTriple->isOSBinFormatMachO()) {
647+
success = lld::mach_o::link(fullArgs);
648+
} else {
649+
error(Loc(), "unknown target binary format for internal linking");
650+
}
651+
652+
if (!success)
653+
error(Loc(), "linking with LLD failed");
654+
655+
return success ? 0 : 1;
656+
}
657+
#endif
658+
631659
// find gcc for linking
632660
const std::string tool = getGcc();
633661

runtime/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,9 @@ endif()
255255
# The installed config file doesn't use SHARED_LIBS_RPATH.
256256
if(NOT ${BUILD_SHARED_LIBS} STREQUAL "OFF")
257257
if(MULTILIB AND NOT "${TARGET_SYSTEM}" MATCHES "APPLE")
258-
set(SHARED_LIBS_RPATH "\n \"-L-Wl,-rpath,${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}:${CMAKE_BINARY_DIR}/lib${MULTILIB_SUFFIX}\",")
258+
set(SHARED_LIBS_RPATH "\n \"-L-rpath\", \"-L${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}:${CMAKE_BINARY_DIR}/lib${MULTILIB_SUFFIX}\",")
259259
else()
260-
set(SHARED_LIBS_RPATH "\n \"-L-Wl,-rpath,${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}\",")
260+
set(SHARED_LIBS_RPATH "\n \"-L-rpath\", \"-L${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}\",")
261261
endif()
262262
endif()
263263

0 commit comments

Comments
 (0)