diff --git a/lld/MachO/Config.h b/lld/MachO/Config.h --- a/lld/MachO/Config.h +++ b/lld/MachO/Config.h @@ -33,6 +33,7 @@ struct Configuration { Symbol *entry; bool hasReexports = false; + bool allLoad = false; bool forceLoadObjC = false; uint32_t headerPad; llvm::StringRef installName; diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -248,7 +248,11 @@ if (!file->isEmpty() && !file->hasSymbolTable()) error(path + ": archive has no index; run ranlib to add one"); - if (config->forceLoadObjC) { + if (config->allLoad) { + if (Optional buffer = readFile(path)) + for (MemoryBufferRef member : getArchiveMembers(*buffer)) + inputFiles.push_back(make(member)); + } else if (config->forceLoadObjC) { for (const object::Archive::Symbol &sym : file->symbols()) if (sym.getName().startswith(objc::klass)) symtab->addUndefined(sym.getName()); @@ -519,6 +523,7 @@ config->headerPad = args::getHex(args, OPT_headerpad, /*Default=*/32); config->outputType = args.hasArg(OPT_dylib) ? MH_DYLIB : MH_EXECUTE; config->runtimePaths = args::getStrings(args, OPT_rpath); + config->allLoad = args.hasArg(OPT_all_load); std::vector &roots = config->systemLibraryRoots; for (const Arg *arg : args.filtered(OPT_syslibroot)) @@ -583,6 +588,7 @@ case OPT_platform_version: handlePlatformVersion(arg); break; + case OPT_all_load: case OPT_o: case OPT_dylib: case OPT_e: diff --git a/lld/test/MachO/archive.s b/lld/test/MachO/archive.s --- a/lld/test/MachO/archive.s +++ b/lld/test/MachO/archive.s @@ -22,11 +22,17 @@ # ARCHIVE-FIRST: T _boo # ARCHIVE-FIRST: T _main - # RUN: llvm-nm %t/test.out | FileCheck %s --check-prefix VISIBLE # VISIBLE-NOT: T _undefined # VISIBLE-NOT: T _unused +# RUN: lld -flavor darwinnew %t/test.a %t/main.o -o %t/all-load -all_load +# RUN: llvm-nm %t/all-load | FileCheck %s --check-prefix ALL-LOAD +# ALL-LOAD: T _bar +# ALL-LOAD: T _boo +# ALL-LOAD: T _main +# ALL-LOAD: T _unused + .global _main _main: callq _boo