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