15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- GNUArchiveReader.h -------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_GNU_ARCHIVE_READER_H
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_GNU_ARCHIVE_READER_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/ArchiveReader.h>
16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/Archive.h>
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module;
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Input;
22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass ELFObjectReader;
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MemoryAreaFactory;
24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Archive;
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class GNUArchiveReader
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief GNUArchiveReader reads GNU archive files.
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GNUArchiveReader : public ArchiveReader
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  GNUArchiveReader(Module& pModule, ELFObjectReader& pELFObjectReader);
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
34cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ~GNUArchiveReader();
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
36cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readArchive - read an archive, include the needed members, and build up
37cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// the subtree
38cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool readArchive(Archive& pArchive);
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
40cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isMyFormat
41cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool isMyFormat(Input& input) const;
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isArchive
45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool isArchive(const char* pStr) const;
46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isThinArchive
48cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool isThinArchive(const char* pStr) const;
49cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isThinArchive
51cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool isThinArchive(Input& input) const;
52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readMemberHeader - read the header of a member in a archive file and then
54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// return the corresponding archive member (it may be an input object or
55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// another archive)
56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pArchiveRoot  - the archive root that holds the strtab (extended
57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ///                        name table)
58cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pArchiveFile  - the archive that contains the needed object
59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pFileOffset   - file offset of the member header in the archive
60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pNestedOffset - used when we find a nested archive
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pMemberSize   - the file size of this member
62cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Input* readMemberHeader(Archive& pArchiveRoot,
63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                          Input& pArchiveFile,
64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                          uint32_t pFileOffset,
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          uint32_t& pNestedOffset,
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          size_t& pMemberSize);
67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
68cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readSymbolTable - read the archive symbol map (armap)
69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool readSymbolTable(Archive& pArchive);
70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readStringTable - read the strtab for long file name of the archive
72cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool readStringTable(Archive& pArchive);
73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
74cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// shouldIncludeSymbol - given a sym name from armap and check if we should
75cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// include the corresponding archive member, and then return the decision
76cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  enum Archive::Symbol::Status
77cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  shouldIncludeSymbol(const llvm::StringRef& pSymName) const;
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// includeMember - include the object member in the given file offset, and
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// return the size of the object
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pArchiveRoot - the archive root
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pFileOffset  - file offset of the member header in the archive
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t includeMember(Archive& pArchiveRoot, uint32_t pFileOffset);
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// includeAllMembers - include all object members. This is called if
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --whole-archive is the attribute for this archive file.
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool includeAllMembers(Archive& pArchive);
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Module& m_Module;
91cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ELFObjectReader& m_ELFObjectReader;
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
98