[lld] r196563 - Move definitions to cpp file. No functionality change.
Rui Ueyama
ruiu at google.com
Thu Dec 5 20:43:02 PST 2013
Author: ruiu
Date: Thu Dec 5 22:43:01 2013
New Revision: 196563
URL: http://llvm.org/viewvc/llvm-project?rev=196563&view=rev
Log:
Move definitions to cpp file. No functionality change.
Added:
lld/trunk/lib/ReaderWriter/FileArchive.cpp
Modified:
lld/trunk/include/lld/ReaderWriter/FileArchive.h
lld/trunk/lib/ReaderWriter/CMakeLists.txt
Modified: lld/trunk/include/lld/ReaderWriter/FileArchive.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/FileArchive.h?rev=196563&r1=196562&r2=196563&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/FileArchive.h (original)
+++ lld/trunk/include/lld/ReaderWriter/FileArchive.h Thu Dec 5 22:43:01 2013
@@ -6,13 +6,12 @@
// License. See LICENSE.TXT for details.
//
//===---------------------------------------------------------------------===//
+
#ifndef LLD_READER_WRITER_FILE_ARCHIVE_H
#define LLD_READER_WRITER_FILE_ARCHIVE_H
#include "lld/Core/ArchiveLibraryFile.h"
-#include "llvm/ADT/Hashing.h"
-#include "llvm/Object/ObjectFile.h"
#include "llvm/Object/Archive.h"
#include "llvm/Support/MemoryBuffer.h"
@@ -23,115 +22,26 @@ namespace lld {
/// \brief The FileArchive class represents an Archive Library file
class FileArchive : public ArchiveLibraryFile {
public:
+ FileArchive(const LinkingContext &context, std::unique_ptr<MemoryBuffer> mb,
+ error_code &ec, bool isWholeArchive);
+ virtual ~FileArchive() {}
- virtual ~FileArchive() { }
-
- /// \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.
- virtual const File *find(StringRef name, bool dataSymbolOnly) const {
- auto member = _symbolMemberMap.find(name);
- if (member == _symbolMemberMap.end())
- return nullptr;
-
- llvm::object::Archive::child_iterator ci = member->second;
-
- if (dataSymbolOnly) {
- OwningPtr<MemoryBuffer> buff;
- if (ci->getMemoryBuffer(buff, true))
- return nullptr;
- if (isDataSymbol(buff.take(), name))
- return nullptr;
- }
-
- std::vector<std::unique_ptr<File>> result;
-
- OwningPtr<MemoryBuffer> buff;
- if (ci->getMemoryBuffer(buff, true))
- return nullptr;
- if (_context.logInputFiles())
- llvm::outs() << buff->getBufferIdentifier() << "\n";
- std::unique_ptr<MemoryBuffer> mb(buff.take());
- if (_context.getDefaultReader().parseFile(mb, result))
- return nullptr;
-
- assert(result.size() == 1);
-
- // give up the pointer so that this object no longer manages it
- return result[0].release();
- }
+ virtual const File *find(StringRef name, bool dataSymbolOnly) const;
- /// \brief Load all members of the archive ?
+ /// \brief Load all members of the archive?
virtual bool isWholeArchive() const { return _isWholeArchive; }
/// \brief parse each member
virtual error_code
- parseAllMembers(std::vector<std::unique_ptr<File>> &result) const {
- for (auto mf = _archive->begin_children(),
- me = _archive->end_children(); mf != me; ++mf) {
- OwningPtr<MemoryBuffer> buff;
- error_code ec;
- if ((ec = mf->getMemoryBuffer(buff, true)))
- return ec;
- if (_context.logInputFiles())
- llvm::outs() << buff->getBufferIdentifier() << "\n";
- std::unique_ptr<MemoryBuffer> mbc(buff.take());
- if ((ec = _context.getDefaultReader().parseFile(mbc, result)))
- return ec;
- }
- return error_code::success();
- }
-
- virtual const atom_collection<DefinedAtom> &defined() const {
- return _definedAtoms;
- }
-
- virtual const atom_collection<UndefinedAtom> &undefined() const {
- return _undefinedAtoms;
- }
-
- virtual const atom_collection<SharedLibraryAtom> &sharedLibrary() const {
- return _sharedLibraryAtoms;
- }
-
- virtual const atom_collection<AbsoluteAtom> &absolute() const {
- return _absoluteAtoms;
- }
+ parseAllMembers(std::vector<std::unique_ptr<File> > &result) const;
+
+ virtual const atom_collection<DefinedAtom> &defined() const;
+ virtual const atom_collection<UndefinedAtom> &undefined() const;
+ virtual const atom_collection<SharedLibraryAtom> &sharedLibrary() const;
+ virtual const atom_collection<AbsoluteAtom> &absolute() const;
protected:
- error_code isDataSymbol(MemoryBuffer *mb, StringRef symbol) const {
- std::unique_ptr<llvm::object::ObjectFile>
- obj(llvm::object::ObjectFile::createObjectFile(mb));
- error_code ec;
- llvm::object::SymbolRef::Type symtype;
- uint32_t symflags;
- llvm::object::symbol_iterator ibegin = obj->begin_symbols();
- llvm::object::symbol_iterator iend = obj->end_symbols();
- StringRef symbolname;
-
- for (llvm::object::symbol_iterator i = ibegin; i != iend; i.increment(ec)) {
- if (ec) return ec;
-
- // Get symbol name
- if ((ec = (i->getName(symbolname)))) return ec;
-
- if (symbolname != symbol)
- continue;
-
- // Get symbol flags
- if ((ec = (i->getFlags(symflags)))) return ec;
-
- if (symflags <= llvm::object::SymbolRef::SF_Undefined)
- continue;
-
- // Get Symbol Type
- if ((ec = (i->getType(symtype)))) return ec;
-
- if (symtype == llvm::object::SymbolRef::ST_Data) {
- return error_code::success();
- }
- }
- return llvm::object::object_error::parse_failed;
- }
+ error_code isDataSymbol(MemoryBuffer *mb, StringRef symbol) const;
private:
std::unique_ptr<llvm::object::Archive> _archive;
@@ -142,33 +52,7 @@ private:
bool _isWholeArchive;
std::unordered_map<StringRef, llvm::object::Archive::child_iterator>
_symbolMemberMap;
-
-public:
- /// only subclasses of ArchiveLibraryFile can be instantiated
- FileArchive(const LinkingContext &context,
- std::unique_ptr<MemoryBuffer> mb, error_code &ec,
- bool isWholeArchive)
- : ArchiveLibraryFile(context, mb->getBufferIdentifier()),
- _isWholeArchive(isWholeArchive) {
- std::unique_ptr<llvm::object::Archive> archive_obj(
- new llvm::object::Archive(mb.release(), ec));
- if (ec)
- return;
- _archive.swap(archive_obj);
-
- // Cache symbols.
- for (auto i = _archive->begin_symbols(), e = _archive->end_symbols();
- i != e; ++i) {
- StringRef name;
- llvm::object::Archive::child_iterator member;
- if ((ec = i->getName(name)))
- return;
- if ((ec = i->getMember(member)))
- return;
- _symbolMemberMap[name] = member;
- }
- }
-}; // class FileArchive
+};
} // end namespace lld
Modified: lld/trunk/lib/ReaderWriter/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/CMakeLists.txt?rev=196563&r1=196562&r2=196563&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/CMakeLists.txt (original)
+++ lld/trunk/lib/ReaderWriter/CMakeLists.txt Thu Dec 5 22:43:01 2013
@@ -7,6 +7,7 @@ add_subdirectory(PECOFF)
add_subdirectory(YAML)
add_lld_library(lldReaderWriter
CoreLinkingContext.cpp
+ FileArchive.cpp
LinkerScript.cpp
Reader.cpp
Writer.cpp
Added: lld/trunk/lib/ReaderWriter/FileArchive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/FileArchive.cpp?rev=196563&view=auto
==============================================================================
--- lld/trunk/lib/ReaderWriter/FileArchive.cpp (added)
+++ lld/trunk/lib/ReaderWriter/FileArchive.cpp Thu Dec 5 22:43:01 2013
@@ -0,0 +1,156 @@
+//===- lld/ReaderWriter/FileArchive.cpp - Archive Library File -----------===//
+//
+// The LLVM Linker
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===---------------------------------------------------------------------===//
+
+#include "lld/ReaderWriter/FileArchive.h"
+
+#include "llvm/ADT/Hashing.h"
+#include "llvm/Object/ObjectFile.h"
+#include "llvm/Object/Archive.h"
+#include "llvm/Support/MemoryBuffer.h"
+
+#include <unordered_map>
+
+namespace lld {
+
+/// \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 *FileArchive::find(StringRef name, bool dataSymbolOnly) const {
+ auto member = _symbolMemberMap.find(name);
+ if (member == _symbolMemberMap.end())
+ return nullptr;
+
+ llvm::object::Archive::child_iterator ci = member->second;
+
+ if (dataSymbolOnly) {
+ OwningPtr<MemoryBuffer> buff;
+ if (ci->getMemoryBuffer(buff, true))
+ return nullptr;
+ if (isDataSymbol(buff.take(), name))
+ return nullptr;
+ }
+
+ std::vector<std::unique_ptr<File> > result;
+
+ OwningPtr<MemoryBuffer> buff;
+ if (ci->getMemoryBuffer(buff, true))
+ return nullptr;
+ if (_context.logInputFiles())
+ llvm::outs() << buff->getBufferIdentifier() << "\n";
+ std::unique_ptr<MemoryBuffer> mb(buff.take());
+ if (_context.getDefaultReader().parseFile(mb, result))
+ return nullptr;
+
+ assert(result.size() == 1);
+
+ // give up the pointer so that this object no longer manages it
+ return result[0].release();
+}
+
+/// \brief parse each member
+error_code FileArchive::parseAllMembers(
+ std::vector<std::unique_ptr<File> > &result) const {
+ for (auto mf = _archive->begin_children(), me = _archive->end_children();
+ mf != me; ++mf) {
+ OwningPtr<MemoryBuffer> buff;
+ error_code ec;
+ if ((ec = mf->getMemoryBuffer(buff, true)))
+ return ec;
+ if (_context.logInputFiles())
+ llvm::outs() << buff->getBufferIdentifier() << "\n";
+ std::unique_ptr<MemoryBuffer> mbc(buff.take());
+ if ((ec = _context.getDefaultReader().parseFile(mbc, result)))
+ return ec;
+ }
+ return error_code::success();
+}
+
+const ArchiveLibraryFile::atom_collection<DefinedAtom> &
+FileArchive::defined() const {
+ return _definedAtoms;
+}
+
+const ArchiveLibraryFile::atom_collection<UndefinedAtom> &
+FileArchive::undefined() const {
+ return _undefinedAtoms;
+}
+
+const ArchiveLibraryFile::atom_collection<SharedLibraryAtom> &
+FileArchive::sharedLibrary() const {
+ return _sharedLibraryAtoms;
+}
+
+const ArchiveLibraryFile::atom_collection<AbsoluteAtom> &
+FileArchive::absolute() const {
+ return _absoluteAtoms;
+}
+
+error_code FileArchive::isDataSymbol(MemoryBuffer *mb, StringRef symbol) const {
+ std::unique_ptr<llvm::object::ObjectFile> obj(
+ llvm::object::ObjectFile::createObjectFile(mb));
+ error_code ec;
+ llvm::object::SymbolRef::Type symtype;
+ uint32_t symflags;
+ llvm::object::symbol_iterator ibegin = obj->begin_symbols();
+ llvm::object::symbol_iterator iend = obj->end_symbols();
+ StringRef symbolname;
+
+ for (llvm::object::symbol_iterator i = ibegin; i != iend; i.increment(ec)) {
+ if (ec)
+ return ec;
+
+ // Get symbol name
+ if ((ec = i->getName(symbolname)))
+ return ec;
+
+ if (symbolname != symbol)
+ continue;
+
+ // Get symbol flags
+ if ((ec = i->getFlags(symflags)))
+ return ec;
+
+ if (symflags <= llvm::object::SymbolRef::SF_Undefined)
+ continue;
+
+ // Get Symbol Type
+ if ((ec = (i->getType(symtype))))
+ return ec;
+
+ if (symtype == llvm::object::SymbolRef::ST_Data) {
+ return error_code::success();
+ }
+ }
+ return llvm::object::object_error::parse_failed;
+}
+
+FileArchive::FileArchive(const LinkingContext &context,
+ std::unique_ptr<MemoryBuffer> mb, error_code &ec,
+ bool isWholeArchive)
+ : ArchiveLibraryFile(context, mb->getBufferIdentifier()),
+ _isWholeArchive(isWholeArchive) {
+ std::unique_ptr<llvm::object::Archive> archive_obj(
+ new llvm::object::Archive(mb.release(), ec));
+ if (ec)
+ return;
+ _archive.swap(archive_obj);
+
+ // Cache symbols.
+ for (auto i = _archive->begin_symbols(), e = _archive->end_symbols(); i != e;
+ ++i) {
+ StringRef name;
+ llvm::object::Archive::child_iterator member;
+ if ((ec = i->getName(name)))
+ return;
+ if ((ec = i->getMember(member)))
+ return;
+ _symbolMemberMap[name] = member;
+ }
+}
+
+} // end namespace lld
More information about the llvm-commits
mailing list