summaryrefslogtreecommitdiffstats
path: root/lld/lib/Core/Resolver.cpp
diff options
context:
space:
mode:
authorShankar Easwaran <shankare@codeaurora.org>2013-10-09 05:23:23 +0000
committerShankar Easwaran <shankare@codeaurora.org>2013-10-09 05:23:23 +0000
commit1d3c48f1fcf36d1b9245aae11bedeb3e8868739f (patch)
tree072c76e11599441e668606345a01589a78e65dfd /lld/lib/Core/Resolver.cpp
parent15a4774345dd81eb77204637d45909876ca9181d (diff)
downloadbcm5719-llvm-1d3c48f1fcf36d1b9245aae11bedeb3e8868739f.tar.gz
bcm5719-llvm-1d3c48f1fcf36d1b9245aae11bedeb3e8868739f.zip
[Layout] Assign ordinals in Resolution order.
llvm-svn: 192277
Diffstat (limited to 'lld/lib/Core/Resolver.cpp')
-rw-r--r--lld/lib/Core/Resolver.cpp23
1 files changed, 17 insertions, 6 deletions
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