|  | 
| 20 | 20 | #include "llvm/Target/TargetMachine.h" | 
| 21 | 21 | #include "llvm/Target/TargetOptions.h" | 
| 22 | 22 | 
 | 
|  | 23 | +#if LDC_WITH_LLD | 
|  | 24 | +#include "lld/Driver/Driver.h" | 
|  | 25 | +#endif | 
|  | 26 | + | 
| 23 | 27 | ////////////////////////////////////////////////////////////////////////////// | 
| 24 | 28 | 
 | 
| 25 | 29 | static llvm::cl::opt<std::string> | 
| @@ -398,7 +402,7 @@ void ArgsBuilder::addArch() { | 
| 398 | 402 | } | 
| 399 | 403 | 
 | 
| 400 | 404 | ////////////////////////////////////////////////////////////////////////////// | 
| 401 |  | -// (Yet unused) specialization for plain ld. | 
|  | 405 | +// Specialization for plain ld. | 
| 402 | 406 | 
 | 
| 403 | 407 | class LdArgsBuilder : public ArgsBuilder { | 
| 404 | 408 |   void addSanitizers() override {} | 
| @@ -430,6 +434,33 @@ class LdArgsBuilder : public ArgsBuilder { | 
| 430 | 434 | 
 | 
| 431 | 435 | int linkObjToBinaryGcc(llvm::StringRef outputPath, bool useInternalLinker, | 
| 432 | 436 |                        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 | + | 
| 433 | 464 |   // find gcc for linking | 
| 434 | 465 |   const std::string tool = getGcc(); | 
| 435 | 466 | 
 | 
|  | 
0 commit comments