From 394d10e34d01415897b6af28f7fceaeb5a9088f2 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Wed, 4 Mar 2015 04:36:46 +0000 Subject: [PATCH] Make File non-const in the resolver. File objects are not really const in the resolver. We set ordinals to them and call beforeLink hooks. Also, File's member functions marked as const are not really const. ArchiveFile never returns the same member file twice, so it remembers files returned before. find() has side effects. In order to deal with the inconsistencies, we sprinkled const_casts and marked member varaibles as mutable. This patch removes const from there to reflect the reality. llvm-svn: 231212 --- lld/include/lld/Core/ArchiveLibraryFile.h | 2 +- lld/include/lld/Core/Resolver.h | 6 +++--- lld/lib/Core/Resolver.cpp | 14 +++++++------- lld/lib/ReaderWriter/FileArchive.cpp | 20 ++++++++++---------- lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp | 2 +- .../ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h | 4 ++-- lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp | 6 +++--- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/lld/include/lld/Core/ArchiveLibraryFile.h b/lld/include/lld/Core/ArchiveLibraryFile.h index a3d6dc3..7f9914e 100644 --- a/lld/include/lld/Core/ArchiveLibraryFile.h +++ b/lld/include/lld/Core/ArchiveLibraryFile.h @@ -33,7 +33,7 @@ public: /// Check if any member of the archive contains an Atom with the /// specified name and return the File object for that member, or nullptr. - virtual const File *find(StringRef name, bool dataSymbolOnly) const = 0; + virtual File *find(StringRef name, bool dataSymbolOnly) = 0; virtual std::error_code parseAllMembers(std::vector> &result) = 0; diff --git a/lld/include/lld/Core/Resolver.h b/lld/include/lld/Core/Resolver.h index a90702e..12948ba 100644 --- a/lld/include/lld/Core/Resolver.h +++ b/lld/include/lld/Core/Resolver.h @@ -41,13 +41,13 @@ public: // Handle files, this adds atoms from the current file thats // being processed by the resolver - bool handleFile(const File &); + bool handleFile(File &); // Handle an archive library file. - bool handleArchiveFile(const File &); + bool handleArchiveFile(File &); // Handle a shared library file. - void handleSharedLibrary(const File &); + void handleSharedLibrary(File &); /// @brief do work of merging and resolving and return list bool resolve(); diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp index 4e5ea01..13b48c7 100644 --- a/lld/lib/Core/Resolver.cpp +++ b/lld/lib/Core/Resolver.cpp @@ -27,7 +27,7 @@ namespace lld { -bool Resolver::handleFile(const File &file) { +bool Resolver::handleFile(File &file) { bool undefAdded = false; for (const DefinedAtom *atom : file.defined()) doDefinedAtom(*atom); @@ -73,25 +73,25 @@ void Resolver::forEachUndefines(bool searchForOverrides, } while (undefineGenCount != _symbolTable.size()); } -bool Resolver::handleArchiveFile(const File &file) { - const ArchiveLibraryFile *archiveFile = cast(&file); +bool Resolver::handleArchiveFile(File &file) { + ArchiveLibraryFile *archiveFile = cast(&file); bool searchForOverrides = _ctx.searchArchivesToOverrideTentativeDefinitions(); bool undefAdded = false; forEachUndefines(searchForOverrides, [&](StringRef undefName, bool dataSymbolOnly) { - if (const File *member = archiveFile->find(undefName, dataSymbolOnly)) { + if (File *member = archiveFile->find(undefName, dataSymbolOnly)) { member->setOrdinal(_ctx.getNextOrdinalAndIncrement()); - const_cast(member)->beforeLink(); + member->beforeLink(); undefAdded = handleFile(*member) || undefAdded; } }); return undefAdded; } -void Resolver::handleSharedLibrary(const File &file) { +void Resolver::handleSharedLibrary(File &file) { // Add all the atoms from the shared library - const SharedLibraryFile *sharedLibrary = cast(&file); + SharedLibraryFile *sharedLibrary = cast(&file); handleFile(*sharedLibrary); bool searchForOverrides = _ctx.searchSharedLibrariesToOverrideTentativeDefinitions(); diff --git a/lld/lib/ReaderWriter/FileArchive.cpp b/lld/lib/ReaderWriter/FileArchive.cpp index 87526ff..3f38814 100644 --- a/lld/lib/ReaderWriter/FileArchive.cpp +++ b/lld/lib/ReaderWriter/FileArchive.cpp @@ -43,7 +43,7 @@ public: /// \brief Check if any member of the archive contains an Atom with the /// specified name and return the File object for that member, or nullptr. - const File *find(StringRef name, bool dataSymbolOnly) const override { + File *find(StringRef name, bool dataSymbolOnly) override { auto member = _symbolMemberMap.find(name); if (member == _symbolMemberMap.end()) return nullptr; @@ -63,8 +63,8 @@ public: std::lock_guard lock(_mutex); auto it = _preloaded.find(memberStart); if (it != _preloaded.end()) { - std::unique_ptr> &p = it->second; - Future *future = p.get(); + std::unique_ptr> &p = it->second; + Future *future = p.get(); return future->get(); } } @@ -94,8 +94,8 @@ public: return; // Instantiate the member - auto *future = new Future(); - _preloaded[memberStart] = std::unique_ptr>(future); + auto *future = new Future(); + _preloaded[memberStart] = std::unique_ptr>(future); group.spawn([=] { std::unique_ptr result; @@ -249,16 +249,16 @@ private: std::shared_ptr _mb; const Registry &_registry; std::unique_ptr _archive; - mutable MemberMap _symbolMemberMap; - mutable InstantiatedSet _membersInstantiated; + MemberMap _symbolMemberMap; + InstantiatedSet _membersInstantiated; atom_collection_vector _definedAtoms; atom_collection_vector _undefinedAtoms; atom_collection_vector _sharedLibraryAtoms; atom_collection_vector _absoluteAtoms; bool _logLoading; - mutable std::vector> _memberBuffers; - mutable std::map>> _preloaded; - mutable std::mutex _mutex; + std::vector> _memberBuffers; + std::map>> _preloaded; + std::mutex _mutex; }; class ArchiveReader : public Reader { diff --git a/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp index 628cb5a..cd562de 100644 --- a/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp +++ b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp @@ -95,7 +95,7 @@ public: return std::error_code(); } - const File *find(StringRef sym, bool dataSymbolOnly) const override { + File *find(StringRef sym, bool dataSymbolOnly) override { if (sym.equals("___dso_handle") || sym.equals(_machHeaderSymbolName)) { _definedAtoms._atoms.push_back(new (allocator()) MachODefinedAtom( *this, sym, DefinedAtom::scopeLinkageUnit, diff --git a/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h b/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h index 81e306a..caffc3e 100644 --- a/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h +++ b/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h @@ -159,7 +159,7 @@ public: : VirtualArchiveLibraryFile("__imp_"), _is64(ctx.is64Bit()), _ordinal(0) {} - const File *find(StringRef sym, bool dataSymbolOnly) const override { + File *find(StringRef sym, bool dataSymbolOnly) override { std::string prefix = "__imp_"; if (!sym.startswith(prefix)) return nullptr; @@ -212,7 +212,7 @@ public: _exportedSyms.insert(desc.name); } - const File *find(StringRef sym, bool dataSymbolOnly) const override { + File *find(StringRef sym, bool dataSymbolOnly) override { typedef PECOFFLinkingContext::ExportDesc ExportDesc; if (_exportedSyms.count(sym) == 0) return nullptr; diff --git a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp index be653c5..6f57fae 100644 --- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp +++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp @@ -620,16 +620,16 @@ template <> struct MappingTraits { const atom_collection &absolute() const override { return _noAbsoluteAtoms; } - const File *find(StringRef name, bool dataSymbolOnly) const override { + File *find(StringRef name, bool dataSymbolOnly) override { for (const ArchMember &member : _members) { for (const lld::DefinedAtom *atom : member._content->defined()) { if (name == atom->name()) { if (!dataSymbolOnly) - return member._content; + return const_cast(member._content); switch (atom->contentType()) { case lld::DefinedAtom::typeData: case lld::DefinedAtom::typeZeroFill: - return member._content; + return const_cast(member._content); default: break; } -- 2.7.4