| //===-- lib/Archive/ArchiveInternals.h -------------------------*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // Internal implementation header for LLVM Archive files. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LIB_ARCHIVE_ARCHIVEINTERNALS_H | |
| #define LIB_ARCHIVE_ARCHIVEINTERNALS_H | |
| #include "llvm/Bitcode/Archive.h" | |
| #include "llvm/Support/TimeValue.h" | |
| #include "llvm/ADT/StringExtras.h" | |
| #include <cstring> | |
| #define ARFILE_MAGIC "!<arch>\n" ///< magic string | |
| #define ARFILE_MAGIC_LEN (sizeof(ARFILE_MAGIC)-1) ///< length of magic string | |
| #define ARFILE_SVR4_SYMTAB_NAME "/ " ///< SVR4 symtab entry name | |
| #define ARFILE_LLVM_SYMTAB_NAME "#_LLVM_SYM_TAB_#" ///< LLVM symtab entry name | |
| #define ARFILE_BSD4_SYMTAB_NAME "__.SYMDEF SORTED" ///< BSD4 symtab entry name | |
| #define ARFILE_STRTAB_NAME "// " ///< Name of string table | |
| #define ARFILE_PAD "\n" ///< inter-file align padding | |
| #define ARFILE_MEMBER_MAGIC "`\n" ///< fmag field magic # | |
| namespace llvm { | |
| class LLVMContext; | |
| /// The ArchiveMemberHeader structure is used internally for bitcode | |
| /// archives. | |
| /// The header precedes each file member in the archive. This structure is | |
| /// defined using character arrays for direct and correct interpretation | |
| /// regardless of the endianess of the machine that produced it. | |
| /// @brief Archive File Member Header | |
| class ArchiveMemberHeader { | |
| /// @name Data | |
| /// @{ | |
| public: | |
| char name[16]; ///< Name of the file member. | |
| char date[12]; ///< File date, decimal seconds since Epoch | |
| char uid[6]; ///< user id in ASCII decimal | |
| char gid[6]; ///< group id in ASCII decimal | |
| char mode[8]; ///< file mode in ASCII octal | |
| char size[10]; ///< file size in ASCII decimal | |
| char fmag[2]; ///< Always contains ARFILE_MAGIC_TERMINATOR | |
| /// @} | |
| /// @name Methods | |
| /// @{ | |
| public: | |
| void init() { | |
| memset(name,' ',16); | |
| memset(date,' ',12); | |
| memset(uid,' ',6); | |
| memset(gid,' ',6); | |
| memset(mode,' ',8); | |
| memset(size,' ',10); | |
| fmag[0] = '`'; | |
| fmag[1] = '\n'; | |
| } | |
| bool checkSignature() { | |
| return 0 == memcmp(fmag, ARFILE_MEMBER_MAGIC,2); | |
| } | |
| }; | |
| // Get just the externally visible defined symbols from the bitcode | |
| bool GetBitcodeSymbols(const sys::Path& fName, | |
| LLVMContext& Context, | |
| std::vector<std::string>& symbols, | |
| std::string* ErrMsg); | |
| Module* GetBitcodeSymbols(const char *Buffer, unsigned Length, | |
| const std::string& ModuleID, | |
| LLVMContext& Context, | |
| std::vector<std::string>& symbols, | |
| std::string* ErrMsg); | |
| } | |
| #endif | |
| // vim: sw=2 ai |