diff options
| author | Rui Ueyama <ruiu@google.com> | 2015-03-04 04:36:46 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2015-03-04 04:36:46 +0000 |
| commit | 394d10e34d01415897b6af28f7fceaeb5a9088f2 (patch) | |
| tree | 350d1297c7b263fba845af6a4621be8de04d883a /lld/lib | |
| parent | b480296e6cb4a2cc5d5f588e35d4148f8770fea9 (diff) | |
| download | bcm5719-llvm-394d10e34d01415897b6af28f7fceaeb5a9088f2.tar.gz bcm5719-llvm-394d10e34d01415897b6af28f7fceaeb5a9088f2.zip | |
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
Diffstat (limited to 'lld/lib')
| -rw-r--r-- | lld/lib/Core/Resolver.cpp | 14 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/FileArchive.cpp | 20 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp | 2 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h | 4 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp | 6 |
5 files changed, 23 insertions, 23 deletions
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp index 4e5ea0134d6..13b48c7e42e 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<ArchiveLibraryFile>(&file); +bool Resolver::handleArchiveFile(File &file) { + ArchiveLibraryFile *archiveFile = cast<ArchiveLibraryFile>(&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<File *>(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<SharedLibraryFile>(&file); + SharedLibraryFile *sharedLibrary = cast<SharedLibraryFile>(&file); handleFile(*sharedLibrary); bool searchForOverrides = _ctx.searchSharedLibrariesToOverrideTentativeDefinitions(); diff --git a/lld/lib/ReaderWriter/FileArchive.cpp b/lld/lib/ReaderWriter/FileArchive.cpp index 87526ff2870..3f38814ae18 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<std::mutex> lock(_mutex); auto it = _preloaded.find(memberStart); if (it != _preloaded.end()) { - std::unique_ptr<Future<const File *>> &p = it->second; - Future<const File *> *future = p.get(); + std::unique_ptr<Future<File *>> &p = it->second; + Future<File *> *future = p.get(); return future->get(); } } @@ -94,8 +94,8 @@ public: return; // Instantiate the member - auto *future = new Future<const File *>(); - _preloaded[memberStart] = std::unique_ptr<Future<const File *>>(future); + auto *future = new Future<File *>(); + _preloaded[memberStart] = std::unique_ptr<Future<File *>>(future); group.spawn([=] { std::unique_ptr<File> result; @@ -249,16 +249,16 @@ private: std::shared_ptr<MemoryBuffer> _mb; const Registry &_registry; std::unique_ptr<Archive> _archive; - mutable MemberMap _symbolMemberMap; - mutable InstantiatedSet _membersInstantiated; + MemberMap _symbolMemberMap; + InstantiatedSet _membersInstantiated; atom_collection_vector<DefinedAtom> _definedAtoms; atom_collection_vector<UndefinedAtom> _undefinedAtoms; atom_collection_vector<SharedLibraryAtom> _sharedLibraryAtoms; atom_collection_vector<AbsoluteAtom> _absoluteAtoms; bool _logLoading; - mutable std::vector<std::unique_ptr<MemoryBuffer>> _memberBuffers; - mutable std::map<const char *, std::unique_ptr<Future<const File *>>> _preloaded; - mutable std::mutex _mutex; + std::vector<std::unique_ptr<MemoryBuffer>> _memberBuffers; + std::map<const char *, std::unique_ptr<Future<File *>>> _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 628cb5ad01d..cd562de216d 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 81e306a9081..caffc3ed1b3 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 be653c5ea2c..6f57faee2dc 100644 --- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp +++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp @@ -620,16 +620,16 @@ template <> struct MappingTraits<const lld::File *> { const atom_collection<lld::AbsoluteAtom> &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<File *>(member._content); switch (atom->contentType()) { case lld::DefinedAtom::typeData: case lld::DefinedAtom::typeZeroFill: - return member._content; + return const_cast<File *>(member._content); default: break; } |

