Index: include/lld/Core/LinkingContext.h =================================================================== --- include/lld/Core/LinkingContext.h +++ include/lld/Core/LinkingContext.h @@ -313,8 +313,11 @@ /// \param linkedFile This is the merged/linked graph of all input file Atoms. virtual std::error_code writeFile(const File &linkedFile) const; - /// Return the next ordinal and Increment it. - virtual uint64_t getNextOrdinalAndIncrement() const { return _nextOrdinal++; } + /// Return the next file ordinal. File ordinals are used by the writer + /// to sort file contents as their file order in the command line. All files + /// including archive files get one file ordinal. Ordinals are large numbers. + /// Least significant 32 bits are reserved for archive file members. + uint64_t nextFileOrdinal() const { return _nextFileOrdinal++ << 32; } // This function is called just before the Resolver kicks in. // Derived classes may use that chance to rearrange the input files. @@ -360,7 +363,7 @@ StringRefVector _initialUndefinedSymbols; std::vector> _nodes; mutable llvm::BumpPtrAllocator _allocator; - mutable uint64_t _nextOrdinal; + mutable uint64_t _nextFileOrdinal; Registry _registry; private: Index: include/lld/Core/Resolver.h =================================================================== --- include/lld/Core/Resolver.h +++ include/lld/Core/Resolver.h @@ -31,7 +31,7 @@ public: Resolver(LinkingContext &ctx) : _ctx(ctx), _symbolTable(ctx), _result(new MergedFile()), - _fileIndex(0) {} + _memberOrdinal(1), _fileIndex(0) {} // InputFiles::Handler methods void doDefinedAtom(const DefinedAtom&); @@ -91,6 +91,7 @@ llvm::DenseSet _deadAtoms; std::unique_ptr _result; llvm::DenseMap> _reverseRef; + uint64_t _memberOrdinal; // --start-group and --end-group std::vector _files; Index: lib/Core/LinkingContext.cpp =================================================================== --- lib/Core/LinkingContext.cpp +++ lib/Core/LinkingContext.cpp @@ -25,7 +25,7 @@ _warnIfCoalesableAtomsHaveDifferentLoadName(false), _printRemainingUndefines(true), _allowRemainingUndefines(false), _logInputFiles(false), _allowShlibUndefines(false), - _outputFileType(OutputFileType::Default), _nextOrdinal(0) {} + _outputFileType(OutputFileType::Default), _nextFileOrdinal(1) {} LinkingContext::~LinkingContext() {} Index: lib/Core/Resolver.cpp =================================================================== --- lib/Core/Resolver.cpp +++ lib/Core/Resolver.cpp @@ -81,7 +81,7 @@ forEachUndefines(searchForOverrides, [&](StringRef undefName, bool dataSymbolOnly) { if (const File *member = archiveFile->find(undefName, dataSymbolOnly)) { - member->setOrdinal(_ctx.getNextOrdinalAndIncrement()); + member->setOrdinal(archiveFile->ordinal() + _memberOrdinal++); const_cast(member)->beforeLink(); undefAdded = handleFile(*member) || undefAdded; } @@ -310,17 +310,17 @@ break; seen.insert(file); assert(!file->hasOrdinal()); - file->setOrdinal(_ctx.getNextOrdinalAndIncrement()); + file->setOrdinal(_ctx.nextFileOrdinal()); undefAdded = handleFile(*file); break; case File::kindArchiveLibrary: if (!file->hasOrdinal()) - file->setOrdinal(_ctx.getNextOrdinalAndIncrement()); + file->setOrdinal(_ctx.nextFileOrdinal()); undefAdded = handleArchiveFile(*file); break; case File::kindSharedLibrary: if (!file->hasOrdinal()) - file->setOrdinal(_ctx.getNextOrdinalAndIncrement()); + file->setOrdinal(_ctx.nextFileOrdinal()); handleSharedLibrary(*file); break; } Index: lib/ReaderWriter/ELF/AArch64/AArch64RelocationPass.cpp =================================================================== --- lib/ReaderWriter/ELF/AArch64/AArch64RelocationPass.cpp +++ lib/ReaderWriter/ELF/AArch64/AArch64RelocationPass.cpp @@ -98,7 +98,7 @@ class ELFPassFile : public SimpleFile { public: ELFPassFile(const ELFLinkingContext &eti) : SimpleFile("ELFPassFile") { - setOrdinal(eti.getNextOrdinalAndIncrement()); + setOrdinal(eti.nextFileOrdinal()); } llvm::BumpPtrAllocator _alloc; Index: lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp =================================================================== --- lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp +++ lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp @@ -107,7 +107,7 @@ class ELFPassFile : public SimpleFile { public: ELFPassFile(const ELFLinkingContext &eti) : SimpleFile("ELFPassFile") { - setOrdinal(eti.getNextOrdinalAndIncrement()); + setOrdinal(eti.nextFileOrdinal()); } llvm::BumpPtrAllocator _alloc; Index: lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp +++ lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp @@ -128,7 +128,7 @@ class ELFPassFile : public SimpleFile { public: ELFPassFile(const ELFLinkingContext &eti) : SimpleFile("ELFPassFile") { - setOrdinal(eti.getNextOrdinalAndIncrement()); + setOrdinal(eti.nextFileOrdinal()); } llvm::BumpPtrAllocator _alloc; Index: lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp =================================================================== --- lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp +++ lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp @@ -246,7 +246,7 @@ public: RelocationPassFile(const ELFLinkingContext &ctx) : SimpleFile("RelocationPassFile") { - setOrdinal(ctx.getNextOrdinalAndIncrement()); + setOrdinal(ctx.nextFileOrdinal()); } llvm::BumpPtrAllocator _alloc; Index: lib/ReaderWriter/ELF/X86_64/X86_64RelocationPass.cpp =================================================================== --- lib/ReaderWriter/ELF/X86_64/X86_64RelocationPass.cpp +++ lib/ReaderWriter/ELF/X86_64/X86_64RelocationPass.cpp @@ -98,7 +98,7 @@ class ELFPassFile : public SimpleFile { public: ELFPassFile(const ELFLinkingContext &eti) : SimpleFile("ELFPassFile") { - setOrdinal(eti.getNextOrdinalAndIncrement()); + setOrdinal(eti.nextFileOrdinal()); } llvm::BumpPtrAllocator _alloc; Index: lib/ReaderWriter/PECOFF/Atoms.h =================================================================== --- lib/ReaderWriter/PECOFF/Atoms.h +++ lib/ReaderWriter/PECOFF/Atoms.h @@ -328,7 +328,7 @@ public: VirtualFile(const LinkingContext &ctx) : SimpleFile(""), _nextOrdinal(0) { - setOrdinal(ctx.getNextOrdinalAndIncrement()); + setOrdinal(ctx.nextFileOrdinal()); } uint64_t getNextOrdinal() { return _nextOrdinal++; } Index: test/mach-o/library-rescan.yaml =================================================================== --- test/mach-o/library-rescan.yaml +++ test/mach-o/library-rescan.yaml @@ -42,5 +42,5 @@ ... # CHECK: {{[0-9a-f]+}} (__TEXT,__text) external _main -# CHECK: {{[0-9a-f]+}} (__TEXT,__text) external _bar # CHECK: {{[0-9a-f]+}} (__TEXT,__text) external _foo +# CHECK: {{[0-9a-f]+}} (__TEXT,__text) external _bar