14cc499d6e5ec602309501873449c938af61170b2Stephen Hines//===-- llvm/Bitcode/ReaderWriter.h - Bitcode reader/writers ----*- C++ -*-===// 24cc499d6e5ec602309501873449c938af61170b2Stephen Hines// 34cc499d6e5ec602309501873449c938af61170b2Stephen Hines// The LLVM Compiler Infrastructure 44cc499d6e5ec602309501873449c938af61170b2Stephen Hines// 54cc499d6e5ec602309501873449c938af61170b2Stephen Hines// This file is distributed under the University of Illinois Open Source 64cc499d6e5ec602309501873449c938af61170b2Stephen Hines// License. See LICENSE.TXT for details. 74cc499d6e5ec602309501873449c938af61170b2Stephen Hines// 84cc499d6e5ec602309501873449c938af61170b2Stephen Hines//===----------------------------------------------------------------------===// 94cc499d6e5ec602309501873449c938af61170b2Stephen Hines// 104cc499d6e5ec602309501873449c938af61170b2Stephen Hines// This header defines interfaces to read and write LLVM bitcode files/streams. 114cc499d6e5ec602309501873449c938af61170b2Stephen Hines// 124cc499d6e5ec602309501873449c938af61170b2Stephen Hines//===----------------------------------------------------------------------===// 134cc499d6e5ec602309501873449c938af61170b2Stephen Hines 144cc499d6e5ec602309501873449c938af61170b2Stephen Hines#ifndef LLVM_BITCODE_2_9_H 154cc499d6e5ec602309501873449c938af61170b2Stephen Hines#define LLVM_BITCODE_2_9_H 164cc499d6e5ec602309501873449c938af61170b2Stephen Hines 174cc499d6e5ec602309501873449c938af61170b2Stephen Hines#include <string> 184cc499d6e5ec602309501873449c938af61170b2Stephen Hines 194cc499d6e5ec602309501873449c938af61170b2Stephen Hinesnamespace llvm { 204cc499d6e5ec602309501873449c938af61170b2Stephen Hines class Module; 214cc499d6e5ec602309501873449c938af61170b2Stephen Hines class MemoryBuffer; 224cc499d6e5ec602309501873449c938af61170b2Stephen Hines class ModulePass; 234cc499d6e5ec602309501873449c938af61170b2Stephen Hines class BitstreamWriter; 244cc499d6e5ec602309501873449c938af61170b2Stephen Hines class LLVMContext; 254cc499d6e5ec602309501873449c938af61170b2Stephen Hines class raw_ostream; 264cc499d6e5ec602309501873449c938af61170b2Stephen Hines} // End llvm namespace 274cc499d6e5ec602309501873449c938af61170b2Stephen Hines 284cc499d6e5ec602309501873449c938af61170b2Stephen Hinesnamespace llvm_2_9 { 294cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// getLazyBitcodeModule - Read the header of the specified bitcode buffer 304cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// and prepare for lazy deserialization of function bodies. If successful, 314cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// this takes ownership of 'buffer' and returns a non-null pointer. On 324cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// error, this returns null, *does not* take ownership of Buffer, and fills 334cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// in *ErrMsg with an error description if ErrMsg is non-null. 344cc499d6e5ec602309501873449c938af61170b2Stephen Hines llvm::Module *getLazyBitcodeModule(llvm::MemoryBuffer *Buffer, 354cc499d6e5ec602309501873449c938af61170b2Stephen Hines llvm::LLVMContext& Context, 364cc499d6e5ec602309501873449c938af61170b2Stephen Hines std::string *ErrMsg = 0); 374cc499d6e5ec602309501873449c938af61170b2Stephen Hines 384cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// getBitcodeTargetTriple - Read the header of the specified bitcode 394cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// buffer and extract just the triple information. If successful, 404cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// this returns a string and *does not* take ownership 414cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// of 'buffer'. On error, this returns "", and fills in *ErrMsg 424cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// if ErrMsg is non-null. 434cc499d6e5ec602309501873449c938af61170b2Stephen Hines std::string getBitcodeTargetTriple(llvm::MemoryBuffer *Buffer, 444cc499d6e5ec602309501873449c938af61170b2Stephen Hines llvm::LLVMContext& Context, 454cc499d6e5ec602309501873449c938af61170b2Stephen Hines std::string *ErrMsg = 0); 464cc499d6e5ec602309501873449c938af61170b2Stephen Hines 474cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// ParseBitcodeFile - Read the specified bitcode file, returning the module. 484cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// If an error occurs, this returns null and fills in *ErrMsg if it is 494cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// non-null. This method *never* takes ownership of Buffer. 504cc499d6e5ec602309501873449c938af61170b2Stephen Hines llvm::Module *ParseBitcodeFile(llvm::MemoryBuffer *Buffer, llvm::LLVMContext& Context, 514cc499d6e5ec602309501873449c938af61170b2Stephen Hines std::string *ErrMsg = 0); 524cc499d6e5ec602309501873449c938af61170b2Stephen Hines 534cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// WriteBitcodeToFile - Write the specified module to the specified 544cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// raw output stream. For streams where it matters, the given stream 554cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// should be in "binary" mode. 564cc499d6e5ec602309501873449c938af61170b2Stephen Hines void WriteBitcodeToFile(const llvm::Module *M, llvm::raw_ostream &Out); 574cc499d6e5ec602309501873449c938af61170b2Stephen Hines 584cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// createBitcodeWriterPass - Create and return a pass that writes the module 594cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// to the specified ostream. 604cc499d6e5ec602309501873449c938af61170b2Stephen Hines llvm::ModulePass *createBitcodeWriterPass(llvm::raw_ostream &Str); 614cc499d6e5ec602309501873449c938af61170b2Stephen Hines 624cc499d6e5ec602309501873449c938af61170b2Stephen Hines 634cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// isBitcodeWrapper - Return true if the given bytes are the magic bytes 644cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// for an LLVM IR bitcode wrapper. 654cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// 664cc499d6e5ec602309501873449c938af61170b2Stephen Hines static inline bool isBitcodeWrapper(const unsigned char *BufPtr, 674cc499d6e5ec602309501873449c938af61170b2Stephen Hines const unsigned char *BufEnd) { 684cc499d6e5ec602309501873449c938af61170b2Stephen Hines // See if you can find the hidden message in the magic bytes :-). 694cc499d6e5ec602309501873449c938af61170b2Stephen Hines // (Hint: it's a little-endian encoding.) 704cc499d6e5ec602309501873449c938af61170b2Stephen Hines return BufPtr != BufEnd && 714cc499d6e5ec602309501873449c938af61170b2Stephen Hines BufPtr[0] == 0xDE && 724cc499d6e5ec602309501873449c938af61170b2Stephen Hines BufPtr[1] == 0xC0 && 734cc499d6e5ec602309501873449c938af61170b2Stephen Hines BufPtr[2] == 0x17 && 744cc499d6e5ec602309501873449c938af61170b2Stephen Hines BufPtr[3] == 0x0B; 754cc499d6e5ec602309501873449c938af61170b2Stephen Hines } 764cc499d6e5ec602309501873449c938af61170b2Stephen Hines 774cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// isRawBitcode - Return true if the given bytes are the magic bytes for 784cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// raw LLVM IR bitcode (without a wrapper). 794cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// 804cc499d6e5ec602309501873449c938af61170b2Stephen Hines static inline bool isRawBitcode(const unsigned char *BufPtr, 814cc499d6e5ec602309501873449c938af61170b2Stephen Hines const unsigned char *BufEnd) { 824cc499d6e5ec602309501873449c938af61170b2Stephen Hines // These bytes sort of have a hidden message, but it's not in 834cc499d6e5ec602309501873449c938af61170b2Stephen Hines // little-endian this time, and it's a little redundant. 844cc499d6e5ec602309501873449c938af61170b2Stephen Hines return BufPtr != BufEnd && 854cc499d6e5ec602309501873449c938af61170b2Stephen Hines BufPtr[0] == 'B' && 864cc499d6e5ec602309501873449c938af61170b2Stephen Hines BufPtr[1] == 'C' && 874cc499d6e5ec602309501873449c938af61170b2Stephen Hines BufPtr[2] == 0xc0 && 884cc499d6e5ec602309501873449c938af61170b2Stephen Hines BufPtr[3] == 0xde; 894cc499d6e5ec602309501873449c938af61170b2Stephen Hines } 904cc499d6e5ec602309501873449c938af61170b2Stephen Hines 914cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// isBitcode - Return true if the given bytes are the magic bytes for 924cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// LLVM IR bitcode, either with or without a wrapper. 934cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// 944cc499d6e5ec602309501873449c938af61170b2Stephen Hines static bool inline isBitcode(const unsigned char *BufPtr, 954cc499d6e5ec602309501873449c938af61170b2Stephen Hines const unsigned char *BufEnd) { 964cc499d6e5ec602309501873449c938af61170b2Stephen Hines return isBitcodeWrapper(BufPtr, BufEnd) || 974cc499d6e5ec602309501873449c938af61170b2Stephen Hines isRawBitcode(BufPtr, BufEnd); 984cc499d6e5ec602309501873449c938af61170b2Stephen Hines } 994cc499d6e5ec602309501873449c938af61170b2Stephen Hines 1004cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// SkipBitcodeWrapperHeader - Some systems wrap bc files with a special 1014cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// header for padding or other reasons. The format of this header is: 1024cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// 1034cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// struct bc_header { 1044cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// uint32_t Magic; // 0x0B17C0DE 1054cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// uint32_t Version; // Version, currently always 0. 1064cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// uint32_t BitcodeOffset; // Offset to traditional bitcode file. 1074cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// uint32_t BitcodeSize; // Size of traditional bitcode file. 1084cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// ... potentially other gunk ... 1094cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// }; 1104cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// 1114cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// This function is called when we find a file with a matching magic number. 1124cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// In this case, skip down to the subsection of the file that is actually a 1134cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// BC file. 1144cc499d6e5ec602309501873449c938af61170b2Stephen Hines static inline bool SkipBitcodeWrapperHeader(unsigned char *&BufPtr, 1154cc499d6e5ec602309501873449c938af61170b2Stephen Hines unsigned char *&BufEnd) { 1164cc499d6e5ec602309501873449c938af61170b2Stephen Hines enum { 1174cc499d6e5ec602309501873449c938af61170b2Stephen Hines KnownHeaderSize = 4*4, // Size of header we read. 1184cc499d6e5ec602309501873449c938af61170b2Stephen Hines OffsetField = 2*4, // Offset in bytes to Offset field. 1194cc499d6e5ec602309501873449c938af61170b2Stephen Hines SizeField = 3*4 // Offset in bytes to Size field. 1204cc499d6e5ec602309501873449c938af61170b2Stephen Hines }; 1214cc499d6e5ec602309501873449c938af61170b2Stephen Hines 1224cc499d6e5ec602309501873449c938af61170b2Stephen Hines // Must contain the header! 1234cc499d6e5ec602309501873449c938af61170b2Stephen Hines if (BufEnd-BufPtr < KnownHeaderSize) return true; 1244cc499d6e5ec602309501873449c938af61170b2Stephen Hines 1254cc499d6e5ec602309501873449c938af61170b2Stephen Hines unsigned Offset = ( BufPtr[OffsetField ] | 1264cc499d6e5ec602309501873449c938af61170b2Stephen Hines (BufPtr[OffsetField+1] << 8) | 1274cc499d6e5ec602309501873449c938af61170b2Stephen Hines (BufPtr[OffsetField+2] << 16) | 1284cc499d6e5ec602309501873449c938af61170b2Stephen Hines (BufPtr[OffsetField+3] << 24)); 1294cc499d6e5ec602309501873449c938af61170b2Stephen Hines unsigned Size = ( BufPtr[SizeField ] | 1304cc499d6e5ec602309501873449c938af61170b2Stephen Hines (BufPtr[SizeField +1] << 8) | 1314cc499d6e5ec602309501873449c938af61170b2Stephen Hines (BufPtr[SizeField +2] << 16) | 1324cc499d6e5ec602309501873449c938af61170b2Stephen Hines (BufPtr[SizeField +3] << 24)); 1334cc499d6e5ec602309501873449c938af61170b2Stephen Hines 1344cc499d6e5ec602309501873449c938af61170b2Stephen Hines // Verify that Offset+Size fits in the file. 1354cc499d6e5ec602309501873449c938af61170b2Stephen Hines if (Offset+Size > unsigned(BufEnd-BufPtr)) 1364cc499d6e5ec602309501873449c938af61170b2Stephen Hines return true; 1374cc499d6e5ec602309501873449c938af61170b2Stephen Hines BufPtr += Offset; 1384cc499d6e5ec602309501873449c938af61170b2Stephen Hines BufEnd = BufPtr+Size; 1394cc499d6e5ec602309501873449c938af61170b2Stephen Hines return false; 1404cc499d6e5ec602309501873449c938af61170b2Stephen Hines } 1414cc499d6e5ec602309501873449c938af61170b2Stephen Hines} // End llvm_2_9 namespace 1424cc499d6e5ec602309501873449c938af61170b2Stephen Hines 1434cc499d6e5ec602309501873449c938af61170b2Stephen Hines#endif 144