From 9d43c000e1b8ddbfe4fc69b04fa68088f5d813ce Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Thu, 22 Jul 2021 10:31:39 -0400 Subject: [PATCH] [lld/mac] Move handling of special undefineds later treatUndefinedSymbol() was previously called before gatherInputSections() and markLive() for these special symbols, but after them for normal undefineds. For PR50760, treatUndefinedSymbol() will have to potentially create sections, so it's good to move treatUndefinedSymbol() for special undefineds later, so that it can assume that gatherInputSections() and markLive() has already been called always. No intended behavior change, but part of PR50760 (and covered in tests in the patch for the full feature). Differential Revision: https://reviews.llvm.org/D106552 --- lld/MachO/Driver.cpp | 19 ------------------- lld/MachO/Writer.cpp | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp index 7fcaeac2112d..60db3f1d704d 100644 --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -1419,25 +1419,6 @@ bool macho::link(ArrayRef argsArr, bool canExitEarly, if (!orderFile.empty()) parseOrderFile(orderFile); - if (config->entry) - if (auto *undefined = dyn_cast(config->entry)) - treatUndefinedSymbol(*undefined, "the entry point"); - - // FIXME: This prints symbols that are undefined both in input files and - // via -u flag twice. - for (const Symbol *sym : config->explicitUndefineds) { - if (const auto *undefined = dyn_cast(sym)) - treatUndefinedSymbol(*undefined, "-u"); - } - // Literal exported-symbol names must be defined, but glob - // patterns need not match. - for (const CachedHashStringRef &cachedName : - config->exportedSymbols.literals) { - if (const Symbol *sym = symtab->find(cachedName)) - if (const auto *undefined = dyn_cast(sym)) - treatUndefinedSymbol(*undefined, "-exported_symbol(s_list)"); - } - referenceStubBinder(); // FIXME: should terminate the link early based on errors encountered so diff --git a/lld/MachO/Writer.cpp b/lld/MachO/Writer.cpp index a3855ed97509..6a9cd13fff62 100644 --- a/lld/MachO/Writer.cpp +++ b/lld/MachO/Writer.cpp @@ -47,6 +47,7 @@ class Writer { public: Writer() : buffer(errorHandler().outputBuffer) {} + void treatSpecialUndefineds(); void scanRelocations(); void scanSymbols(); template void createOutputSections(); @@ -550,6 +551,27 @@ public: } // namespace +void Writer::treatSpecialUndefineds() { + if (config->entry) + if (auto *undefined = dyn_cast(config->entry)) + treatUndefinedSymbol(*undefined, "the entry point"); + + // FIXME: This prints symbols that are undefined both in input files and + // via -u flag twice. + for (const Symbol *sym : config->explicitUndefineds) { + if (const auto *undefined = dyn_cast(sym)) + treatUndefinedSymbol(*undefined, "-u"); + } + // Literal exported-symbol names must be defined, but glob + // patterns need not match. + for (const CachedHashStringRef &cachedName : + config->exportedSymbols.literals) { + if (const Symbol *sym = symtab->find(cachedName)) + if (const auto *undefined = dyn_cast(sym)) + treatUndefinedSymbol(*undefined, "-exported_symbol(s_list)"); + } +} + // Add stubs and bindings where necessary (e.g. if the symbol is a // DylibSymbol.) static void prepareBranchTarget(Symbol *sym) { @@ -1066,6 +1088,7 @@ void Writer::writeOutputFile() { } template void Writer::run() { + treatSpecialUndefineds(); if (config->entry && !isa(config->entry)) prepareBranchTarget(config->entry); scanRelocations();