summaryrefslogtreecommitdiff
path: root/tools/llvm-ar/ArchiveInternals.h
blob: e906d7a059993fb2abd61f3ddfa8a36a88b9b819 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//===-- 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 TOOLS_LLVM_AR_ARCHIVEINTERNALS_H
#define TOOLS_LLVM_AR_ARCHIVEINTERNALS_H

#include "Archive.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/TimeValue.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_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() const {
      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