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 32namespace 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: 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 69 bool checkSignature() const { 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