1b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//===-- llvm/Bitcode/ReaderWriter.h - Bitcode reader/writers ----*- C++ -*-===//
2b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//
3b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//                     The LLVM Compiler Infrastructure
4b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//
8b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//===----------------------------------------------------------------------===//
9b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//
10b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner// This header defines interfaces to read and write LLVM bitcode files/streams.
11b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//
12b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner//===----------------------------------------------------------------------===//
13b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
14674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_BITCODE_READERWRITER_H
15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_BITCODE_READERWRITER_H
16b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/ErrorOr.h"
18b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner#include <string>
19b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
20b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattnernamespace llvm {
2138e77214558f3a5f917896df575de1c01ee60f47Chris Lattner  class BitstreamWriter;
222ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  class MemoryBuffer;
232ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  class DataStreamer;
2412ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramer  class LLVMContext;
252ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  class Module;
262ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  class ModulePass;
27d1ce3b48e24b9e7d78cac590d1e4590a68c2e2ceDaniel Dunbar  class raw_ostream;
282ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Read the header of the specified bitcode buffer and prepare for lazy
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// deserialization of function bodies.  If successful, this takes ownership
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// of 'buffer. On error, this *does not* take ownership of Buffer.
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ErrorOr<Module *> getLazyBitcodeModule(MemoryBuffer *Buffer,
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                         LLVMContext &Context);
34b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
352ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  /// getStreamedBitcodeModule - Read the header of the specified stream
362ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  /// and prepare for lazy deserialization and streaming of function bodies.
372ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  /// On error, this returns null, and fills in *ErrMsg with an error
382ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  /// description if ErrMsg is non-null.
392ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  Module *getStreamedBitcodeModule(const std::string &name,
402ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff                                   DataStreamer *streamer,
412ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff                                   LLVMContext &Context,
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                   std::string *ErrMsg = nullptr);
432ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Read the header of the specified bitcode buffer and extract just the
45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// triple information. If successful, this returns a string and *does not*
46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// take ownership of 'buffer'. On error, this returns "".
4734711747a1d2c8713e69333bacef1c880810e371Bill Wendling  std::string getBitcodeTargetTriple(MemoryBuffer *Buffer,
48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                     LLVMContext &Context);
4934711747a1d2c8713e69333bacef1c880810e371Bill Wendling
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Read the specified bitcode file, returning the module.
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// This method *never* takes ownership of Buffer.
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ErrorOr<Module *> parseBitcodeFile(MemoryBuffer *Buffer,
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                     LLVMContext &Context);
54d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
55d1ce3b48e24b9e7d78cac590d1e4590a68c2e2ceDaniel Dunbar  /// WriteBitcodeToFile - Write the specified module to the specified
56d928fb670fb3b0818fc23738e9c2418980bb141eDan Gohman  /// raw output stream.  For streams where it matters, the given stream
57d928fb670fb3b0818fc23738e9c2418980bb141eDan Gohman  /// should be in "binary" mode.
58d1ce3b48e24b9e7d78cac590d1e4590a68c2e2ceDaniel Dunbar  void WriteBitcodeToFile(const Module *M, raw_ostream &Out);
59d1ce3b48e24b9e7d78cac590d1e4590a68c2e2ceDaniel Dunbar
602ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
61c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// isBitcodeWrapper - Return true if the given bytes are the magic bytes
62c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// for an LLVM IR bitcode wrapper.
63c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  ///
64305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth  inline bool isBitcodeWrapper(const unsigned char *BufPtr,
65305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth                               const unsigned char *BufEnd) {
66c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    // See if you can find the hidden message in the magic bytes :-).
67c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    // (Hint: it's a little-endian encoding.)
68c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    return BufPtr != BufEnd &&
69c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[0] == 0xDE &&
70c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[1] == 0xC0 &&
71c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[2] == 0x17 &&
72c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[3] == 0x0B;
73e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  }
74c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman
75c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// isRawBitcode - Return true if the given bytes are the magic bytes for
76c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// raw LLVM IR bitcode (without a wrapper).
77c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  ///
78305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth  inline bool isRawBitcode(const unsigned char *BufPtr,
79305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth                           const unsigned char *BufEnd) {
80c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    // These bytes sort of have a hidden message, but it's not in
81c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    // little-endian this time, and it's a little redundant.
82c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    return BufPtr != BufEnd &&
83c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[0] == 'B' &&
84c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[1] == 'C' &&
85c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[2] == 0xc0 &&
86c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[3] == 0xde;
87c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  }
88c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman
89c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// isBitcode - Return true if the given bytes are the magic bytes for
90c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// LLVM IR bitcode, either with or without a wrapper.
91c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  ///
92305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth  inline bool isBitcode(const unsigned char *BufPtr,
93305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth                        const unsigned char *BufEnd) {
94c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    return isBitcodeWrapper(BufPtr, BufEnd) ||
95c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           isRawBitcode(BufPtr, BufEnd);
96c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  }
97c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman
98e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// SkipBitcodeWrapperHeader - Some systems wrap bc files with a special
99e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// header for padding or other reasons.  The format of this header is:
100e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///
101e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// struct bc_header {
102e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///   uint32_t Magic;         // 0x0B17C0DE
103e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///   uint32_t Version;       // Version, currently always 0.
104e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///   uint32_t BitcodeOffset; // Offset to traditional bitcode file.
105e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///   uint32_t BitcodeSize;   // Size of traditional bitcode file.
106e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///   ... potentially other gunk ...
107e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// };
1082ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  ///
109e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// This function is called when we find a file with a matching magic number.
110e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// In this case, skip down to the subsection of the file that is actually a
111e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// BC file.
1122ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  /// If 'VerifyBufferSize' is true, check that the buffer is large enough to
1132ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  /// contain the whole bitcode file.
114305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth  inline bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr,
115305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth                                       const unsigned char *&BufEnd,
116305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth                                       bool VerifyBufferSize) {
117e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    enum {
118e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner      KnownHeaderSize = 4*4,  // Size of header we read.
119e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner      OffsetField = 2*4,      // Offset in bytes to Offset field.
120e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner      SizeField = 3*4         // Offset in bytes to Size field.
121e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    };
1222ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
123e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    // Must contain the header!
124e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    if (BufEnd-BufPtr < KnownHeaderSize) return true;
1252ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
126e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    unsigned Offset = ( BufPtr[OffsetField  ]        |
127e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[OffsetField+1] << 8)  |
128e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[OffsetField+2] << 16) |
129e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[OffsetField+3] << 24));
130e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    unsigned Size   = ( BufPtr[SizeField    ]        |
131e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[SizeField  +1] << 8)  |
132e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[SizeField  +2] << 16) |
133e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[SizeField  +3] << 24));
1342ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
135e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    // Verify that Offset+Size fits in the file.
1362ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    if (VerifyBufferSize && Offset+Size > unsigned(BufEnd-BufPtr))
137e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner      return true;
138e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    BufPtr += Offset;
139e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    BufEnd = BufPtr+Size;
140e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    return false;
141e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  }
142b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner} // End llvm namespace
143b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
144b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner#endif
145