summaryrefslogtreecommitdiff
path: root/include/mcld/LD/GNUArchiveReader.h
diff options
context:
space:
mode:
authorShih-wei Liao <sliao@google.com>2012-03-16 22:41:16 -0700
committerShih-wei Liao <sliao@google.com>2012-03-17 03:32:25 -0700
commit5460a1f25d9ddecb5c70667267d66d51af177a99 (patch)
treed8a34be7ba631b703d871e4167f2ea5cab3910a2 /include/mcld/LD/GNUArchiveReader.h
parent7a83dfa572a3ae9da136c30c62f6d6cdab3dd064 (diff)
downloadmclinker-5460a1f25d9ddecb5c70667267d66d51af177a99.tar.gz
Linkloader improvement: mclinker.
Change-Id: I8805e39ccbc2ee204234fb3e71c70c906f3990bb
Diffstat (limited to 'include/mcld/LD/GNUArchiveReader.h')
-rw-r--r--include/mcld/LD/GNUArchiveReader.h86
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
+