1 //===-- lib/Archive/ArchiveInternals.h -------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Internal implementation header for LLVM Archive files. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LIB_ARCHIVE_ARCHIVEINTERNALS_H 15 #define LIB_ARCHIVE_ARCHIVEINTERNALS_H 16 17 #include "llvm/Bitcode/Archive.h" 18 #include "llvm/Support/TimeValue.h" 19 #include "llvm/ADT/StringExtras.h" 20 21 #include <cstring> 22 23 #define ARFILE_MAGIC "!<arch>\n" ///< magic string 24 #define ARFILE_MAGIC_LEN (sizeof(ARFILE_MAGIC)-1) ///< length of magic string 25 #define ARFILE_SVR4_SYMTAB_NAME "/ " ///< SVR4 symtab entry name 26 #define ARFILE_LLVM_SYMTAB_NAME "#_LLVM_SYM_TAB_#" ///< LLVM symtab entry name 27 #define ARFILE_BSD4_SYMTAB_NAME "__.SYMDEF SORTED" ///< BSD4 symtab entry name 28 #define ARFILE_STRTAB_NAME "// " ///< Name of string table 29 #define ARFILE_PAD "\n" ///< inter-file align padding 30 #define ARFILE_MEMBER_MAGIC "`\n" ///< fmag field magic # 31 32 namespace llvm { 33 34 class LLVMContext; 35 36 /// The ArchiveMemberHeader structure is used internally for bitcode 37 /// archives. 38 /// The header precedes each file member in the archive. This structure is 39 /// defined using character arrays for direct and correct interpretation 40 /// regardless of the endianess of the machine that produced it. 41 /// @brief Archive File Member Header 42 class ArchiveMemberHeader { 43 /// @name Data 44 /// @{ 45 public: 46 char name[16]; ///< Name of the file member. 47 char date[12]; ///< File date, decimal seconds since Epoch 48 char uid[6]; ///< user id in ASCII decimal 49 char gid[6]; ///< group id in ASCII decimal 50 char mode[8]; ///< file mode in ASCII octal 51 char size[10]; ///< file size in ASCII decimal 52 char fmag[2]; ///< Always contains ARFILE_MAGIC_TERMINATOR 53 54 /// @} 55 /// @name Methods 56 /// @{ 57 public: init()58 void init() { 59 memset(name,' ',16); 60 memset(date,' ',12); 61 memset(uid,' ',6); 62 memset(gid,' ',6); 63 memset(mode,' ',8); 64 memset(size,' ',10); 65 fmag[0] = '`'; 66 fmag[1] = '\n'; 67 } 68 checkSignature()69 bool checkSignature() { 70 return 0 == memcmp(fmag, ARFILE_MEMBER_MAGIC,2); 71 } 72 }; 73 74 // Get just the externally visible defined symbols from the bitcode 75 bool GetBitcodeSymbols(const sys::Path& fName, 76 LLVMContext& Context, 77 std::vector<std::string>& symbols, 78 std::string* ErrMsg); 79 80 Module* GetBitcodeSymbols(const char *Buffer, unsigned Length, 81 const std::string& ModuleID, 82 LLVMContext& Context, 83 std::vector<std::string>& symbols, 84 std::string* ErrMsg); 85 } 86 87 #endif 88 89 // vim: sw=2 ai 90