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
17ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/DiagnosticInfo.h"
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/ErrorOr.h"
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Support/MemoryBuffer.h"
2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include <memory>
21b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner#include <string>
22b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
23b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattnernamespace llvm {
2438e77214558f3a5f917896df575de1c01ee60f47Chris Lattner  class BitstreamWriter;
252ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  class DataStreamer;
2612ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramer  class LLVMContext;
272ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  class Module;
282ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  class ModulePass;
29d1ce3b48e24b9e7d78cac590d1e4590a68c2e2ceDaniel Dunbar  class raw_ostream;
302ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Read the header of the specified bitcode buffer and prepare for lazy
324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// deserialization of function bodies. If ShouldLazyLoadMetadata is true,
334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  /// lazily load metadata as well. If successful, this moves Buffer. On
3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// error, this *does not* move Buffer.
35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ErrorOr<Module *>
36ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getLazyBitcodeModule(std::unique_ptr<MemoryBuffer> &&Buffer,
37ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                       LLVMContext &Context,
384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                       DiagnosticHandlerFunction DiagnosticHandler = nullptr,
394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                       bool ShouldLazyLoadMetadata = false);
40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
41ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// Read the header of the specified stream and prepare for lazy
42ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// deserialization and streaming of function bodies.
43ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ErrorOr<std::unique_ptr<Module>> getStreamedBitcodeModule(
44ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      StringRef Name, DataStreamer *Streamer, LLVMContext &Context,
45ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      DiagnosticHandlerFunction DiagnosticHandler = nullptr);
462ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
47c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  /// Read the header of the specified bitcode buffer and extract just the
4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// triple information. If successful, this returns a string. On error, this
4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// returns "".
50ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  std::string
51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  getBitcodeTargetTriple(MemoryBufferRef Buffer, LLVMContext &Context,
52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                         DiagnosticHandlerFunction DiagnosticHandler = nullptr);
5334711747a1d2c8713e69333bacef1c880810e371Bill Wendling
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Read the specified bitcode file, returning the module.
55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ErrorOr<Module *>
56ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context,
57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                   DiagnosticHandlerFunction DiagnosticHandler = nullptr);
58d3ff4a188e823baa141c288d31eb532ddf632b6eMisha Brukman
592c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  /// \brief Write the specified module to the specified raw output stream.
602c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  ///
612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  /// For streams where it matters, the given stream should be in "binary"
622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  /// mode.
632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  ///
642c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  /// If \c ShouldPreserveUseListOrder, encode the use-list order for each \a
652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  /// Value in \c M.  These will be reconstructed exactly when \a M is
662c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  /// deserialized.
672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  void WriteBitcodeToFile(const Module *M, raw_ostream &Out,
682c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                          bool ShouldPreserveUseListOrder = false);
692ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
70c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// isBitcodeWrapper - Return true if the given bytes are the magic bytes
71c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// for an LLVM IR bitcode wrapper.
72c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  ///
73305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth  inline bool isBitcodeWrapper(const unsigned char *BufPtr,
74305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth                               const unsigned char *BufEnd) {
75c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    // See if you can find the hidden message in the magic bytes :-).
76c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    // (Hint: it's a little-endian encoding.)
77c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    return BufPtr != BufEnd &&
78c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[0] == 0xDE &&
79c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[1] == 0xC0 &&
80c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[2] == 0x17 &&
81c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[3] == 0x0B;
82e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  }
83c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman
84c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// isRawBitcode - Return true if the given bytes are the magic bytes for
85c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// raw LLVM IR bitcode (without a wrapper).
86c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  ///
87305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth  inline bool isRawBitcode(const unsigned char *BufPtr,
88305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth                           const unsigned char *BufEnd) {
89c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    // These bytes sort of have a hidden message, but it's not in
90c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    // little-endian this time, and it's a little redundant.
91c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    return BufPtr != BufEnd &&
92c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[0] == 'B' &&
93c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[1] == 'C' &&
94c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[2] == 0xc0 &&
95c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           BufPtr[3] == 0xde;
96c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  }
97c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman
98c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// isBitcode - Return true if the given bytes are the magic bytes for
99c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  /// LLVM IR bitcode, either with or without a wrapper.
100c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  ///
101305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth  inline bool isBitcode(const unsigned char *BufPtr,
102305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth                        const unsigned char *BufEnd) {
103c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman    return isBitcodeWrapper(BufPtr, BufEnd) ||
104c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman           isRawBitcode(BufPtr, BufEnd);
105c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman  }
106c2ac2d534763c6592c917e3776270d377e9c3589Dan Gohman
107e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// SkipBitcodeWrapperHeader - Some systems wrap bc files with a special
108e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// header for padding or other reasons.  The format of this header is:
109e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///
110e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// struct bc_header {
111e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///   uint32_t Magic;         // 0x0B17C0DE
112e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///   uint32_t Version;       // Version, currently always 0.
113e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///   uint32_t BitcodeOffset; // Offset to traditional bitcode file.
114e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///   uint32_t BitcodeSize;   // Size of traditional bitcode file.
115e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  ///   ... potentially other gunk ...
116e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// };
1172ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  ///
118e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// This function is called when we find a file with a matching magic number.
119e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// In this case, skip down to the subsection of the file that is actually a
120e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  /// BC file.
1212ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  /// If 'VerifyBufferSize' is true, check that the buffer is large enough to
1222ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff  /// contain the whole bitcode file.
123305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth  inline bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr,
124305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth                                       const unsigned char *&BufEnd,
125305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruth                                       bool VerifyBufferSize) {
126e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    enum {
127e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner      KnownHeaderSize = 4*4,  // Size of header we read.
128e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner      OffsetField = 2*4,      // Offset in bytes to Offset field.
129e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner      SizeField = 3*4         // Offset in bytes to Size field.
130e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    };
1312ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
132e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    // Must contain the header!
133e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    if (BufEnd-BufPtr < KnownHeaderSize) return true;
1342ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
135e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    unsigned Offset = ( BufPtr[OffsetField  ]        |
136e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[OffsetField+1] << 8)  |
137e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[OffsetField+2] << 16) |
138e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[OffsetField+3] << 24));
139e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    unsigned Size   = ( BufPtr[SizeField    ]        |
140e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[SizeField  +1] << 8)  |
141e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[SizeField  +2] << 16) |
142e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner                       (BufPtr[SizeField  +3] << 24));
1432ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff
144e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    // Verify that Offset+Size fits in the file.
1452ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff    if (VerifyBufferSize && Offset+Size > unsigned(BufEnd-BufPtr))
146e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner      return true;
147e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    BufPtr += Offset;
148e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    BufEnd = BufPtr+Size;
149e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner    return false;
150e2a466bfa9e4f43c90602da5f602c16c2c83c866Chris Lattner  }
15137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
15237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const std::error_category &BitcodeErrorCategory();
153ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  enum class BitcodeError { InvalidBitcodeSignature, CorruptedBitcode };
15437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  inline std::error_code make_error_code(BitcodeError E) {
15537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return std::error_code(static_cast<int>(E), BitcodeErrorCategory());
15637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
15737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
158ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  class BitcodeDiagnosticInfo : public DiagnosticInfo {
159ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    const Twine &Msg;
160ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    std::error_code EC;
161ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
162ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  public:
163ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    BitcodeDiagnosticInfo(std::error_code EC, DiagnosticSeverity Severity,
164ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                          const Twine &Msg);
165ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    void print(DiagnosticPrinter &DP) const override;
166ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    std::error_code getError() const { return EC; };
167ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
168ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    static bool classof(const DiagnosticInfo *DI) {
169ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return DI->getKind() == DK_Bitcode;
170ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    }
171ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  };
172ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
173b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner} // End llvm namespace
174b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner
17537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesnamespace std {
17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestemplate <> struct is_error_code_enum<llvm::BitcodeError> : std::true_type {};
17737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
17837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
179b35ca9db9ce25e6b61aa3eaee41464f647d34899Chris Lattner#endif
180