blob: 5319c52214bdb5ff65d707cba46a168e85b6b3b0 [file] [log] [blame]
//===- GNUArchiveReader.h -------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_LD_GNUARCHIVEREADER_H_
#define MCLD_LD_GNUARCHIVEREADER_H_
#include "mcld/LD/Archive.h"
#include "mcld/LD/ArchiveReader.h"
namespace mcld {
class Archive;
class ELFObjectReader;
class Input;
class LinkerConfig;
class Module;
/** \class GNUArchiveReader
* \brief GNUArchiveReader reads GNU archive files.
*/
class GNUArchiveReader : public ArchiveReader {
public:
GNUArchiveReader(Module& pModule, ELFObjectReader& pELFObjectReader);
~GNUArchiveReader();
/// readArchive - read an archive, include the needed members, and build up
/// the subtree
bool readArchive(const LinkerConfig& pConfig, Archive& pArchive);
/// isMyFormat
bool isMyFormat(Input& input, bool& pContinue) const;
private:
/// isArchive
bool isArchive(const char* pStr) const;
/// isThinArchive
bool isThinArchive(const char* pStr) const;
/// isThinArchive
bool isThinArchive(Input& input) const;
/// readMemberHeader - read the header of a member in a archive file and then
/// return the corresponding archive member (it may be an input object or
/// another archive)
/// @param pArchiveRoot - the archive root that holds the strtab (extended
/// name table)
/// @param pArchiveFile - the archive that contains the needed object
/// @param pFileOffset - file offset of the member header in the archive
/// @param pNestedOffset - used when we find a nested archive
/// @param pMemberSize - the file size of this member
Input* readMemberHeader(Archive& pArchiveRoot,
Input& pArchiveFile,
uint32_t pFileOffset,
uint32_t& pNestedOffset,
size_t& pMemberSize);
/// readSymbolTable - read the archive symbol map (armap)
bool readSymbolTable(Archive& pArchive);
/// readStringTable - read the strtab for long file name of the archive
bool readStringTable(Archive& pArchive);
/// shouldIncludeSymbol - given a sym name from armap and check if we should
/// include the corresponding archive member, and then return the decision
enum Archive::Symbol::Status shouldIncludeSymbol(
const llvm::StringRef& pSymName) const;
/// includeMember - include the object member in the given file offset, and
/// return the size of the object
/// @param pConfig - LinkerConfig
/// @param pArchiveRoot - the archive root
/// @param pFileOffset - file offset of the member header in the archive
size_t includeMember(const LinkerConfig& pConfig,
Archive& pArchiveRoot,
uint32_t pFileOffset);
/// includeAllMembers - include all object members. This is called if
/// --whole-archive is the attribute for this archive file.
bool includeAllMembers(const LinkerConfig& pConfig, Archive& pArchive);
private:
Module& m_Module;
ELFObjectReader& m_ELFObjectReader;
};
} // namespace mcld
#endif // MCLD_LD_GNUARCHIVEREADER_H_