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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_GNUARCHIVEREADER_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_GNUARCHIVEREADER_H_
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/Archive.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ArchiveReader.h"
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Archive;
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ELFObjectReader;
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Input;
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LinkerConfig;
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Module;
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class GNUArchiveReader
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief GNUArchiveReader reads GNU archive files.
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass GNUArchiveReader : public ArchiveReader {
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  GNUArchiveReader(Module& pModule, ELFObjectReader& pELFObjectReader);
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
30cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ~GNUArchiveReader();
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
32cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readArchive - read an archive, include the needed members, and build up
33cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// the subtree
3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool readArchive(const LinkerConfig& pConfig, Archive& pArchive);
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
36cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isMyFormat
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  bool isMyFormat(Input& input, bool& pContinue) const;
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
40cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isArchive
41cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool isArchive(const char* pStr) const;
42cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
43cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isThinArchive
44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool isThinArchive(const char* pStr) const;
45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// isThinArchive
47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool isThinArchive(Input& input) const;
48cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
49cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readMemberHeader - read the header of a member in a archive file and then
50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// return the corresponding archive member (it may be an input object or
51cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// another archive)
52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pArchiveRoot  - the archive root that holds the strtab (extended
53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ///                        name table)
54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pArchiveFile  - the archive that contains the needed object
55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pFileOffset   - file offset of the member header in the archive
56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pNestedOffset - used when we find a nested archive
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pMemberSize   - the file size of this member
58cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Input* readMemberHeader(Archive& pArchiveRoot,
59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                          Input& pArchiveFile,
60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                          uint32_t pFileOffset,
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          uint32_t& pNestedOffset,
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          size_t& pMemberSize);
63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readSymbolTable - read the archive symbol map (armap)
65cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool readSymbolTable(Archive& pArchive);
66cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// readStringTable - read the strtab for long file name of the archive
68cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool readStringTable(Archive& pArchive);
69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// shouldIncludeSymbol - given a sym name from armap and check if we should
71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// include the corresponding archive member, and then return the decision
7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  enum Archive::Symbol::Status shouldIncludeSymbol(
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      const llvm::StringRef& pSymName) const;
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// includeMember - include the object member in the given file offset, and
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// return the size of the object
7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// @param pConfig - LinkerConfig
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pArchiveRoot - the archive root
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pFileOffset  - file offset of the member header in the archive
8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  size_t includeMember(const LinkerConfig& pConfig,
8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       Archive& pArchiveRoot,
8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       uint32_t pFileOffset);
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// includeAllMembers - include all object members. This is called if
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// --whole-archive is the attribute for this archive file.
8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool includeAllMembers(const LinkerConfig& pConfig, Archive& pArchive);
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Module& m_Module;
90cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ELFObjectReader& m_ELFObjectReader;
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_LD_GNUARCHIVEREADER_H_
96