[lld] r208427 - temporary commit.
Rui Ueyama
ruiu at google.com
Fri May 9 09:35:23 PDT 2014
Author: ruiu
Date: Fri May 9 11:35:23 2014
New Revision: 208427
URL: http://llvm.org/viewvc/llvm-project?rev=208427&view=rev
Log:
temporary commit.
Modified:
lld/trunk/include/lld/Core/ArchiveLibraryFile.h
lld/trunk/include/lld/Core/InputGraph.h
lld/trunk/lib/Core/InputGraph.cpp
lld/trunk/lib/Driver/WinLinkDriver.cpp
lld/trunk/lib/ReaderWriter/FileArchive.cpp
lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
Modified: lld/trunk/include/lld/Core/ArchiveLibraryFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/ArchiveLibraryFile.h?rev=208427&r1=208426&r2=208427&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/ArchiveLibraryFile.h (original)
+++ lld/trunk/include/lld/Core/ArchiveLibraryFile.h Fri May 9 11:35:23 2014
@@ -12,6 +12,8 @@
#include "lld/Core/File.h"
+#include <set>
+
namespace lld {
///
@@ -36,6 +38,10 @@ public:
virtual error_code
parseAllMembers(std::vector<std::unique_ptr<File>> &result) const = 0;
+ virtual std::set<StringRef> getDefinedSymbols() const {
+ return std::set<StringRef>();
+ }
+
protected:
/// only subclasses of ArchiveLibraryFile can be instantiated
ArchiveLibraryFile(StringRef path) : File(path, kindArchiveLibrary) {}
Modified: lld/trunk/include/lld/Core/InputGraph.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/InputGraph.h?rev=208427&r1=208426&r2=208427&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/InputGraph.h (original)
+++ lld/trunk/include/lld/Core/InputGraph.h Fri May 9 11:35:23 2014
@@ -23,6 +23,7 @@
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
+#include <functional>
#include <memory>
#include <stack>
#include <vector>
@@ -67,6 +68,11 @@ public:
/// whether it should iterate over again or terminate or not.
void notifyProgress();
+ /// Adds an observer of getNextFile(). Each time a new file is about to be
+ /// returned from getNextFile(), registered observers are called with the file
+ /// being returned.
+ void registerObserver(std::function<void(File*)> &fn);
+
/// \brief Adds a node into the InputGraph
void addInputElement(std::unique_ptr<InputElement>);
@@ -93,6 +99,7 @@ protected:
// Index of the next element to be processed
uint32_t _nextElementIndex;
InputElement *_currentInputElement;
+ std::vector<std::function<void(File *)>> _observers;
private:
ErrorOr<InputElement *> getNextInputElement();
Modified: lld/trunk/lib/Core/InputGraph.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/InputGraph.cpp?rev=208427&r1=208426&r2=208427&view=diff
==============================================================================
--- lld/trunk/lib/Core/InputGraph.cpp (original)
+++ lld/trunk/lib/Core/InputGraph.cpp Fri May 9 11:35:23 2014
@@ -21,9 +21,12 @@ ErrorOr<File &> InputGraph::getNextFile(
// it will succeed. If not, try to get the next file in the input graph.
for (;;) {
if (_currentInputElement) {
- ErrorOr<File &> nextFile = _currentInputElement->getNextFile();
- if (nextFile.getError() != InputGraphError::no_more_files)
- return std::move(nextFile);
+ ErrorOr<File &> next = _currentInputElement->getNextFile();
+ if (next.getError() != InputGraphError::no_more_files) {
+ for (std::function<void(File*)> &observer : _observers)
+ observer(&next.get());
+ return std::move(next);
+ }
}
ErrorOr<InputElement *> elt = getNextInputElement();
@@ -35,6 +38,10 @@ ErrorOr<File &> InputGraph::getNextFile(
void InputGraph::notifyProgress() { _currentInputElement->notifyProgress(); }
+void InputGraph::registerObserver(std::function<void(File*)> &fn) {
+ _observers.push_back(fn);
+}
+
void InputGraph::addInputElement(std::unique_ptr<InputElement> ie) {
_inputArgs.push_back(std::move(ie));
}
Modified: lld/trunk/lib/Driver/WinLinkDriver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkDriver.cpp?rev=208427&r1=208426&r2=208427&view=diff
==============================================================================
--- lld/trunk/lib/Driver/WinLinkDriver.cpp (original)
+++ lld/trunk/lib/Driver/WinLinkDriver.cpp Fri May 9 11:35:23 2014
@@ -13,10 +13,12 @@
///
//===----------------------------------------------------------------------===//
+#include "lld/Core/ArchiveLibraryFile.h"
#include "lld/Driver/Driver.h"
#include "lld/Driver/WinLinkInputGraph.h"
#include "lld/Driver/WinLinkModuleDef.h"
#include "lld/ReaderWriter/PECOFFLinkingContext.h"
+#include "../ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/Optional.h"
@@ -34,6 +36,7 @@
#include <algorithm>
#include <cctype>
+#include <functional>
#include <map>
#include <memory>
#include <sstream>
@@ -1293,6 +1296,19 @@ bool WinLinkDriver::parse(int argc, cons
}
}
+ if (!isReadingDirectiveSection) {
+ std::unique_ptr<SimpleFileNode> node(new SimpleFileNode("<export>"));
+ pecoff::ExportedSymbolRenameFile *renameFile =
+ new pecoff::ExportedSymbolRenameFile(ctx);
+ node->appendInputFile(std::unique_ptr<File>(renameFile));
+ ctx.getLibraryGroup()->addFile(std::move(node));
+ std::function<void(File *)> observer = [=](File *file) {
+ if (auto *archive = dyn_cast<ArchiveLibraryFile>(file))
+ renameFile->addResolvableSymbols(archive);
+ };
+ ctx.getInputGraph().registerObserver(observer);
+ }
+
// Validate the combination of options used.
return ctx.validate(diag);
}
Modified: lld/trunk/lib/ReaderWriter/FileArchive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/FileArchive.cpp?rev=208427&r1=208426&r2=208427&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/FileArchive.cpp (original)
+++ lld/trunk/lib/ReaderWriter/FileArchive.cpp Fri May 9 11:35:23 2014
@@ -97,6 +97,16 @@ public:
return _absoluteAtoms;
}
+ /// Returns a set of all defined symbols in the archive.
+ std::set<StringRef> getDefinedSymbols() const override {
+ std::set<StringRef> ret;
+ for (const auto &e : _symbolMemberMap) {
+ StringRef sym = e.first;
+ ret.insert(sym);
+ }
+ return ret;
+ }
+
protected:
error_code
instantiateMember(Archive::child_iterator member,
Modified: lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h?rev=208427&r1=208426&r2=208427&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h Fri May 9 11:35:23 2014
@@ -13,6 +13,9 @@
#include "lld/ReaderWriter/PECOFFLinkingContext.h"
#include "lld/ReaderWriter/Simple.h"
#include "llvm/Support/Allocator.h"
+#include "llvm/Support/Debug.h"
+
+#include <mutex>
namespace lld {
namespace pecoff {
@@ -86,6 +89,18 @@ private:
atom_collection_vector<AbsoluteAtom> _absoluteAtoms;
};
+class SymbolRenameFile : public SimpleFile {
+public:
+ SymbolRenameFile(StringRef from, StringRef to)
+ : SimpleFile("<symbol-rename>"), _to(*this, to), _from(*this, from, &_to) {
+ addAtom(_from);
+ };
+
+private:
+ COFFUndefinedAtom _to;
+ COFFUndefinedAtom _from;
+};
+
} // anonymous namespace
// A virtual file containing absolute symbol __ImageBase. __ImageBase (or
@@ -141,5 +156,51 @@ private:
mutable llvm::BumpPtrAllocator _alloc;
};
+class ExportedSymbolRenameFile : public VirtualArchiveLibraryFile {
+public:
+ ExportedSymbolRenameFile(const PECOFFLinkingContext &ctx)
+ : VirtualArchiveLibraryFile("<export>") {
+ for (const PECOFFLinkingContext::ExportDesc &desc : ctx.getDllExports())
+ _exportedSyms.insert(desc.name);
+ }
+
+ void addResolvableSymbols(ArchiveLibraryFile *archive) {
+ std::lock_guard<std::mutex> lock(_mutex);
+ if (_seen.count(archive) > 0)
+ return;
+ _seen.insert(archive);
+ for (const std::string &sym : archive->getDefinedSymbols())
+ _resolvableSyms.insert(sym);
+ }
+
+ const File *find(StringRef sym, bool dataSymbolOnly) const override {
+ if (_exportedSyms.count(sym) == 0)
+ return nullptr;
+ std::string expsym = sym;
+ expsym.append("@");
+ auto it = _resolvableSyms.lower_bound(expsym);
+ for (auto e = _resolvableSyms.end(); it != e; ++it) {
+ if (!StringRef(*it).startswith(expsym))
+ return nullptr;
+ if (it->size() == expsym.size())
+ continue;
+ StringRef suffix = it->substr(expsym.size());
+ bool digitSuffix =
+ suffix.find_first_not_of("0123456789") == StringRef::npos;
+ if (digitSuffix) {
+ return new (_alloc) SymbolRenameFile(sym, *it);
+ }
+ }
+ return nullptr;
+ }
+
+private:
+ std::set<std::string> _exportedSyms;
+ std::set<std::string> _resolvableSyms;
+ std::set<ArchiveLibraryFile *> _seen;
+ mutable std::mutex _mutex;
+ mutable llvm::BumpPtrAllocator _alloc;
+};
+
} // end namespace pecoff
} // end namespace lld
More information about the llvm-commits
mailing list