19b044ec938fd56355012851890c63974c8042c9fStephen Hines//===-- llvm/Bitcode/ReaderWriter.h - Bitcode reader/writers ----*- C++ -*-===// 29b044ec938fd56355012851890c63974c8042c9fStephen Hines// 39b044ec938fd56355012851890c63974c8042c9fStephen Hines// The LLVM Compiler Infrastructure 49b044ec938fd56355012851890c63974c8042c9fStephen Hines// 59b044ec938fd56355012851890c63974c8042c9fStephen Hines// This file is distributed under the University of Illinois Open Source 69b044ec938fd56355012851890c63974c8042c9fStephen Hines// License. See LICENSE.TXT for details. 79b044ec938fd56355012851890c63974c8042c9fStephen Hines// 89b044ec938fd56355012851890c63974c8042c9fStephen Hines//===----------------------------------------------------------------------===// 99b044ec938fd56355012851890c63974c8042c9fStephen Hines// 109b044ec938fd56355012851890c63974c8042c9fStephen Hines// This header defines interfaces to read and write LLVM bitcode files/streams. 119b044ec938fd56355012851890c63974c8042c9fStephen Hines// 129b044ec938fd56355012851890c63974c8042c9fStephen Hines//===----------------------------------------------------------------------===// 139b044ec938fd56355012851890c63974c8042c9fStephen Hines 149b044ec938fd56355012851890c63974c8042c9fStephen Hines#ifndef LLVM_BITCODE_2_9_FUNC_H 159b044ec938fd56355012851890c63974c8042c9fStephen Hines#define LLVM_BITCODE_2_9_FUNC_H 169b044ec938fd56355012851890c63974c8042c9fStephen Hines 179b044ec938fd56355012851890c63974c8042c9fStephen Hines#include <string> 189b044ec938fd56355012851890c63974c8042c9fStephen Hines 199b044ec938fd56355012851890c63974c8042c9fStephen Hinesnamespace llvm { 209b044ec938fd56355012851890c63974c8042c9fStephen Hines class Module; 219b044ec938fd56355012851890c63974c8042c9fStephen Hines class MemoryBuffer; 229b044ec938fd56355012851890c63974c8042c9fStephen Hines class ModulePass; 239b044ec938fd56355012851890c63974c8042c9fStephen Hines class BitstreamWriter; 249b044ec938fd56355012851890c63974c8042c9fStephen Hines class LLVMContext; 259b044ec938fd56355012851890c63974c8042c9fStephen Hines class raw_ostream; 269b044ec938fd56355012851890c63974c8042c9fStephen Hines} // End llvm namespace 279b044ec938fd56355012851890c63974c8042c9fStephen Hines 289b044ec938fd56355012851890c63974c8042c9fStephen Hinesnamespace llvm_2_9_func { 299b044ec938fd56355012851890c63974c8042c9fStephen Hines /// getLazyBitcodeModule - Read the header of the specified bitcode buffer 309b044ec938fd56355012851890c63974c8042c9fStephen Hines /// and prepare for lazy deserialization of function bodies. If successful, 319b044ec938fd56355012851890c63974c8042c9fStephen Hines /// this takes ownership of 'buffer' and returns a non-null pointer. On 329b044ec938fd56355012851890c63974c8042c9fStephen Hines /// error, this returns null, *does not* take ownership of Buffer, and fills 339b044ec938fd56355012851890c63974c8042c9fStephen Hines /// in *ErrMsg with an error description if ErrMsg is non-null. 349b044ec938fd56355012851890c63974c8042c9fStephen Hines llvm::Module *getLazyBitcodeModule(llvm::MemoryBuffer *Buffer, 359b044ec938fd56355012851890c63974c8042c9fStephen Hines llvm::LLVMContext& Context, 369b044ec938fd56355012851890c63974c8042c9fStephen Hines std::string *ErrMsg = 0); 379b044ec938fd56355012851890c63974c8042c9fStephen Hines 389b044ec938fd56355012851890c63974c8042c9fStephen Hines /// getBitcodeTargetTriple - Read the header of the specified bitcode 399b044ec938fd56355012851890c63974c8042c9fStephen Hines /// buffer and extract just the triple information. If successful, 409b044ec938fd56355012851890c63974c8042c9fStephen Hines /// this returns a string and *does not* take ownership 419b044ec938fd56355012851890c63974c8042c9fStephen Hines /// of 'buffer'. On error, this returns "", and fills in *ErrMsg 429b044ec938fd56355012851890c63974c8042c9fStephen Hines /// if ErrMsg is non-null. 439b044ec938fd56355012851890c63974c8042c9fStephen Hines std::string getBitcodeTargetTriple(llvm::MemoryBuffer *Buffer, 449b044ec938fd56355012851890c63974c8042c9fStephen Hines llvm::LLVMContext& Context, 459b044ec938fd56355012851890c63974c8042c9fStephen Hines std::string *ErrMsg = 0); 469b044ec938fd56355012851890c63974c8042c9fStephen Hines 479b044ec938fd56355012851890c63974c8042c9fStephen Hines /// ParseBitcodeFile - Read the specified bitcode file, returning the module. 489b044ec938fd56355012851890c63974c8042c9fStephen Hines /// If an error occurs, this returns null and fills in *ErrMsg if it is 499b044ec938fd56355012851890c63974c8042c9fStephen Hines /// non-null. This method *never* takes ownership of Buffer. 509b044ec938fd56355012851890c63974c8042c9fStephen Hines llvm::Module *ParseBitcodeFile(llvm::MemoryBuffer *Buffer, llvm::LLVMContext& Context, 519b044ec938fd56355012851890c63974c8042c9fStephen Hines std::string *ErrMsg = 0); 529b044ec938fd56355012851890c63974c8042c9fStephen Hines 539b044ec938fd56355012851890c63974c8042c9fStephen Hines /// WriteBitcodeToFile - Write the specified module to the specified 549b044ec938fd56355012851890c63974c8042c9fStephen Hines /// raw output stream. For streams where it matters, the given stream 559b044ec938fd56355012851890c63974c8042c9fStephen Hines /// should be in "binary" mode. 569b044ec938fd56355012851890c63974c8042c9fStephen Hines void WriteBitcodeToFile(const llvm::Module *M, llvm::raw_ostream &Out); 579b044ec938fd56355012851890c63974c8042c9fStephen Hines 589b044ec938fd56355012851890c63974c8042c9fStephen Hines /// createBitcodeWriterPass - Create and return a pass that writes the module 599b044ec938fd56355012851890c63974c8042c9fStephen Hines /// to the specified ostream. 609b044ec938fd56355012851890c63974c8042c9fStephen Hines llvm::ModulePass *createBitcodeWriterPass(llvm::raw_ostream &Str); 619b044ec938fd56355012851890c63974c8042c9fStephen Hines 629b044ec938fd56355012851890c63974c8042c9fStephen Hines 639b044ec938fd56355012851890c63974c8042c9fStephen Hines /// isBitcodeWrapper - Return true if the given bytes are the magic bytes 649b044ec938fd56355012851890c63974c8042c9fStephen Hines /// for an LLVM IR bitcode wrapper. 659b044ec938fd56355012851890c63974c8042c9fStephen Hines /// 669b044ec938fd56355012851890c63974c8042c9fStephen Hines static inline bool isBitcodeWrapper(const unsigned char *BufPtr, 679b044ec938fd56355012851890c63974c8042c9fStephen Hines const unsigned char *BufEnd) { 689b044ec938fd56355012851890c63974c8042c9fStephen Hines // See if you can find the hidden message in the magic bytes :-). 699b044ec938fd56355012851890c63974c8042c9fStephen Hines // (Hint: it's a little-endian encoding.) 709b044ec938fd56355012851890c63974c8042c9fStephen Hines return BufPtr != BufEnd && 719b044ec938fd56355012851890c63974c8042c9fStephen Hines BufPtr[0] == 0xDE && 729b044ec938fd56355012851890c63974c8042c9fStephen Hines BufPtr[1] == 0xC0 && 739b044ec938fd56355012851890c63974c8042c9fStephen Hines BufPtr[2] == 0x17 && 749b044ec938fd56355012851890c63974c8042c9fStephen Hines BufPtr[3] == 0x0B; 759b044ec938fd56355012851890c63974c8042c9fStephen Hines } 769b044ec938fd56355012851890c63974c8042c9fStephen Hines 779b044ec938fd56355012851890c63974c8042c9fStephen Hines /// isRawBitcode - Return true if the given bytes are the magic bytes for 789b044ec938fd56355012851890c63974c8042c9fStephen Hines /// raw LLVM IR bitcode (without a wrapper). 799b044ec938fd56355012851890c63974c8042c9fStephen Hines /// 809b044ec938fd56355012851890c63974c8042c9fStephen Hines static inline bool isRawBitcode(const unsigned char *BufPtr, 819b044ec938fd56355012851890c63974c8042c9fStephen Hines const unsigned char *BufEnd) { 829b044ec938fd56355012851890c63974c8042c9fStephen Hines // These bytes sort of have a hidden message, but it's not in 839b044ec938fd56355012851890c63974c8042c9fStephen Hines // little-endian this time, and it's a little redundant. 849b044ec938fd56355012851890c63974c8042c9fStephen Hines return BufPtr != BufEnd && 859b044ec938fd56355012851890c63974c8042c9fStephen Hines BufPtr[0] == 'B' && 869b044ec938fd56355012851890c63974c8042c9fStephen Hines BufPtr[1] == 'C' && 879b044ec938fd56355012851890c63974c8042c9fStephen Hines BufPtr[2] == 0xc0 && 889b044ec938fd56355012851890c63974c8042c9fStephen Hines BufPtr[3] == 0xde; 899b044ec938fd56355012851890c63974c8042c9fStephen Hines } 909b044ec938fd56355012851890c63974c8042c9fStephen Hines 919b044ec938fd56355012851890c63974c8042c9fStephen Hines /// isBitcode - Return true if the given bytes are the magic bytes for 929b044ec938fd56355012851890c63974c8042c9fStephen Hines /// LLVM IR bitcode, either with or without a wrapper. 939b044ec938fd56355012851890c63974c8042c9fStephen Hines /// 949b044ec938fd56355012851890c63974c8042c9fStephen Hines static bool inline isBitcode(const unsigned char *BufPtr, 959b044ec938fd56355012851890c63974c8042c9fStephen Hines const unsigned char *BufEnd) { 969b044ec938fd56355012851890c63974c8042c9fStephen Hines return isBitcodeWrapper(BufPtr, BufEnd) || 979b044ec938fd56355012851890c63974c8042c9fStephen Hines isRawBitcode(BufPtr, BufEnd); 989b044ec938fd56355012851890c63974c8042c9fStephen Hines } 999b044ec938fd56355012851890c63974c8042c9fStephen Hines 1009b044ec938fd56355012851890c63974c8042c9fStephen Hines /// SkipBitcodeWrapperHeader - Some systems wrap bc files with a special 1019b044ec938fd56355012851890c63974c8042c9fStephen Hines /// header for padding or other reasons. The format of this header is: 1029b044ec938fd56355012851890c63974c8042c9fStephen Hines /// 1039b044ec938fd56355012851890c63974c8042c9fStephen Hines /// struct bc_header { 1049b044ec938fd56355012851890c63974c8042c9fStephen Hines /// uint32_t Magic; // 0x0B17C0DE 1059b044ec938fd56355012851890c63974c8042c9fStephen Hines /// uint32_t Version; // Version, currently always 0. 1069b044ec938fd56355012851890c63974c8042c9fStephen Hines /// uint32_t BitcodeOffset; // Offset to traditional bitcode file. 1079b044ec938fd56355012851890c63974c8042c9fStephen Hines /// uint32_t BitcodeSize; // Size of traditional bitcode file. 1089b044ec938fd56355012851890c63974c8042c9fStephen Hines /// ... potentially other gunk ... 1099b044ec938fd56355012851890c63974c8042c9fStephen Hines /// }; 1109b044ec938fd56355012851890c63974c8042c9fStephen Hines /// 1119b044ec938fd56355012851890c63974c8042c9fStephen Hines /// This function is called when we find a file with a matching magic number. 1129b044ec938fd56355012851890c63974c8042c9fStephen Hines /// In this case, skip down to the subsection of the file that is actually a 1139b044ec938fd56355012851890c63974c8042c9fStephen Hines /// BC file. 1149b044ec938fd56355012851890c63974c8042c9fStephen Hines static inline bool SkipBitcodeWrapperHeader(unsigned char *&BufPtr, 1159b044ec938fd56355012851890c63974c8042c9fStephen Hines unsigned char *&BufEnd) { 1169b044ec938fd56355012851890c63974c8042c9fStephen Hines enum { 1179b044ec938fd56355012851890c63974c8042c9fStephen Hines KnownHeaderSize = 4*4, // Size of header we read. 1189b044ec938fd56355012851890c63974c8042c9fStephen Hines OffsetField = 2*4, // Offset in bytes to Offset field. 1199b044ec938fd56355012851890c63974c8042c9fStephen Hines SizeField = 3*4 // Offset in bytes to Size field. 1209b044ec938fd56355012851890c63974c8042c9fStephen Hines }; 1219b044ec938fd56355012851890c63974c8042c9fStephen Hines 1229b044ec938fd56355012851890c63974c8042c9fStephen Hines // Must contain the header! 1239b044ec938fd56355012851890c63974c8042c9fStephen Hines if (BufEnd-BufPtr < KnownHeaderSize) return true; 1249b044ec938fd56355012851890c63974c8042c9fStephen Hines 1259b044ec938fd56355012851890c63974c8042c9fStephen Hines unsigned Offset = ( BufPtr[OffsetField ] | 1269b044ec938fd56355012851890c63974c8042c9fStephen Hines (BufPtr[OffsetField+1] << 8) | 1279b044ec938fd56355012851890c63974c8042c9fStephen Hines (BufPtr[OffsetField+2] << 16) | 1289b044ec938fd56355012851890c63974c8042c9fStephen Hines (BufPtr[OffsetField+3] << 24)); 1299b044ec938fd56355012851890c63974c8042c9fStephen Hines unsigned Size = ( BufPtr[SizeField ] | 1309b044ec938fd56355012851890c63974c8042c9fStephen Hines (BufPtr[SizeField +1] << 8) | 1319b044ec938fd56355012851890c63974c8042c9fStephen Hines (BufPtr[SizeField +2] << 16) | 1329b044ec938fd56355012851890c63974c8042c9fStephen Hines (BufPtr[SizeField +3] << 24)); 1339b044ec938fd56355012851890c63974c8042c9fStephen Hines 1349b044ec938fd56355012851890c63974c8042c9fStephen Hines // Verify that Offset+Size fits in the file. 1359b044ec938fd56355012851890c63974c8042c9fStephen Hines if (Offset+Size > unsigned(BufEnd-BufPtr)) 1369b044ec938fd56355012851890c63974c8042c9fStephen Hines return true; 1379b044ec938fd56355012851890c63974c8042c9fStephen Hines BufPtr += Offset; 1389b044ec938fd56355012851890c63974c8042c9fStephen Hines BufEnd = BufPtr+Size; 1399b044ec938fd56355012851890c63974c8042c9fStephen Hines return false; 1409b044ec938fd56355012851890c63974c8042c9fStephen Hines } 1419b044ec938fd56355012851890c63974c8042c9fStephen Hines} // End llvm_2_9_func namespace 1429b044ec938fd56355012851890c63974c8042c9fStephen Hines 1439b044ec938fd56355012851890c63974c8042c9fStephen Hines#endif 144