diff options
author | Shih-wei Liao <sliao@google.com> | 2012-03-16 22:41:16 -0700 |
---|---|---|
committer | Shih-wei Liao <sliao@google.com> | 2012-03-17 03:32:25 -0700 |
commit | 5460a1f25d9ddecb5c70667267d66d51af177a99 (patch) | |
tree | d8a34be7ba631b703d871e4167f2ea5cab3910a2 /include/mcld/LD/GNUArchiveReader.h | |
parent | 7a83dfa572a3ae9da136c30c62f6d6cdab3dd064 (diff) | |
download | mclinker-5460a1f25d9ddecb5c70667267d66d51af177a99.tar.gz |
Linkloader improvement: mclinker.
Change-Id: I8805e39ccbc2ee204234fb3e71c70c906f3990bb
Diffstat (limited to 'include/mcld/LD/GNUArchiveReader.h')
-rw-r--r-- | include/mcld/LD/GNUArchiveReader.h | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/include/mcld/LD/GNUArchiveReader.h b/include/mcld/LD/GNUArchiveReader.h new file mode 100644 index 0000000..57aee10 --- /dev/null +++ b/include/mcld/LD/GNUArchiveReader.h @@ -0,0 +1,86 @@ +//===- GNUArchiveReader.h -------------------------------------------------===// +// +// The MCLinker Project +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#ifndef MCLD_GNU_ARCHIVE_READER_H +#define MCLD_GNU_ARCHIVE_READER_H +#ifdef ENABLE_UNITTEST +#include <gtest.h> +#endif + +#include "mcld/LD/ArchiveReader.h" +#include "mcld/Support/Path.h" +#include <llvm/ADT/OwningPtr.h> + +#include <vector> +#include <string> + +namespace llvm +{ +class MemoryBuffer; + +} + +namespace mcld +{ +class MCLDInfo; +class Input; +class InputTree; + +/** \class GNUArchiveReader + * \brief GNUArchiveReader reads GNU archive files. + */ +class GNUArchiveReader : public ArchiveReader +{ +private: + struct ArchiveMemberHeader; + struct SymbolTableEntry; + +public: + explicit GNUArchiveReader(MCLDInfo &pLDInfo, LDReader::Endian endian) + : m_pLDInfo(pLDInfo), + m_endian(endian) + { } + + ~GNUArchiveReader() + { } + + /// Read an archive and extract each member in. + /// Construct the coresponding Input for each member. + InputTree *readArchive(Input &input); + + bool isMyFormat(Input &input) const; + + LDReader::Endian endian(Input& pFile) const; + +private: + /// set up the archive, including + /// first, read symbol table + /// second, read extended file name which is used in thin archive + InputTree *setupNewArchive(Input &pInput, size_t off); + + /// parse the archive header, and return the member size + size_t parseMemberHeader(llvm::OwningPtr<llvm::MemoryBuffer> &mapFile, + off_t off, + std::string *p_Name, + off_t *nestedOff, + std::string &p_ExtendedName); + + void readSymbolTable(llvm::OwningPtr<llvm::MemoryBuffer> &mapFile, + std::vector<SymbolTableEntry> &pSymbolTable, + off_t start, + size_t size); + +private: + MCLDInfo &m_pLDInfo; + LDReader::Endian m_endian; +}; + +} // namespace of mcld + +#endif + |