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