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