1 //===- lib/Driver/DarwinLdDriver.cpp --------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// 11 /// Concrete instance of the Driver for darwin's ld. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #include "lld/Common/Args.h" 16 #include "lld/Common/ErrorHandler.h" 17 #include "lld/Common/LLVM.h" 18 #include "lld/Core/ArchiveLibraryFile.h" 19 #include "lld/Core/Error.h" 20 #include "lld/Core/File.h" 21 #include "lld/Core/Instrumentation.h" 22 #include "lld/Core/LinkingContext.h" 23 #include "lld/Core/Node.h" 24 #include "lld/Core/PassManager.h" 25 #include "lld/Core/Resolver.h" 26 #include "lld/Core/SharedLibraryFile.h" 27 #include "lld/Core/Simple.h" 28 #include "lld/ReaderWriter/MachOLinkingContext.h" 29 #include "llvm/ADT/ArrayRef.h" 30 #include "llvm/ADT/Optional.h" 31 #include "llvm/ADT/STLExtras.h" 32 #include "llvm/ADT/SmallString.h" 33 #include "llvm/ADT/StringExtras.h" 34 #include "llvm/ADT/StringRef.h" 35 #include "llvm/ADT/Twine.h" 36 #include "llvm/BinaryFormat/MachO.h" 37 #include "llvm/Option/Arg.h" 38 #include "llvm/Option/ArgList.h" 39 #include "llvm/Option/OptTable.h" 40 #include "llvm/Option/Option.h" 41 #include "llvm/Support/Casting.h" 42 #include "llvm/Support/CommandLine.h" 43 #include "llvm/Support/Error.h" 44 #include "llvm/Support/ErrorOr.h" 45 #include "llvm/Support/Format.h" 46 #include "llvm/Support/MathExtras.h" 47 #include "llvm/Support/MemoryBuffer.h" 48 #include "llvm/Support/Path.h" 49 #include "llvm/Support/raw_ostream.h" 50 #include <algorithm> 51 #include <cstdint> 52 #include <memory> 53 #include <string> 54 #include <system_error> 55 #include <utility> 56 #include <vector> 57 58 using namespace lld; 59 60 namespace { 61 62 // Create enum with OPT_xxx values for each option in DarwinLdOptions.td 63 enum { 64 OPT_INVALID = 0, 65 #define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ 66 HELP, META, VALUES) \ 67 OPT_##ID, 68 #include "DarwinLdOptions.inc" 69 #undef OPTION 70 }; 71 72 // Create prefix string literals used in DarwinLdOptions.td 73 #define PREFIX(NAME, VALUE) const char *const NAME[] = VALUE; 74 #include "DarwinLdOptions.inc" 75 #undef PREFIX 76 77 // Create table mapping all options defined in DarwinLdOptions.td 78 static const llvm::opt::OptTable::Info InfoTable[] = { 79 #define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ 80 HELPTEXT, METAVAR, VALUES) \ 81 {PREFIX, NAME, HELPTEXT, \ 82 METAVAR, OPT_##ID, llvm::opt::Option::KIND##Class, \ 83 PARAM, FLAGS, OPT_##GROUP, \ 84 OPT_##ALIAS, ALIASARGS, VALUES}, 85 #include "DarwinLdOptions.inc" 86 #undef OPTION 87 }; 88 89 // Create OptTable class for parsing actual command line arguments 90 class DarwinLdOptTable : public llvm::opt::OptTable { 91 public: 92 DarwinLdOptTable() : OptTable(InfoTable) {} 93 }; 94 95 static std::vector<std::unique_ptr<File>> 96 makeErrorFile(StringRef path, std::error_code ec) { 97 std::vector<std::unique_ptr<File>> result; 98 result.push_back(std::make_unique<ErrorFile>(path, ec)); 99 return result; 100 } 101 102 static std::vector<std::unique_ptr<File>> 103 parseMemberFiles(std::unique_ptr<File> file) { 104 std::vector<std::unique_ptr<File>> members; 105 if (auto *archive = dyn_cast<ArchiveLibraryFile>(file.get())) { 106 if (std::error_code ec = archive->parseAllMembers(members)) 107 return makeErrorFile(file->path(), ec); 108 } else { 109 members.push_back(std::move(file)); 110 } 111 return members; 112 } 113 114 std::vector<std::unique_ptr<File>> loadFile(MachOLinkingContext &ctx, 115 StringRef path, bool wholeArchive, 116 bool upwardDylib) { 117 if (ctx.logInputFiles()) 118 message(path); 119 120 ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr = ctx.getMemoryBuffer(path); 121 if (std::error_code ec = mbOrErr.getError()) 122 return makeErrorFile(path, ec); 123 ErrorOr<std::unique_ptr<File>> fileOrErr = 124 ctx.registry().loadFile(std::move(mbOrErr.get())); 125 if (std::error_code ec = fileOrErr.getError()) 126 return makeErrorFile(path, ec); 127 std::unique_ptr<File> &file = fileOrErr.get(); 128 129 // If file is a dylib, inform LinkingContext about it. 130 if (SharedLibraryFile *shl = dyn_cast<SharedLibraryFile>(file.get())) { 131 if (std::error_code ec = shl->parse()) 132 return makeErrorFile(path, ec); 133 ctx.registerDylib(reinterpret_cast<mach_o::MachODylibFile *>(shl), 134 upwardDylib); 135 } 136 if (wholeArchive) 137 return parseMemberFiles(std::move(file)); 138 std::vector<std::unique_ptr<File>> files; 139 files.push_back(std::move(file)); 140 return files; 141 } 142 143 } // end anonymous namespace 144 145 // Test may be running on Windows. Canonicalize the path 146 // separator to '/' to get consistent outputs for tests. 147 static std::string canonicalizePath(StringRef path) { 148 char sep = llvm::sys::path::get_separator().front(); 149 if (sep != '/') { 150 std::string fixedPath = std::string(path); 151 std::replace(fixedPath.begin(), fixedPath.end(), sep, '/'); 152 return fixedPath; 153 } else { 154 return std::string(path); 155 } 156 } 157 158 static void addFile(StringRef path, MachOLinkingContext &ctx, 159 bool loadWholeArchive, bool upwardDylib) { 160 std::vector<std::unique_ptr<File>> files = 161 loadFile(ctx, path, loadWholeArchive, upwardDylib); 162 for (std::unique_ptr<File> &file : files) 163 ctx.getNodes().push_back(std::make_unique<FileNode>(std::move(file))); 164 } 165 166 // Export lists are one symbol per line. Blank lines are ignored. 167 // Trailing comments start with #. 168 static std::error_code parseExportsList(StringRef exportFilePath, 169 MachOLinkingContext &ctx) { 170 // Map in export list file. 171 ErrorOr<std::unique_ptr<MemoryBuffer>> mb = 172 MemoryBuffer::getFileOrSTDIN(exportFilePath); 173 if (std::error_code ec = mb.getError()) 174 return ec; 175 ctx.addInputFileDependency(exportFilePath); 176 StringRef buffer = mb->get()->getBuffer(); 177 while (!buffer.empty()) { 178 // Split off each line in the file. 179 std::pair<StringRef, StringRef> lineAndRest = buffer.split('\n'); 180 StringRef line = lineAndRest.first; 181 // Ignore trailing # comments. 182 std::pair<StringRef, StringRef> symAndComment = line.split('#'); 183 StringRef sym = symAndComment.first.trim(); 184 if (!sym.empty()) 185 ctx.addExportSymbol(sym); 186 buffer = lineAndRest.second; 187 } 188 return std::error_code(); 189 } 190 191 /// Order files are one symbol per line. Blank lines are ignored. 192 /// Trailing comments start with #. Symbol names can be prefixed with an 193 /// architecture name and/or .o leaf name. Examples: 194 /// _foo 195 /// bar.o:_bar 196 /// libfrob.a(bar.o):_bar 197 /// x86_64:_foo64 198 static std::error_code parseOrderFile(StringRef orderFilePath, 199 MachOLinkingContext &ctx) { 200 // Map in order file. 201 ErrorOr<std::unique_ptr<MemoryBuffer>> mb = 202 MemoryBuffer::getFileOrSTDIN(orderFilePath); 203 if (std::error_code ec = mb.getError()) 204 return ec; 205 ctx.addInputFileDependency(orderFilePath); 206 StringRef buffer = mb->get()->getBuffer(); 207 while (!buffer.empty()) { 208 // Split off each line in the file. 209 std::pair<StringRef, StringRef> lineAndRest = buffer.split('\n'); 210 StringRef line = lineAndRest.first; 211 buffer = lineAndRest.second; 212 // Ignore trailing # comments. 213 std::pair<StringRef, StringRef> symAndComment = line.split('#'); 214 if (symAndComment.first.empty()) 215 continue; 216 StringRef sym = symAndComment.first.trim(); 217 if (sym.empty()) 218 continue; 219 // Check for prefix. 220 StringRef prefix; 221 std::pair<StringRef, StringRef> prefixAndSym = sym.split(':'); 222 if (!prefixAndSym.second.empty()) { 223 sym = prefixAndSym.second; 224 prefix = prefixAndSym.first; 225 if (!prefix.endswith(".o") && !prefix.endswith(".o)")) { 226 // If arch name prefix does not match arch being linked, ignore symbol. 227 if (!ctx.archName().equals(prefix)) 228 continue; 229 prefix = ""; 230 } 231 } else 232 sym = prefixAndSym.first; 233 if (!sym.empty()) { 234 ctx.appendOrderedSymbol(sym, prefix); 235 // llvm::errs() << sym << ", prefix=" << prefix << "\n"; 236 } 237 } 238 return std::error_code(); 239 } 240 241 // 242 // There are two variants of the -filelist option: 243 // 244 // -filelist <path> 245 // In this variant, the path is to a text file which contains one file path 246 // per line. There are no comments or trimming of whitespace. 247 // 248 // -fileList <path>,<dir> 249 // In this variant, the path is to a text file which contains a partial path 250 // per line. The <dir> prefix is prepended to each partial path. 251 // 252 static llvm::Error loadFileList(StringRef fileListPath, 253 MachOLinkingContext &ctx, bool forceLoad) { 254 // If there is a comma, split off <dir>. 255 std::pair<StringRef, StringRef> opt = fileListPath.split(','); 256 StringRef filePath = opt.first; 257 StringRef dirName = opt.second; 258 ctx.addInputFileDependency(filePath); 259 // Map in file list file. 260 ErrorOr<std::unique_ptr<MemoryBuffer>> mb = 261 MemoryBuffer::getFileOrSTDIN(filePath); 262 if (std::error_code ec = mb.getError()) 263 return llvm::errorCodeToError(ec); 264 StringRef buffer = mb->get()->getBuffer(); 265 while (!buffer.empty()) { 266 // Split off each line in the file. 267 std::pair<StringRef, StringRef> lineAndRest = buffer.split('\n'); 268 StringRef line = lineAndRest.first; 269 StringRef path; 270 if (!dirName.empty()) { 271 // If there is a <dir> then prepend dir to each line. 272 SmallString<256> fullPath; 273 fullPath.assign(dirName); 274 llvm::sys::path::append(fullPath, Twine(line)); 275 path = ctx.copy(fullPath.str()); 276 } else { 277 // No <dir> use whole line as input file path. 278 path = ctx.copy(line); 279 } 280 if (!ctx.pathExists(path)) { 281 return llvm::make_error<GenericError>(Twine("File not found '") 282 + path 283 + "'"); 284 } 285 if (ctx.testingFileUsage()) { 286 message("Found filelist entry " + canonicalizePath(path)); 287 } 288 addFile(path, ctx, forceLoad, false); 289 buffer = lineAndRest.second; 290 } 291 return llvm::Error::success(); 292 } 293 294 /// Parse number assuming it is base 16, but allow 0x prefix. 295 static bool parseNumberBase16(StringRef numStr, uint64_t &baseAddress) { 296 if (numStr.startswith_lower("0x")) 297 numStr = numStr.drop_front(2); 298 return numStr.getAsInteger(16, baseAddress); 299 } 300 301 static void parseLLVMOptions(const LinkingContext &ctx) { 302 // Honor -mllvm 303 if (!ctx.llvmOptions().empty()) { 304 unsigned numArgs = ctx.llvmOptions().size(); 305 auto **args = new const char *[numArgs + 2]; 306 args[0] = "lld (LLVM option parsing)"; 307 for (unsigned i = 0; i != numArgs; ++i) 308 args[i + 1] = ctx.llvmOptions()[i]; 309 args[numArgs + 1] = nullptr; 310 llvm::cl::ResetAllOptionOccurrences(); 311 llvm::cl::ParseCommandLineOptions(numArgs + 1, args); 312 } 313 } 314 315 namespace lld { 316 namespace mach_o { 317 318 bool parse(llvm::ArrayRef<const char *> args, MachOLinkingContext &ctx) { 319 // Parse command line options using DarwinLdOptions.td 320 DarwinLdOptTable table; 321 unsigned missingIndex; 322 unsigned missingCount; 323 llvm::opt::InputArgList parsedArgs = 324 table.ParseArgs(args.slice(1), missingIndex, missingCount); 325 if (missingCount) { 326 error("missing arg value for '" + 327 Twine(parsedArgs.getArgString(missingIndex)) + "' expected " + 328 Twine(missingCount) + " argument(s)."); 329 return false; 330 } 331 332 for (auto unknownArg : parsedArgs.filtered(OPT_UNKNOWN)) { 333 warn("ignoring unknown argument: " + 334 Twine(unknownArg->getAsString(parsedArgs))); 335 } 336 337 errorHandler().verbose = parsedArgs.hasArg(OPT_v); 338 errorHandler().errorLimit = args::getInteger(parsedArgs, OPT_error_limit, 20); 339 340 // Figure out output kind ( -dylib, -r, -bundle, -preload, or -static ) 341 llvm::MachO::HeaderFileType fileType = llvm::MachO::MH_EXECUTE; 342 bool isStaticExecutable = false; 343 if (llvm::opt::Arg *kind = parsedArgs.getLastArg( 344 OPT_dylib, OPT_relocatable, OPT_bundle, OPT_static, OPT_preload)) { 345 switch (kind->getOption().getID()) { 346 case OPT_dylib: 347 fileType = llvm::MachO::MH_DYLIB; 348 break; 349 case OPT_relocatable: 350 fileType = llvm::MachO::MH_OBJECT; 351 break; 352 case OPT_bundle: 353 fileType = llvm::MachO::MH_BUNDLE; 354 break; 355 case OPT_static: 356 fileType = llvm::MachO::MH_EXECUTE; 357 isStaticExecutable = true; 358 break; 359 case OPT_preload: 360 fileType = llvm::MachO::MH_PRELOAD; 361 break; 362 } 363 } 364 365 // Handle -arch xxx 366 MachOLinkingContext::Arch arch = MachOLinkingContext::arch_unknown; 367 if (llvm::opt::Arg *archStr = parsedArgs.getLastArg(OPT_arch)) { 368 arch = MachOLinkingContext::archFromName(archStr->getValue()); 369 if (arch == MachOLinkingContext::arch_unknown) { 370 error("unknown arch named '" + Twine(archStr->getValue()) + "'"); 371 return false; 372 } 373 } 374 // If no -arch specified, scan input files to find first non-fat .o file. 375 if (arch == MachOLinkingContext::arch_unknown) { 376 for (auto &inFile : parsedArgs.filtered(OPT_INPUT)) { 377 // This is expensive because it opens and maps the file. But that is 378 // ok because no -arch is rare. 379 if (MachOLinkingContext::isThinObjectFile(inFile->getValue(), arch)) 380 break; 381 } 382 if (arch == MachOLinkingContext::arch_unknown && 383 !parsedArgs.getLastArg(OPT_test_file_usage)) { 384 // If no -arch and no options at all, print usage message. 385 if (parsedArgs.size() == 0) { 386 table.PrintHelp(llvm::outs(), 387 (std::string(args[0]) + " [options] file...").c_str(), 388 "LLVM Linker", false); 389 } else { 390 error("-arch not specified and could not be inferred"); 391 } 392 return false; 393 } 394 } 395 396 // Handle -macosx_version_min or -ios_version_min 397 MachOLinkingContext::OS os = MachOLinkingContext::OS::unknown; 398 uint32_t minOSVersion = 0; 399 if (llvm::opt::Arg *minOS = 400 parsedArgs.getLastArg(OPT_macosx_version_min, OPT_ios_version_min, 401 OPT_ios_simulator_version_min)) { 402 switch (minOS->getOption().getID()) { 403 case OPT_macosx_version_min: 404 os = MachOLinkingContext::OS::macOSX; 405 if (MachOLinkingContext::parsePackedVersion(minOS->getValue(), 406 minOSVersion)) { 407 error("malformed macosx_version_min value"); 408 return false; 409 } 410 break; 411 case OPT_ios_version_min: 412 os = MachOLinkingContext::OS::iOS; 413 if (MachOLinkingContext::parsePackedVersion(minOS->getValue(), 414 minOSVersion)) { 415 error("malformed ios_version_min value"); 416 return false; 417 } 418 break; 419 case OPT_ios_simulator_version_min: 420 os = MachOLinkingContext::OS::iOS_simulator; 421 if (MachOLinkingContext::parsePackedVersion(minOS->getValue(), 422 minOSVersion)) { 423 error("malformed ios_simulator_version_min value"); 424 return false; 425 } 426 break; 427 } 428 } else { 429 // No min-os version on command line, check environment variables 430 } 431 432 // Handle export_dynamic 433 // FIXME: Should we warn when this applies to something other than a static 434 // executable or dylib? Those are the only cases where this has an effect. 435 // Note, this has to come before ctx.configure() so that we get the correct 436 // value for _globalsAreDeadStripRoots. 437 bool exportDynamicSymbols = parsedArgs.hasArg(OPT_export_dynamic); 438 439 // Now that there's enough information parsed in, let the linking context 440 // set up default values. 441 ctx.configure(fileType, arch, os, minOSVersion, exportDynamicSymbols); 442 443 // Handle -e xxx 444 if (llvm::opt::Arg *entry = parsedArgs.getLastArg(OPT_entry)) 445 ctx.setEntrySymbolName(entry->getValue()); 446 447 // Handle -o xxx 448 if (llvm::opt::Arg *outpath = parsedArgs.getLastArg(OPT_output)) 449 ctx.setOutputPath(outpath->getValue()); 450 else 451 ctx.setOutputPath("a.out"); 452 453 // Handle -image_base XXX and -seg1addr XXXX 454 if (llvm::opt::Arg *imageBase = parsedArgs.getLastArg(OPT_image_base)) { 455 uint64_t baseAddress; 456 if (parseNumberBase16(imageBase->getValue(), baseAddress)) { 457 error("image_base expects a hex number"); 458 return false; 459 } else if (baseAddress < ctx.pageZeroSize()) { 460 error("image_base overlaps with __PAGEZERO"); 461 return false; 462 } else if (baseAddress % ctx.pageSize()) { 463 error("image_base must be a multiple of page size (0x" + 464 llvm::utohexstr(ctx.pageSize()) + ")"); 465 return false; 466 } 467 468 ctx.setBaseAddress(baseAddress); 469 } 470 471 // Handle -dead_strip 472 if (parsedArgs.getLastArg(OPT_dead_strip)) 473 ctx.setDeadStripping(true); 474 475 bool globalWholeArchive = false; 476 // Handle -all_load 477 if (parsedArgs.getLastArg(OPT_all_load)) 478 globalWholeArchive = true; 479 480 // Handle -install_name 481 if (llvm::opt::Arg *installName = parsedArgs.getLastArg(OPT_install_name)) 482 ctx.setInstallName(installName->getValue()); 483 else 484 ctx.setInstallName(ctx.outputPath()); 485 486 // Handle -mark_dead_strippable_dylib 487 if (parsedArgs.getLastArg(OPT_mark_dead_strippable_dylib)) 488 ctx.setDeadStrippableDylib(true); 489 490 // Handle -compatibility_version and -current_version 491 if (llvm::opt::Arg *vers = parsedArgs.getLastArg(OPT_compatibility_version)) { 492 if (ctx.outputMachOType() != llvm::MachO::MH_DYLIB) { 493 error("-compatibility_version can only be used with -dylib"); 494 return false; 495 } 496 uint32_t parsedVers; 497 if (MachOLinkingContext::parsePackedVersion(vers->getValue(), parsedVers)) { 498 error("-compatibility_version value is malformed"); 499 return false; 500 } 501 ctx.setCompatibilityVersion(parsedVers); 502 } 503 504 if (llvm::opt::Arg *vers = parsedArgs.getLastArg(OPT_current_version)) { 505 if (ctx.outputMachOType() != llvm::MachO::MH_DYLIB) { 506 error("-current_version can only be used with -dylib"); 507 return false; 508 } 509 uint32_t parsedVers; 510 if (MachOLinkingContext::parsePackedVersion(vers->getValue(), parsedVers)) { 511 error("-current_version value is malformed"); 512 return false; 513 } 514 ctx.setCurrentVersion(parsedVers); 515 } 516 517 // Handle -bundle_loader 518 if (llvm::opt::Arg *loader = parsedArgs.getLastArg(OPT_bundle_loader)) 519 ctx.setBundleLoader(loader->getValue()); 520 521 // Handle -sectalign segname sectname align 522 for (auto &alignArg : parsedArgs.filtered(OPT_sectalign)) { 523 const char* segName = alignArg->getValue(0); 524 const char* sectName = alignArg->getValue(1); 525 const char* alignStr = alignArg->getValue(2); 526 if ((alignStr[0] == '0') && (alignStr[1] == 'x')) 527 alignStr += 2; 528 unsigned long long alignValue; 529 if (llvm::getAsUnsignedInteger(alignStr, 16, alignValue)) { 530 error("-sectalign alignment value '" + Twine(alignStr) + 531 "' not a valid number"); 532 return false; 533 } 534 uint16_t align = 1 << llvm::countTrailingZeros(alignValue); 535 if (!llvm::isPowerOf2_64(alignValue)) { 536 std::string Msg; 537 llvm::raw_string_ostream OS(Msg); 538 OS << "alignment for '-sectalign " << segName << " " << sectName 539 << llvm::format(" 0x%llX", alignValue) 540 << "' is not a power of two, using " << llvm::format("0x%08X", align); 541 OS.flush(); 542 warn(Msg); 543 } 544 ctx.addSectionAlignment(segName, sectName, align); 545 } 546 547 // Handle -mllvm 548 for (auto &llvmArg : parsedArgs.filtered(OPT_mllvm)) { 549 ctx.appendLLVMOption(llvmArg->getValue()); 550 } 551 552 // Handle -print_atoms 553 if (parsedArgs.getLastArg(OPT_print_atoms)) 554 ctx.setPrintAtoms(); 555 556 // Handle -t (trace) option. 557 if (parsedArgs.getLastArg(OPT_t)) 558 ctx.setLogInputFiles(true); 559 560 // Handle -demangle option. 561 if (parsedArgs.getLastArg(OPT_demangle)) 562 ctx.setDemangleSymbols(true); 563 564 // Handle -keep_private_externs 565 if (parsedArgs.getLastArg(OPT_keep_private_externs)) { 566 ctx.setKeepPrivateExterns(true); 567 if (ctx.outputMachOType() != llvm::MachO::MH_OBJECT) 568 warn("-keep_private_externs only used in -r mode"); 569 } 570 571 // Handle -dependency_info <path> used by Xcode. 572 if (llvm::opt::Arg *depInfo = parsedArgs.getLastArg(OPT_dependency_info)) 573 if (std::error_code ec = ctx.createDependencyFile(depInfo->getValue())) 574 warn(ec.message() + ", processing '-dependency_info " + 575 depInfo->getValue()); 576 577 // In -test_file_usage mode, we'll be given an explicit list of paths that 578 // exist. We'll also be expected to print out information about how we located 579 // libraries and so on that the user specified, but not to actually do any 580 // linking. 581 if (parsedArgs.getLastArg(OPT_test_file_usage)) { 582 ctx.setTestingFileUsage(); 583 584 // With paths existing by fiat, linking is not going to end well. 585 ctx.setDoNothing(true); 586 587 // Only bother looking for an existence override if we're going to use it. 588 for (auto existingPath : parsedArgs.filtered(OPT_path_exists)) { 589 ctx.addExistingPathForDebug(existingPath->getValue()); 590 } 591 } 592 593 // Register possible input file parsers. 594 if (!ctx.doNothing()) { 595 ctx.registry().addSupportMachOObjects(ctx); 596 ctx.registry().addSupportArchives(ctx.logInputFiles()); 597 ctx.registry().addSupportYamlFiles(); 598 } 599 600 // Now construct the set of library search directories, following ld64's 601 // baroque set of accumulated hacks. Mostly, the algorithm constructs 602 // { syslibroots } x { libpaths } 603 // 604 // Unfortunately, there are numerous exceptions: 605 // 1. Only absolute paths get modified by syslibroot options. 606 // 2. If there is just 1 -syslibroot, system paths not found in it are 607 // skipped. 608 // 3. If the last -syslibroot is "/", all of them are ignored entirely. 609 // 4. If { syslibroots } x path == {}, the original path is kept. 610 std::vector<StringRef> sysLibRoots; 611 for (auto syslibRoot : parsedArgs.filtered(OPT_syslibroot)) { 612 sysLibRoots.push_back(syslibRoot->getValue()); 613 } 614 if (!sysLibRoots.empty()) { 615 // Ignore all if last -syslibroot is "/". 616 if (sysLibRoots.back() != "/") 617 ctx.setSysLibRoots(sysLibRoots); 618 } 619 620 // Paths specified with -L come first, and are not considered system paths for 621 // the case where there is precisely 1 -syslibroot. 622 for (auto libPath : parsedArgs.filtered(OPT_L)) { 623 ctx.addModifiedSearchDir(libPath->getValue()); 624 } 625 626 // Process -F directories (where to look for frameworks). 627 for (auto fwPath : parsedArgs.filtered(OPT_F)) { 628 ctx.addFrameworkSearchDir(fwPath->getValue()); 629 } 630 631 // -Z suppresses the standard search paths. 632 if (!parsedArgs.hasArg(OPT_Z)) { 633 ctx.addModifiedSearchDir("/usr/lib", true); 634 ctx.addModifiedSearchDir("/usr/local/lib", true); 635 ctx.addFrameworkSearchDir("/Library/Frameworks", true); 636 ctx.addFrameworkSearchDir("/System/Library/Frameworks", true); 637 } 638 639 // Now that we've constructed the final set of search paths, print out those 640 // search paths in verbose mode. 641 if (errorHandler().verbose) { 642 message("Library search paths:"); 643 for (auto path : ctx.searchDirs()) { 644 message(" " + path); 645 } 646 message("Framework search paths:"); 647 for (auto path : ctx.frameworkDirs()) { 648 message(" " + path); 649 } 650 } 651 652 // Handle -exported_symbols_list <file> 653 for (auto expFile : parsedArgs.filtered(OPT_exported_symbols_list)) { 654 if (ctx.exportMode() == MachOLinkingContext::ExportMode::unexported) { 655 error("-exported_symbols_list cannot be combined with " 656 "-unexported_symbol[s_list]"); 657 return false; 658 } 659 ctx.setExportMode(MachOLinkingContext::ExportMode::exported); 660 if (std::error_code ec = parseExportsList(expFile->getValue(), ctx)) { 661 error(ec.message() + ", processing '-exported_symbols_list " + 662 expFile->getValue()); 663 return false; 664 } 665 } 666 667 // Handle -exported_symbol <symbol> 668 for (auto symbol : parsedArgs.filtered(OPT_exported_symbol)) { 669 if (ctx.exportMode() == MachOLinkingContext::ExportMode::unexported) { 670 error("-exported_symbol cannot be combined with " 671 "-unexported_symbol[s_list]"); 672 return false; 673 } 674 ctx.setExportMode(MachOLinkingContext::ExportMode::exported); 675 ctx.addExportSymbol(symbol->getValue()); 676 } 677 678 // Handle -unexported_symbols_list <file> 679 for (auto expFile : parsedArgs.filtered(OPT_unexported_symbols_list)) { 680 if (ctx.exportMode() == MachOLinkingContext::ExportMode::exported) { 681 error("-unexported_symbols_list cannot be combined with " 682 "-exported_symbol[s_list]"); 683 return false; 684 } 685 ctx.setExportMode(MachOLinkingContext::ExportMode::unexported); 686 if (std::error_code ec = parseExportsList(expFile->getValue(), ctx)) { 687 error(ec.message() + ", processing '-unexported_symbols_list " + 688 expFile->getValue()); 689 return false; 690 } 691 } 692 693 // Handle -unexported_symbol <symbol> 694 for (auto symbol : parsedArgs.filtered(OPT_unexported_symbol)) { 695 if (ctx.exportMode() == MachOLinkingContext::ExportMode::exported) { 696 error("-unexported_symbol cannot be combined with " 697 "-exported_symbol[s_list]"); 698 return false; 699 } 700 ctx.setExportMode(MachOLinkingContext::ExportMode::unexported); 701 ctx.addExportSymbol(symbol->getValue()); 702 } 703 704 // Handle obosolete -multi_module and -single_module 705 if (llvm::opt::Arg *mod = 706 parsedArgs.getLastArg(OPT_multi_module, OPT_single_module)) { 707 if (mod->getOption().getID() == OPT_multi_module) 708 warn("-multi_module is obsolete and being ignored"); 709 else if (ctx.outputMachOType() != llvm::MachO::MH_DYLIB) 710 warn("-single_module being ignored. It is only for use when producing a " 711 "dylib"); 712 } 713 714 // Handle obsolete ObjC options: -objc_gc_compaction, -objc_gc, -objc_gc_only 715 if (parsedArgs.getLastArg(OPT_objc_gc_compaction)) { 716 error("-objc_gc_compaction is not supported"); 717 return false; 718 } 719 720 if (parsedArgs.getLastArg(OPT_objc_gc)) { 721 error("-objc_gc is not supported"); 722 return false; 723 } 724 725 if (parsedArgs.getLastArg(OPT_objc_gc_only)) { 726 error("-objc_gc_only is not supported"); 727 return false; 728 } 729 730 // Handle -pie or -no_pie 731 if (llvm::opt::Arg *pie = parsedArgs.getLastArg(OPT_pie, OPT_no_pie)) { 732 switch (ctx.outputMachOType()) { 733 case llvm::MachO::MH_EXECUTE: 734 switch (ctx.os()) { 735 case MachOLinkingContext::OS::macOSX: 736 if ((minOSVersion < 0x000A0500) && 737 (pie->getOption().getID() == OPT_pie)) { 738 error("-pie can only be used when targeting Mac OS X 10.5 or later"); 739 return false; 740 } 741 break; 742 case MachOLinkingContext::OS::iOS: 743 if ((minOSVersion < 0x00040200) && 744 (pie->getOption().getID() == OPT_pie)) { 745 error("-pie can only be used when targeting iOS 4.2 or later"); 746 return false; 747 } 748 break; 749 case MachOLinkingContext::OS::iOS_simulator: 750 if (pie->getOption().getID() == OPT_no_pie) { 751 error("iOS simulator programs must be built PIE"); 752 return false; 753 } 754 break; 755 case MachOLinkingContext::OS::unknown: 756 break; 757 } 758 ctx.setPIE(pie->getOption().getID() == OPT_pie); 759 break; 760 case llvm::MachO::MH_PRELOAD: 761 break; 762 case llvm::MachO::MH_DYLIB: 763 case llvm::MachO::MH_BUNDLE: 764 warn(pie->getSpelling() + 765 " being ignored. It is only used when linking main executables"); 766 break; 767 default: 768 error(pie->getSpelling() + 769 " can only used when linking main executables"); 770 return false; 771 } 772 } 773 774 // Handle -version_load_command or -no_version_load_command 775 { 776 bool flagOn = false; 777 bool flagOff = false; 778 if (auto *arg = parsedArgs.getLastArg(OPT_version_load_command, 779 OPT_no_version_load_command)) { 780 flagOn = arg->getOption().getID() == OPT_version_load_command; 781 flagOff = arg->getOption().getID() == OPT_no_version_load_command; 782 } 783 784 // default to adding version load command for dynamic code, 785 // static code must opt-in 786 switch (ctx.outputMachOType()) { 787 case llvm::MachO::MH_OBJECT: 788 ctx.setGenerateVersionLoadCommand(false); 789 break; 790 case llvm::MachO::MH_EXECUTE: 791 // dynamic executables default to generating a version load command, 792 // while static executables only generate it if required. 793 if (isStaticExecutable) { 794 if (flagOn) 795 ctx.setGenerateVersionLoadCommand(true); 796 } else { 797 if (!flagOff) 798 ctx.setGenerateVersionLoadCommand(true); 799 } 800 break; 801 case llvm::MachO::MH_PRELOAD: 802 case llvm::MachO::MH_KEXT_BUNDLE: 803 if (flagOn) 804 ctx.setGenerateVersionLoadCommand(true); 805 break; 806 case llvm::MachO::MH_DYLINKER: 807 case llvm::MachO::MH_DYLIB: 808 case llvm::MachO::MH_BUNDLE: 809 if (!flagOff) 810 ctx.setGenerateVersionLoadCommand(true); 811 break; 812 case llvm::MachO::MH_FVMLIB: 813 case llvm::MachO::MH_DYLDLINK: 814 case llvm::MachO::MH_DYLIB_STUB: 815 case llvm::MachO::MH_DSYM: 816 // We don't generate load commands for these file types, even if 817 // forced on. 818 break; 819 } 820 } 821 822 // Handle -function_starts or -no_function_starts 823 { 824 bool flagOn = false; 825 bool flagOff = false; 826 if (auto *arg = parsedArgs.getLastArg(OPT_function_starts, 827 OPT_no_function_starts)) { 828 flagOn = arg->getOption().getID() == OPT_function_starts; 829 flagOff = arg->getOption().getID() == OPT_no_function_starts; 830 } 831 832 // default to adding functions start for dynamic code, static code must 833 // opt-in 834 switch (ctx.outputMachOType()) { 835 case llvm::MachO::MH_OBJECT: 836 ctx.setGenerateFunctionStartsLoadCommand(false); 837 break; 838 case llvm::MachO::MH_EXECUTE: 839 // dynamic executables default to generating a version load command, 840 // while static executables only generate it if required. 841 if (isStaticExecutable) { 842 if (flagOn) 843 ctx.setGenerateFunctionStartsLoadCommand(true); 844 } else { 845 if (!flagOff) 846 ctx.setGenerateFunctionStartsLoadCommand(true); 847 } 848 break; 849 case llvm::MachO::MH_PRELOAD: 850 case llvm::MachO::MH_KEXT_BUNDLE: 851 if (flagOn) 852 ctx.setGenerateFunctionStartsLoadCommand(true); 853 break; 854 case llvm::MachO::MH_DYLINKER: 855 case llvm::MachO::MH_DYLIB: 856 case llvm::MachO::MH_BUNDLE: 857 if (!flagOff) 858 ctx.setGenerateFunctionStartsLoadCommand(true); 859 break; 860 case llvm::MachO::MH_FVMLIB: 861 case llvm::MachO::MH_DYLDLINK: 862 case llvm::MachO::MH_DYLIB_STUB: 863 case llvm::MachO::MH_DSYM: 864 // We don't generate load commands for these file types, even if 865 // forced on. 866 break; 867 } 868 } 869 870 // Handle -data_in_code_info or -no_data_in_code_info 871 { 872 bool flagOn = false; 873 bool flagOff = false; 874 if (auto *arg = parsedArgs.getLastArg(OPT_data_in_code_info, 875 OPT_no_data_in_code_info)) { 876 flagOn = arg->getOption().getID() == OPT_data_in_code_info; 877 flagOff = arg->getOption().getID() == OPT_no_data_in_code_info; 878 } 879 880 // default to adding data in code for dynamic code, static code must 881 // opt-in 882 switch (ctx.outputMachOType()) { 883 case llvm::MachO::MH_OBJECT: 884 if (!flagOff) 885 ctx.setGenerateDataInCodeLoadCommand(true); 886 break; 887 case llvm::MachO::MH_EXECUTE: 888 // dynamic executables default to generating a version load command, 889 // while static executables only generate it if required. 890 if (isStaticExecutable) { 891 if (flagOn) 892 ctx.setGenerateDataInCodeLoadCommand(true); 893 } else { 894 if (!flagOff) 895 ctx.setGenerateDataInCodeLoadCommand(true); 896 } 897 break; 898 case llvm::MachO::MH_PRELOAD: 899 case llvm::MachO::MH_KEXT_BUNDLE: 900 if (flagOn) 901 ctx.setGenerateDataInCodeLoadCommand(true); 902 break; 903 case llvm::MachO::MH_DYLINKER: 904 case llvm::MachO::MH_DYLIB: 905 case llvm::MachO::MH_BUNDLE: 906 if (!flagOff) 907 ctx.setGenerateDataInCodeLoadCommand(true); 908 break; 909 case llvm::MachO::MH_FVMLIB: 910 case llvm::MachO::MH_DYLDLINK: 911 case llvm::MachO::MH_DYLIB_STUB: 912 case llvm::MachO::MH_DSYM: 913 // We don't generate load commands for these file types, even if 914 // forced on. 915 break; 916 } 917 } 918 919 // Handle sdk_version 920 if (llvm::opt::Arg *arg = parsedArgs.getLastArg(OPT_sdk_version)) { 921 uint32_t sdkVersion = 0; 922 if (MachOLinkingContext::parsePackedVersion(arg->getValue(), 923 sdkVersion)) { 924 error("malformed sdkVersion value"); 925 return false; 926 } 927 ctx.setSdkVersion(sdkVersion); 928 } else if (ctx.generateVersionLoadCommand()) { 929 // If we don't have an sdk version, but were going to emit a load command 930 // with min_version, then we need to give a warning as we have no sdk 931 // version to put in that command. 932 // FIXME: We need to decide whether to make this an error. 933 warn("-sdk_version is required when emitting min version load command. " 934 "Setting sdk version to match provided min version"); 935 ctx.setSdkVersion(ctx.osMinVersion()); 936 } 937 938 // Handle source_version 939 if (llvm::opt::Arg *arg = parsedArgs.getLastArg(OPT_source_version)) { 940 uint64_t version = 0; 941 if (MachOLinkingContext::parsePackedVersion(arg->getValue(), 942 version)) { 943 error("malformed source_version value"); 944 return false; 945 } 946 ctx.setSourceVersion(version); 947 } 948 949 // Handle stack_size 950 if (llvm::opt::Arg *stackSize = parsedArgs.getLastArg(OPT_stack_size)) { 951 uint64_t stackSizeVal; 952 if (parseNumberBase16(stackSize->getValue(), stackSizeVal)) { 953 error("stack_size expects a hex number"); 954 return false; 955 } 956 if ((stackSizeVal % ctx.pageSize()) != 0) { 957 error("stack_size must be a multiple of page size (0x" + 958 llvm::utohexstr(ctx.pageSize()) + ")"); 959 return false; 960 } 961 962 ctx.setStackSize(stackSizeVal); 963 } 964 965 // Handle debug info handling options: -S 966 if (parsedArgs.hasArg(OPT_S)) 967 ctx.setDebugInfoMode(MachOLinkingContext::DebugInfoMode::noDebugMap); 968 969 // Handle -order_file <file> 970 for (auto orderFile : parsedArgs.filtered(OPT_order_file)) { 971 if (std::error_code ec = parseOrderFile(orderFile->getValue(), ctx)) { 972 error(ec.message() + ", processing '-order_file " + orderFile->getValue() 973 + "'"); 974 return false; 975 } 976 } 977 978 // Handle -flat_namespace. 979 if (llvm::opt::Arg *ns = 980 parsedArgs.getLastArg(OPT_flat_namespace, OPT_twolevel_namespace)) { 981 if (ns->getOption().getID() == OPT_flat_namespace) 982 ctx.setUseFlatNamespace(true); 983 } 984 985 // Handle -undefined 986 if (llvm::opt::Arg *undef = parsedArgs.getLastArg(OPT_undefined)) { 987 MachOLinkingContext::UndefinedMode UndefMode; 988 if (StringRef(undef->getValue()).equals("error")) 989 UndefMode = MachOLinkingContext::UndefinedMode::error; 990 else if (StringRef(undef->getValue()).equals("warning")) 991 UndefMode = MachOLinkingContext::UndefinedMode::warning; 992 else if (StringRef(undef->getValue()).equals("suppress")) 993 UndefMode = MachOLinkingContext::UndefinedMode::suppress; 994 else if (StringRef(undef->getValue()).equals("dynamic_lookup")) 995 UndefMode = MachOLinkingContext::UndefinedMode::dynamicLookup; 996 else { 997 error("invalid option to -undefined [ warning | error | suppress | " 998 "dynamic_lookup ]"); 999 return false; 1000 } 1001 1002 if (ctx.useFlatNamespace()) { 1003 // If we're using -flat_namespace then 'warning', 'suppress' and 1004 // 'dynamic_lookup' are all equivalent, so map them to 'suppress'. 1005 if (UndefMode != MachOLinkingContext::UndefinedMode::error) 1006 UndefMode = MachOLinkingContext::UndefinedMode::suppress; 1007 } else { 1008 // If we're using -twolevel_namespace then 'warning' and 'suppress' are 1009 // illegal. Emit a diagnostic if they've been (mis)used. 1010 if (UndefMode == MachOLinkingContext::UndefinedMode::warning || 1011 UndefMode == MachOLinkingContext::UndefinedMode::suppress) { 1012 error("can't use -undefined warning or suppress with " 1013 "-twolevel_namespace"); 1014 return false; 1015 } 1016 } 1017 1018 ctx.setUndefinedMode(UndefMode); 1019 } 1020 1021 // Handle -no_objc_category_merging. 1022 if (parsedArgs.getLastArg(OPT_no_objc_category_merging)) 1023 ctx.setMergeObjCCategories(false); 1024 1025 // Handle -rpath <path> 1026 if (parsedArgs.hasArg(OPT_rpath)) { 1027 switch (ctx.outputMachOType()) { 1028 case llvm::MachO::MH_EXECUTE: 1029 case llvm::MachO::MH_DYLIB: 1030 case llvm::MachO::MH_BUNDLE: 1031 if (!ctx.minOS("10.5", "2.0")) { 1032 if (ctx.os() == MachOLinkingContext::OS::macOSX) 1033 error("-rpath can only be used when targeting OS X 10.5 or later"); 1034 else 1035 error("-rpath can only be used when targeting iOS 2.0 or later"); 1036 return false; 1037 } 1038 break; 1039 default: 1040 error("-rpath can only be used when creating a dynamic final linked " 1041 "image"); 1042 return false; 1043 } 1044 1045 for (auto rPath : parsedArgs.filtered(OPT_rpath)) { 1046 ctx.addRpath(rPath->getValue()); 1047 } 1048 } 1049 1050 // Parse the LLVM options before we process files in case the file handling 1051 // makes use of things like LLVM_DEBUG(). 1052 parseLLVMOptions(ctx); 1053 1054 // Handle input files and sectcreate. 1055 for (auto &arg : parsedArgs) { 1056 bool upward; 1057 llvm::Optional<StringRef> resolvedPath; 1058 switch (arg->getOption().getID()) { 1059 default: 1060 continue; 1061 case OPT_INPUT: 1062 addFile(arg->getValue(), ctx, globalWholeArchive, false); 1063 break; 1064 case OPT_upward_library: 1065 addFile(arg->getValue(), ctx, false, true); 1066 break; 1067 case OPT_force_load: 1068 addFile(arg->getValue(), ctx, true, false); 1069 break; 1070 case OPT_l: 1071 case OPT_upward_l: 1072 upward = (arg->getOption().getID() == OPT_upward_l); 1073 resolvedPath = ctx.searchLibrary(arg->getValue()); 1074 if (!resolvedPath) { 1075 error("Unable to find library for " + arg->getSpelling() + 1076 arg->getValue()); 1077 return false; 1078 } else if (ctx.testingFileUsage()) { 1079 message(Twine("Found ") + (upward ? "upward " : " ") + "library " + 1080 canonicalizePath(resolvedPath.getValue())); 1081 } 1082 addFile(resolvedPath.getValue(), ctx, globalWholeArchive, upward); 1083 break; 1084 case OPT_framework: 1085 case OPT_upward_framework: 1086 upward = (arg->getOption().getID() == OPT_upward_framework); 1087 resolvedPath = ctx.findPathForFramework(arg->getValue()); 1088 if (!resolvedPath) { 1089 error("Unable to find framework for " + arg->getSpelling() + " " + 1090 arg->getValue()); 1091 return false; 1092 } else if (ctx.testingFileUsage()) { 1093 message(Twine("Found ") + (upward ? "upward " : " ") + "framework " + 1094 canonicalizePath(resolvedPath.getValue())); 1095 } 1096 addFile(resolvedPath.getValue(), ctx, globalWholeArchive, upward); 1097 break; 1098 case OPT_filelist: 1099 if (auto ec = loadFileList(arg->getValue(), ctx, globalWholeArchive)) { 1100 handleAllErrors(std::move(ec), [&](const llvm::ErrorInfoBase &EI) { 1101 error(EI.message() + ", processing '-filelist " + arg->getValue()); 1102 }); 1103 return false; 1104 } 1105 break; 1106 case OPT_sectcreate: { 1107 const char* seg = arg->getValue(0); 1108 const char* sect = arg->getValue(1); 1109 const char* fileName = arg->getValue(2); 1110 1111 ErrorOr<std::unique_ptr<MemoryBuffer>> contentOrErr = 1112 MemoryBuffer::getFile(fileName); 1113 1114 if (!contentOrErr) { 1115 error("can't open -sectcreate file " + Twine(fileName)); 1116 return false; 1117 } 1118 1119 ctx.addSectCreateSection(seg, sect, std::move(*contentOrErr)); 1120 } 1121 break; 1122 } 1123 } 1124 1125 if (ctx.getNodes().empty()) { 1126 error("No input files"); 1127 return false; 1128 } 1129 1130 // Validate the combination of options used. 1131 return ctx.validate(); 1132 } 1133 1134 static void createFiles(MachOLinkingContext &ctx, bool Implicit) { 1135 std::vector<std::unique_ptr<File>> Files; 1136 if (Implicit) 1137 ctx.createImplicitFiles(Files); 1138 else 1139 ctx.createInternalFiles(Files); 1140 for (auto i = Files.rbegin(), e = Files.rend(); i != e; ++i) { 1141 auto &members = ctx.getNodes(); 1142 members.insert(members.begin(), std::make_unique<FileNode>(std::move(*i))); 1143 } 1144 } 1145 1146 /// This is where the link is actually performed. 1147 bool link(llvm::ArrayRef<const char *> args, bool CanExitEarly, 1148 raw_ostream &StdoutOS, raw_ostream &StderrOS) { 1149 lld::stdoutOS = &StdoutOS; 1150 lld::stderrOS = &StderrOS; 1151 1152 errorHandler().logName = args::getFilenameWithoutExe(args[0]); 1153 errorHandler().errorLimitExceededMsg = 1154 "too many errors emitted, stopping now (use " 1155 "'-error-limit 0' to see all errors)"; 1156 errorHandler().exitEarly = CanExitEarly; 1157 StderrOS.enable_colors(StderrOS.has_colors()); 1158 1159 MachOLinkingContext ctx; 1160 if (!parse(args, ctx)) 1161 return false; 1162 if (ctx.doNothing()) 1163 return true; 1164 if (ctx.getNodes().empty()) 1165 return false; 1166 1167 for (std::unique_ptr<Node> &ie : ctx.getNodes()) 1168 if (FileNode *node = dyn_cast<FileNode>(ie.get())) 1169 node->getFile()->parse(); 1170 1171 createFiles(ctx, false /* Implicit */); 1172 1173 // Give target a chance to add files 1174 createFiles(ctx, true /* Implicit */); 1175 1176 // Give target a chance to postprocess input files. 1177 // Mach-O uses this chance to move all object files before library files. 1178 ctx.finalizeInputFiles(); 1179 1180 // Do core linking. 1181 ScopedTask resolveTask(getDefaultDomain(), "Resolve"); 1182 Resolver resolver(ctx); 1183 if (!resolver.resolve()) 1184 return false; 1185 SimpleFile *merged = nullptr; 1186 { 1187 std::unique_ptr<SimpleFile> mergedFile = resolver.resultFile(); 1188 merged = mergedFile.get(); 1189 auto &members = ctx.getNodes(); 1190 members.insert(members.begin(), 1191 std::make_unique<FileNode>(std::move(mergedFile))); 1192 } 1193 resolveTask.end(); 1194 1195 // Run passes on linked atoms. 1196 ScopedTask passTask(getDefaultDomain(), "Passes"); 1197 PassManager pm; 1198 ctx.addPasses(pm); 1199 if (auto ec = pm.runOnFile(*merged)) { 1200 // FIXME: This should be passed to logAllUnhandledErrors but it needs 1201 // to be passed a Twine instead of a string. 1202 lld::errs() << "Failed to run passes on file '" << ctx.outputPath() 1203 << "': "; 1204 logAllUnhandledErrors(std::move(ec), lld::errs(), std::string()); 1205 return false; 1206 } 1207 1208 passTask.end(); 1209 1210 // Give linked atoms to Writer to generate output file. 1211 ScopedTask writeTask(getDefaultDomain(), "Write"); 1212 if (auto ec = ctx.writeFile(*merged)) { 1213 // FIXME: This should be passed to logAllUnhandledErrors but it needs 1214 // to be passed a Twine instead of a string. 1215 lld::errs() << "Failed to write file '" << ctx.outputPath() << "': "; 1216 logAllUnhandledErrors(std::move(ec), lld::errs(), std::string()); 1217 return false; 1218 } 1219 1220 // Call exit() if we can to avoid calling destructors. 1221 if (CanExitEarly) 1222 exitLld(errorCount() ? 1 : 0); 1223 1224 1225 return true; 1226 } 1227 1228 } // end namespace mach_o 1229 } // end namespace lld 1230