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