summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2015-03-04 04:36:46 +0000
committerRui Ueyama <ruiu@google.com>2015-03-04 04:36:46 +0000
commit394d10e34d01415897b6af28f7fceaeb5a9088f2 (patch)
tree350d1297c7b263fba845af6a4621be8de04d883a
parentb480296e6cb4a2cc5d5f588e35d4148f8770fea9 (diff)
downloadbcm5719-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
-rw-r--r--lld/include/lld/Core/ArchiveLibraryFile.h2
-rw-r--r--lld/include/lld/Core/Resolver.h6
-rw-r--r--lld/lib/Core/Resolver.cpp14
-rw-r--r--lld/lib/ReaderWriter/FileArchive.cpp20
-rw-r--r--lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp2
-rw-r--r--lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h4
-rw-r--r--lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp6
7 files changed, 27 insertions, 27 deletions
diff --git a/lld/include/lld/Core/ArchiveLibraryFile.h b/lld/include/lld/Core/ArchiveLibraryFile.h
index a3d6dc3b42d..7f9914eabaa 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<std::unique_ptr<File>> &result) = 0;
diff --git a/lld/include/lld/Core/Resolver.h b/lld/include/lld/Core/Resolver.h
index a90702eb580..12948ba1baa 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 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;
}
OpenPOWER on IntegriCloud