summaryrefslogtreecommitdiffstats
path: root/lld/lib/Core
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/Core')
-rw-r--r--lld/lib/Core/LinkingContext.cpp3
-rw-r--r--lld/lib/Core/Resolver.cpp23
2 files changed, 19 insertions, 7 deletions
diff --git a/lld/lib/Core/LinkingContext.cpp b/lld/lib/Core/LinkingContext.cpp
index 779d9b81be1..9ae4f51da00 100644
--- a/lld/lib/Core/LinkingContext.cpp
+++ b/lld/lib/Core/LinkingContext.cpp
@@ -24,7 +24,8 @@ LinkingContext::LinkingContext()
_warnIfCoalesableAtomsHaveDifferentLoadName(false),
_printRemainingUndefines(true), _allowRemainingUndefines(false),
_logInputFiles(false), _allowShlibUndefines(false),
- _outputFileType(OutputFileType::Default), _currentInputElement(nullptr) {}
+ _outputFileType(OutputFileType::Default), _currentInputElement(nullptr),
+ _nextOrdinal(0) {}
LinkingContext::~LinkingContext() {}
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp
index c8d1549c64b..1147bc55236 100644
--- a/lld/lib/Core/Resolver.cpp
+++ b/lld/lib/Core/Resolver.cpp
@@ -108,8 +108,10 @@ void Resolver::handleArchiveFile(const File &file) {
StringRef undefName = undefAtom->name();
// load for previous undefine may also have loaded this undefine
if (!_symbolTable.isDefined(undefName)) {
- if (const File *member = archiveFile->find(undefName, false))
+ if (const File *member = archiveFile->find(undefName, false)) {
+ member->setOrdinal(_context.getNextOrdinalAndIncrement());
handleFile(*member);
+ }
}
// If the undefined symbol has an alternative name, try to resolve the
// symbol with the name to give it a second chance. This feature is used
@@ -132,8 +134,10 @@ void Resolver::handleArchiveFile(const File &file) {
assert(curAtom != nullptr);
if (const DefinedAtom *curDefAtom = dyn_cast<DefinedAtom>(curAtom)) {
if (curDefAtom->merge() == DefinedAtom::mergeAsTentative) {
- if (const File *member = archiveFile->find(tentDefName, true))
+ if (const File *member = archiveFile->find(tentDefName, true)) {
+ member->setOrdinal(_context.getNextOrdinalAndIncrement());
handleFile(*member);
+ }
}
}
}
@@ -147,7 +151,6 @@ void Resolver::handleSharedLibrary(const File &file) {
// Add all the atoms from the shared library
handleFile(*sharedLibrary);
-
do {
undefineGenCount = _symbolTable.size();
std::vector<const UndefinedAtom *> undefines;
@@ -295,12 +298,20 @@ void Resolver::resolveUndefines() {
_context.setResolverState(Resolver::StateNoChange);
if (error_code(nextFile) == InputGraphError::no_more_files)
break;
- if (nextFile->kind() == File::kindObject)
+ if (nextFile->kind() == File::kindObject) {
+ nextFile->setOrdinal(_context.getNextOrdinalAndIncrement());
handleFile(*nextFile);
- if (nextFile->kind() == File::kindArchiveLibrary)
+ }
+ if (nextFile->kind() == File::kindArchiveLibrary) {
+ if (!nextFile->hasOrdinal())
+ nextFile->setOrdinal(_context.getNextOrdinalAndIncrement());
handleArchiveFile(*nextFile);
- if (nextFile->kind() == File::kindSharedLibrary)
+ }
+ if (nextFile->kind() == File::kindSharedLibrary) {
+ if (!nextFile->hasOrdinal())
+ nextFile->setOrdinal(_context.getNextOrdinalAndIncrement());
handleSharedLibrary(*nextFile);
+ }
}
}
OpenPOWER on IntegriCloud