OLD | NEW |
---|---|
1 //===-- llvm/Bitcode/ReaderWriter.h - Bitcode reader/writers ----*- C++ -*-===// | 1 //===-- llvm/Bitcode/ReaderWriter.h - Bitcode reader/writers ----*- C++ -*-===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This header defines interfaces to read and write LLVM bitcode files/streams. | 10 // This header defines interfaces to read and write LLVM bitcode files/streams. |
11 // | 11 // |
12 //===----------------------------------------------------------------------===// | 12 //===----------------------------------------------------------------------===// |
13 | 13 |
14 #ifndef LLVM_BITCODE_H | 14 #ifndef LLVM_BITCODE_H |
15 #define LLVM_BITCODE_H | 15 #define LLVM_BITCODE_H |
16 | 16 |
17 #include "llvm/Bitcode/BitcodeStream.h" | |
17 #include <string> | 18 #include <string> |
18 | 19 |
19 namespace llvm { | 20 namespace llvm { |
20 class Module; | 21 class Module; |
21 class MemoryBuffer; | 22 class MemoryBuffer; |
22 class ModulePass; | 23 class ModulePass; |
23 class BitstreamWriter; | 24 class BitstreamWriter; |
24 class LLVMContext; | 25 class LLVMContext; |
25 class raw_ostream; | 26 class raw_ostream; |
26 | 27 |
27 /// getLazyBitcodeModule - Read the header of the specified bitcode buffer | 28 /// getLazyBitcodeModule - Read the header of the specified bitcode buffer |
28 /// and prepare for lazy deserialization of function bodies. If successful, | 29 /// and prepare for lazy deserialization of function bodies. If successful, |
29 /// this takes ownership of 'buffer' and returns a non-null pointer. On | 30 /// this takes ownership of 'buffer' and returns a non-null pointer. On |
30 /// error, this returns null, *does not* take ownership of Buffer, and fills | 31 /// error, this returns null, *does not* take ownership of Buffer, and fills |
31 /// in *ErrMsg with an error description if ErrMsg is non-null. | 32 /// in *ErrMsg with an error description if ErrMsg is non-null. |
32 Module *getLazyBitcodeModule(MemoryBuffer *Buffer, | 33 Module *getLazyBitcodeModule(MemoryBuffer *Buffer, |
33 LLVMContext& Context, | 34 LLVMContext& Context, |
34 std::string *ErrMsg = 0); | 35 std::string *ErrMsg = 0); |
35 | 36 |
37 /// getStreamedBitcodeModule - Read the header of the specified stream | |
38 /// and prepare for lazy deserialization and streaming of function bodies. | |
39 /// On error, this returns null, and fills | |
40 /// in *ErrMsg with an error description if ErrMsg is non-null. | |
nlewycky
2011/11/05 00:45:06
Reflow text.
(google.com) Derek Schuff
2011/11/07 22:33:50
Done.
| |
41 Module *getStreamedBitcodeModule(const std::string &name, | |
42 BitcodeStreamer* streamer, | |
nlewycky
2011/11/05 00:45:06
Fix indent.
(google.com) Derek Schuff
2011/11/07 22:33:50
Done.
| |
43 LLVMContext& Context, | |
44 std::string *ErrMsg = 0); | |
45 | |
36 /// getBitcodeTargetTriple - Read the header of the specified bitcode | 46 /// getBitcodeTargetTriple - Read the header of the specified bitcode |
37 /// buffer and extract just the triple information. If successful, | 47 /// buffer and extract just the triple information. If successful, |
38 /// this returns a string and *does not* take ownership | 48 /// this returns a string and *does not* take ownership |
39 /// of 'buffer'. On error, this returns "", and fills in *ErrMsg | 49 /// of 'buffer'. On error, this returns "", and fills in *ErrMsg |
40 /// if ErrMsg is non-null. | 50 /// if ErrMsg is non-null. |
41 std::string getBitcodeTargetTriple(MemoryBuffer *Buffer, | 51 std::string getBitcodeTargetTriple(MemoryBuffer *Buffer, |
42 LLVMContext& Context, | 52 LLVMContext& Context, |
43 std::string *ErrMsg = 0); | 53 std::string *ErrMsg = 0); |
44 | 54 |
45 /// ParseBitcodeFile - Read the specified bitcode file, returning the module. | 55 /// ParseBitcodeFile - Read the specified bitcode file, returning the module. |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
106 /// uint32_t Magic; // 0x0B17C0DE | 116 /// uint32_t Magic; // 0x0B17C0DE |
107 /// uint32_t Version; // Version, currently always 0. | 117 /// uint32_t Version; // Version, currently always 0. |
108 /// uint32_t BitcodeOffset; // Offset to traditional bitcode file. | 118 /// uint32_t BitcodeOffset; // Offset to traditional bitcode file. |
109 /// uint32_t BitcodeSize; // Size of traditional bitcode file. | 119 /// uint32_t BitcodeSize; // Size of traditional bitcode file. |
110 /// ... potentially other gunk ... | 120 /// ... potentially other gunk ... |
111 /// }; | 121 /// }; |
112 /// | 122 /// |
113 /// This function is called when we find a file with a matching magic number. | 123 /// This function is called when we find a file with a matching magic number. |
114 /// In this case, skip down to the subsection of the file that is actually a | 124 /// In this case, skip down to the subsection of the file that is actually a |
115 /// BC file. | 125 /// BC file. |
116 static inline bool SkipBitcodeWrapperHeader(unsigned char *&BufPtr, | 126 /// If 'verify' is true, check that the file fits in the buffer. |
nlewycky
2011/11/05 00:45:06
How does the caller tell whether we returned succe
(google.com) Derek Schuff
2011/11/07 22:33:50
I'm not sure I understand the question.
Before it
| |
117 unsigned char *&BufEnd) { | 127 static inline bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr, |
128 const unsigned char *&BufEnd, | |
129 bool Verify) { | |
118 enum { | 130 enum { |
119 KnownHeaderSize = 4*4, // Size of header we read. | 131 KnownHeaderSize = 4*4, // Size of header we read. |
120 OffsetField = 2*4, // Offset in bytes to Offset field. | 132 OffsetField = 2*4, // Offset in bytes to Offset field. |
121 SizeField = 3*4 // Offset in bytes to Size field. | 133 SizeField = 3*4 // Offset in bytes to Size field. |
122 }; | 134 }; |
123 | 135 |
124 // Must contain the header! | 136 // Must contain the header! |
125 if (BufEnd-BufPtr < KnownHeaderSize) return true; | 137 if (BufEnd-BufPtr < KnownHeaderSize) return true; |
126 | 138 |
127 unsigned Offset = ( BufPtr[OffsetField ] | | 139 unsigned Offset = ( BufPtr[OffsetField ] | |
128 (BufPtr[OffsetField+1] << 8) | | 140 (BufPtr[OffsetField+1] << 8) | |
129 (BufPtr[OffsetField+2] << 16) | | 141 (BufPtr[OffsetField+2] << 16) | |
130 (BufPtr[OffsetField+3] << 24)); | 142 (BufPtr[OffsetField+3] << 24)); |
131 unsigned Size = ( BufPtr[SizeField ] | | 143 unsigned Size = ( BufPtr[SizeField ] | |
132 (BufPtr[SizeField +1] << 8) | | 144 (BufPtr[SizeField +1] << 8) | |
133 (BufPtr[SizeField +2] << 16) | | 145 (BufPtr[SizeField +2] << 16) | |
134 (BufPtr[SizeField +3] << 24)); | 146 (BufPtr[SizeField +3] << 24)); |
135 | 147 |
136 // Verify that Offset+Size fits in the file. | 148 // Verify that Offset+Size fits in the file. |
137 if (Offset+Size > unsigned(BufEnd-BufPtr)) | 149 if (Verify && Offset+Size > unsigned(BufEnd-BufPtr)) |
138 return true; | 150 return true; |
139 BufPtr += Offset; | 151 BufPtr += Offset; |
140 BufEnd = BufPtr+Size; | 152 BufEnd = BufPtr+Size; |
141 return false; | 153 return false; |
142 } | 154 } |
143 } // End llvm namespace | 155 } // End llvm namespace |
144 | 156 |
145 #endif | 157 #endif |
OLD | NEW |