diff options
| author | Shankar Easwaran <shankare@codeaurora.org> | 2013-10-09 05:23:23 +0000 |
|---|---|---|
| committer | Shankar Easwaran <shankare@codeaurora.org> | 2013-10-09 05:23:23 +0000 |
| commit | 1d3c48f1fcf36d1b9245aae11bedeb3e8868739f (patch) | |
| tree | 072c76e11599441e668606345a01589a78e65dfd /lld/lib/Core/Resolver.cpp | |
| parent | 15a4774345dd81eb77204637d45909876ca9181d (diff) | |
| download | bcm5719-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.cpp | 23 |
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); + } } } |

