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//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_LD_GNUARCHIVEREADER_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_LD_GNUARCHIVEREADER_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/ArchiveReader.h>
13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/Archive.h>
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module;
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Input;
19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass ELFObjectReader;
20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Archive;
2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LinkerConfig;
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class GNUArchiveReader
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief GNUArchiveReader reads GNU archive files.
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GNUArchiveReader : public ArchiveReader
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  GNUArchiveReader(Module& pModule, ELFObjectReader& pELFObjectReader);
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
31cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ~GNUArchiveReader();
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
33cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readArchive - read an archive, include the needed members, and build up
34cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// the subtree
3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool readArchive(const LinkerConfig& pConfig, Archive& pArchive);
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
37cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isMyFormat
3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool isMyFormat(Input& input, bool &pContinue) const;
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
41cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isArchive
42cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool isArchive(const char* pStr) const;
43cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isThinArchive
45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool isThinArchive(const char* pStr) const;
46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isThinArchive
48cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool isThinArchive(Input& input) const;
49cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readMemberHeader - read the header of a member in a archive file and then
51cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// return the corresponding archive member (it may be an input object or
52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// another archive)
53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pArchiveRoot  - the archive root that holds the strtab (extended
54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ///                        name table)
55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pArchiveFile  - the archive that contains the needed object
56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pFileOffset   - file offset of the member header in the archive
57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pNestedOffset - used when we find a nested archive
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pMemberSize   - the file size of this member
59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Input* readMemberHeader(Archive& pArchiveRoot,
60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                          Input& pArchiveFile,
61cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                          uint32_t pFileOffset,
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          uint32_t& pNestedOffset,
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          size_t& pMemberSize);
64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
65cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readSymbolTable - read the archive symbol map (armap)
66cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool readSymbolTable(Archive& pArchive);
67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
68cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readStringTable - read the strtab for long file name of the archive
69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool readStringTable(Archive& pArchive);
70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// shouldIncludeSymbol - given a sym name from armap and check if we should
72cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// include the corresponding archive member, and then return the decision
73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  enum Archive::Symbol::Status
74cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  shouldIncludeSymbol(const llvm::StringRef& pSymName) const;
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// includeMember - include the object member in the given file offset, and
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// return the size of the object
7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// @param pConfig - LinkerConfig
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pArchiveRoot - the archive root
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pFileOffset  - file offset of the member header in the archive
8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  size_t includeMember(const LinkerConfig& pConfig,
8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       Archive& pArchiveRoot,
8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       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.
8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool includeAllMembers(const LinkerConfig& pConfig, 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