ReaderWriter.h revision d928fb670fb3b0818fc23738e9c2418980bb141e
1e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//===-- llvm/Bitcode/ReaderWriter.h - Bitcode reader/writers ----*- C++ -*-===//
2e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
3e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//                     The LLVM Compiler Infrastructure
4cd5ebaa06dca3e6ef3c464081e6defe00d358c69hhtian//
5e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney// This file is distributed under the University of Illinois Open Source
6e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney// License. See LICENSE.TXT for details.
7e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
8e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//===----------------------------------------------------------------------===//
9e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
10e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney// This header defines interfaces to read and write LLVM bitcode files/streams.
11e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
12e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//===----------------------------------------------------------------------===//
13e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
14e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#ifndef LLVM_BITCODE_H
15e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#define LLVM_BITCODE_H
16e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
17e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <string>
18e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
19e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneynamespace llvm {
20e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  class Module;
21e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  class MemoryBuffer;
22e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  class ModulePass;
23e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  class BitstreamWriter;
24e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  class LLVMContext;
25e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  class raw_ostream;
26e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
27e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// getLazyBitcodeModule - Read the header of the specified bitcode buffer
28e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// and prepare for lazy deserialization of function bodies.  If successful,
29e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// this takes ownership of 'buffer' and returns a non-null pointer.  On
30e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// error, this returns null, *does not* take ownership of Buffer, and fills
31e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// in *ErrMsg with an error description if ErrMsg is non-null.
32e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Module *getLazyBitcodeModule(MemoryBuffer *Buffer,
33e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                               LLVMContext& Context,
34e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                               std::string *ErrMsg = 0);
35e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
36e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// ParseBitcodeFile - Read the specified bitcode file, returning the module.
37e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// If an error occurs, this returns null and fills in *ErrMsg if it is
38e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// non-null.  This method *never* takes ownership of Buffer.
39e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Module *ParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext& Context,
40e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                           std::string *ErrMsg = 0);
41e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
42e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// WriteBitcodeToFile - Write the specified module to the specified
43e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// raw output stream.  For streams where it matters, the given stream
44e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// should be in "binary" mode.
453c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  void WriteBitcodeToFile(const Module *M, raw_ostream &Out);
463c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen
473c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  /// WriteBitcodeToStream - Write the specified module to the specified
483c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  /// raw output stream.
493c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  void WriteBitcodeToStream(const Module *M, BitstreamWriter &Stream);
50e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
51e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// createBitcodeWriterPass - Create and return a pass that writes the module
52e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// to the specified ostream.
53e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  ModulePass *createBitcodeWriterPass(raw_ostream &Str);
54e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
55e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
56e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// isBitcodeWrapper - Return true if the given bytes are the magic bytes
57e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// for an LLVM IR bitcode wrapper.
58e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  ///
59e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  static inline bool isBitcodeWrapper(const unsigned char *BufPtr,
60e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                      const unsigned char *BufEnd) {
61e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    // See if you can find the hidden message in the magic bytes :-).
62e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    // (Hint: it's a little-endian encoding.)
63e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    return BufPtr != BufEnd &&
643c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen           BufPtr[0] == 0xDE &&
653c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen           BufPtr[1] == 0xC0 &&
663c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen           BufPtr[2] == 0x17 &&
673c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen           BufPtr[3] == 0x0B;
68e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  }
69e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
70e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// isRawBitcode - Return true if the given bytes are the magic bytes for
71e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// raw LLVM IR bitcode (without a wrapper).
72e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  ///
73e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  static inline bool isRawBitcode(const unsigned char *BufPtr,
74e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                  const unsigned char *BufEnd) {
753c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen    // These bytes sort of have a hidden message, but it's not in
763c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen    // little-endian this time, and it's a little redundant.
773c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen    return BufPtr != BufEnd &&
783c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen           BufPtr[0] == 'B' &&
793c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen           BufPtr[1] == 'C' &&
803c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen           BufPtr[2] == 0xc0 &&
813c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen           BufPtr[3] == 0xde;
823c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  }
833c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen
843c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  /// isBitcode - Return true if the given bytes are the magic bytes for
853c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  /// LLVM IR bitcode, either with or without a wrapper.
863c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  ///
873c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  static bool inline isBitcode(const unsigned char *BufPtr,
883c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen                               const unsigned char *BufEnd) {
893c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen    return isBitcodeWrapper(BufPtr, BufEnd) ||
903c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen           isRawBitcode(BufPtr, BufEnd);
913c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  }
923c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen
933c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  /// SkipBitcodeWrapperHeader - Some systems wrap bc files with a special
943c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  /// header for padding or other reasons.  The format of this header is:
953c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  ///
963c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  /// struct bc_header {
973c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  ///   uint32_t Magic;         // 0x0B17C0DE
983c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  ///   uint32_t Version;       // Version, currently always 0.
993c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  ///   uint32_t BitcodeOffset; // Offset to traditional bitcode file.
1003c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  ///   uint32_t BitcodeSize;   // Size of traditional bitcode file.
1013c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  ///   ... potentially other gunk ...
1023c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  /// };
1033c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  ///
1043c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  /// This function is called when we find a file with a matching magic number.
1053c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  /// In this case, skip down to the subsection of the file that is actually a
1063c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen  /// BC file.
107e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  static inline bool SkipBitcodeWrapperHeader(unsigned char *&BufPtr,
108e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                              unsigned char *&BufEnd) {
109e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    enum {
110e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney      KnownHeaderSize = 4*4,  // Size of header we read.
111e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney      OffsetField = 2*4,      // Offset in bytes to Offset field.
112e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney      SizeField = 3*4         // Offset in bytes to Size field.
113e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    };
114e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
115e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    // Must contain the header!
116e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    if (BufEnd-BufPtr < KnownHeaderSize) return true;
117e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
1183c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen    unsigned Offset = ( BufPtr[OffsetField  ]        |
119e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                       (BufPtr[OffsetField+1] << 8)  |
120e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                       (BufPtr[OffsetField+2] << 16) |
121e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                       (BufPtr[OffsetField+3] << 24));
122e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    unsigned Size   = ( BufPtr[SizeField    ]        |
123e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                       (BufPtr[SizeField  +1] << 8)  |
124e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                       (BufPtr[SizeField  +2] << 16) |
125e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                       (BufPtr[SizeField  +3] << 24));
126e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
127e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    // Verify that Offset+Size fits in the file.
128e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    if (Offset+Size > unsigned(BufEnd-BufPtr))
129e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney      return true;
130e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    BufPtr += Offset;
131e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    BufEnd = BufPtr+Size;
132e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney    return false;
133e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  }
134e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney} // End llvm namespace
135e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
136e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#endif
137e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney