|  | 
| 21 | 21 | #include "llvm/Target/TargetMachine.h" | 
| 22 | 22 | #include "llvm/Target/TargetOptions.h" | 
| 23 | 23 | 
 | 
|  | 24 | +#if LDC_WITH_LLD && LDC_LLVM_VER >= 500 | 
|  | 25 | +#include "lld/Driver/Driver.h" | 
|  | 26 | +#endif | 
|  | 27 | + | 
| 24 | 28 | ////////////////////////////////////////////////////////////////////////////// | 
| 25 | 29 | 
 | 
| 26 | 30 | static llvm::cl::opt<std::string> | 
| @@ -481,7 +485,7 @@ void ArgsBuilder::addTargetFlags() { | 
| 481 | 485 | } | 
| 482 | 486 | 
 | 
| 483 | 487 | ////////////////////////////////////////////////////////////////////////////// | 
| 484 |  | -// (Yet unused) specialization for plain ld. | 
|  | 488 | +// Specialization for plain ld. | 
| 485 | 489 | 
 | 
| 486 | 490 | class LdArgsBuilder : public ArgsBuilder { | 
| 487 | 491 |   void addSanitizers() override {} | 
| @@ -513,6 +517,28 @@ class LdArgsBuilder : public ArgsBuilder { | 
| 513 | 517 | 
 | 
| 514 | 518 | int linkObjToBinaryGcc(llvm::StringRef outputPath, bool useInternalLinker, | 
| 515 | 519 |                        llvm::cl::boolOrDefault fullyStaticFlag) { | 
|  | 520 | +#if LDC_WITH_LLD && LDC_LLVM_VER >= 500 | 
|  | 521 | +  if (useInternalLinker) { | 
|  | 522 | +    LdArgsBuilder argsBuilder; | 
|  | 523 | +    argsBuilder.build(outputPath, fullyStaticFlag); | 
|  | 524 | + | 
|  | 525 | +    const auto fullArgs = | 
|  | 526 | +        getFullArgs("ld.lld", argsBuilder.args, global.params.verbose); | 
|  | 527 | + | 
|  | 528 | +    bool success = false; | 
|  | 529 | +    if (global.params.targetTriple->isOSBinFormatELF()) { | 
|  | 530 | +      success = lld::elf::link(fullArgs, /*CanExitEarly*/ false); | 
|  | 531 | +    } else if (global.params.targetTriple->isOSBinFormatMachO()) { | 
|  | 532 | +      success = lld::mach_o::link(fullArgs); | 
|  | 533 | +    } | 
|  | 534 | + | 
|  | 535 | +    if (!success) | 
|  | 536 | +      error(Loc(), "linking with LLD failed"); | 
|  | 537 | + | 
|  | 538 | +    return success ? 0 : 1; | 
|  | 539 | +  } | 
|  | 540 | +#endif | 
|  | 541 | + | 
| 516 | 542 |   // find gcc for linking | 
| 517 | 543 |   const std::string tool = getGcc(); | 
| 518 | 544 | 
 | 
|  | 
0 commit comments