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