[lld] r231212 - Make File non-const in the resolver.

Rui Ueyama ruiu at google.com
Tue Mar 3 20:36:46 PST 2015


Author: ruiu
Date: Tue Mar  3 22:36:46 2015
New Revision: 231212

URL: http://llvm.org/viewvc/llvm-project?rev=231212&view=rev
Log:
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.

Modified:
    lld/trunk/include/lld/Core/ArchiveLibraryFile.h
    lld/trunk/include/lld/Core/Resolver.h
    lld/trunk/lib/Core/Resolver.cpp
    lld/trunk/lib/ReaderWriter/FileArchive.cpp
    lld/trunk/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
    lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
    lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp

Modified: lld/trunk/include/lld/Core/ArchiveLibraryFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/ArchiveLibraryFile.h?rev=231212&r1=231211&r2=231212&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/ArchiveLibraryFile.h (original)
+++ lld/trunk/include/lld/Core/ArchiveLibraryFile.h Tue Mar  3 22:36:46 2015
@@ -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<std::unique_ptr<File>> &result) = 0;

Modified: lld/trunk/include/lld/Core/Resolver.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Resolver.h?rev=231212&r1=231211&r2=231212&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/Resolver.h (original)
+++ lld/trunk/include/lld/Core/Resolver.h Tue Mar  3 22:36:46 2015
@@ -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();

Modified: lld/trunk/lib/Core/Resolver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/Resolver.cpp?rev=231212&r1=231211&r2=231212&view=diff
==============================================================================
--- lld/trunk/lib/Core/Resolver.cpp (original)
+++ lld/trunk/lib/Core/Resolver.cpp Tue Mar  3 22:36:46 2015
@@ -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 sea
   } 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();

Modified: lld/trunk/lib/ReaderWriter/FileArchive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/FileArchive.cpp?rev=231212&r1=231211&r2=231212&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/FileArchive.cpp (original)
+++ lld/trunk/lib/ReaderWriter/FileArchive.cpp Tue Mar  3 22:36:46 2015
@@ -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 {

Modified: lld/trunk/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ExecutableAtoms.hpp?rev=231212&r1=231211&r2=231212&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ExecutableAtoms.hpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ExecutableAtoms.hpp Tue Mar  3 22:36:46 2015
@@ -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,

Modified: lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h?rev=231212&r1=231211&r2=231212&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h Tue Mar  3 22:36:46 2015
@@ -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;

Modified: lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp?rev=231212&r1=231211&r2=231212&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp (original)
+++ lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp Tue Mar  3 22:36:46 2015
@@ -620,16 +620,16 @@ template <> struct MappingTraits<const l
     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;
             }





More information about the llvm-commits mailing list