forked from OSchip/llvm-project
[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
This commit is contained in:
parent
f828f0a90f
commit
9d43c000e1
|
@ -1419,25 +1419,6 @@ bool macho::link(ArrayRef<const char *> argsArr, bool canExitEarly,
|
|||
if (!orderFile.empty())
|
||||
parseOrderFile(orderFile);
|
||||
|
||||
if (config->entry)
|
||||
if (auto *undefined = dyn_cast<Undefined>(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<Undefined>(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<Undefined>(sym))
|
||||
treatUndefinedSymbol(*undefined, "-exported_symbol(s_list)");
|
||||
}
|
||||
|
||||
referenceStubBinder();
|
||||
|
||||
// FIXME: should terminate the link early based on errors encountered so
|
||||
|
|
|
@ -47,6 +47,7 @@ class Writer {
|
|||
public:
|
||||
Writer() : buffer(errorHandler().outputBuffer) {}
|
||||
|
||||
void treatSpecialUndefineds();
|
||||
void scanRelocations();
|
||||
void scanSymbols();
|
||||
template <class LP> void createOutputSections();
|
||||
|
@ -550,6 +551,27 @@ public:
|
|||
|
||||
} // namespace
|
||||
|
||||
void Writer::treatSpecialUndefineds() {
|
||||
if (config->entry)
|
||||
if (auto *undefined = dyn_cast<Undefined>(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<Undefined>(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<Undefined>(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 <class LP> void Writer::run() {
|
||||
treatSpecialUndefineds();
|
||||
if (config->entry && !isa<Undefined>(config->entry))
|
||||
prepareBranchTarget(config->entry);
|
||||
scanRelocations();
|
||||
|
|
Loading…
Reference in New Issue