OLD | NEW |
1 //===- BitcodeReader.h - Internal BitcodeReader impl ------------*- C++ -*-===// | 1 //===- NaClBitcodeReader.h ------------------------------------*- C++ -*-===// |
| 2 // Internal NaClBitcodeReader implementation |
2 // | 3 // |
3 // The LLVM Compiler Infrastructure | 4 // The LLVM Compiler Infrastructure |
4 // | 5 // |
5 // This file is distributed under the University of Illinois Open Source | 6 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 7 // License. See LICENSE.TXT for details. |
7 // | 8 // |
8 //===----------------------------------------------------------------------===// | 9 //===----------------------------------------------------------------------===// |
9 // | 10 // |
10 // This header defines the BitcodeReader class. | 11 // This header defines the NaClBitcodeReader class. |
11 // | 12 // |
12 //===----------------------------------------------------------------------===// | 13 //===----------------------------------------------------------------------===// |
13 | 14 |
14 #ifndef BITCODE_READER_H | 15 #ifndef NACL_BITCODE_READER_H |
15 #define BITCODE_READER_H | 16 #define NACL_BITCODE_READER_H |
16 | 17 |
17 #include "llvm/ADT/DenseMap.h" | 18 #include "llvm/ADT/DenseMap.h" |
18 #include "llvm/Bitcode/BitstreamReader.h" | 19 #include "llvm/Bitcode/NaCl/NaClBitstreamReader.h" |
19 #include "llvm/Bitcode/LLVMBitCodes.h" | 20 #include "llvm/Bitcode/NaCl/NaClBitCodes.h" |
20 #include "llvm/GVMaterializer.h" | 21 #include "llvm/GVMaterializer.h" |
21 #include "llvm/IR/Attributes.h" | 22 #include "llvm/IR/Attributes.h" |
22 #include "llvm/IR/OperandTraits.h" | 23 #include "llvm/IR/OperandTraits.h" |
23 #include "llvm/IR/Type.h" | 24 #include "llvm/IR/Type.h" |
24 #include "llvm/Support/ValueHandle.h" | 25 #include "llvm/Support/ValueHandle.h" |
25 #include <vector> | 26 #include <vector> |
26 | 27 |
27 namespace llvm { | 28 namespace llvm { |
28 class MemoryBuffer; | 29 class MemoryBuffer; |
29 class LLVMContext; | 30 class LLVMContext; |
30 | 31 |
31 //===----------------------------------------------------------------------===// | 32 //===----------------------------------------------------------------------===// |
32 // BitcodeReaderValueList Class | 33 // NaClBitcodeReaderValueList Class |
33 //===----------------------------------------------------------------------===// | 34 //===----------------------------------------------------------------------===// |
34 | 35 |
35 class BitcodeReaderValueList { | 36 class NaClBitcodeReaderValueList { |
36 std::vector<WeakVH> ValuePtrs; | 37 std::vector<WeakVH> ValuePtrs; |
37 | 38 |
38 /// ResolveConstants - As we resolve forward-referenced constants, we add | 39 /// ResolveConstants - As we resolve forward-referenced constants, we add |
39 /// information about them to this vector. This allows us to resolve them in | 40 /// information about them to this vector. This allows us to resolve them in |
40 /// bulk instead of resolving each reference at a time. See the code in | 41 /// bulk instead of resolving each reference at a time. See the code in |
41 /// ResolveConstantForwardRefs for more information about this. | 42 /// ResolveConstantForwardRefs for more information about this. |
42 /// | 43 /// |
43 /// The key of this vector is the placeholder constant, the value is the slot | 44 /// The key of this vector is the placeholder constant, the value is the slot |
44 /// number that holds the resolved value. | 45 /// number that holds the resolved value. |
45 typedef std::vector<std::pair<Constant*, unsigned> > ResolveConstantsTy; | 46 typedef std::vector<std::pair<Constant*, unsigned> > ResolveConstantsTy; |
46 ResolveConstantsTy ResolveConstants; | 47 ResolveConstantsTy ResolveConstants; |
47 LLVMContext &Context; | 48 LLVMContext &Context; |
48 public: | 49 public: |
49 BitcodeReaderValueList(LLVMContext &C) : Context(C) {} | 50 NaClBitcodeReaderValueList(LLVMContext &C) : Context(C) {} |
50 ~BitcodeReaderValueList() { | 51 ~NaClBitcodeReaderValueList() { |
51 assert(ResolveConstants.empty() && "Constants not resolved?"); | 52 assert(ResolveConstants.empty() && "Constants not resolved?"); |
52 } | 53 } |
53 | 54 |
54 // vector compatibility methods | 55 // vector compatibility methods |
55 unsigned size() const { return ValuePtrs.size(); } | 56 unsigned size() const { return ValuePtrs.size(); } |
56 void resize(unsigned N) { ValuePtrs.resize(N); } | 57 void resize(unsigned N) { ValuePtrs.resize(N); } |
57 void push_back(Value *V) { | 58 void push_back(Value *V) { |
58 ValuePtrs.push_back(V); | 59 ValuePtrs.push_back(V); |
59 } | 60 } |
60 | 61 |
(...skipping 20 matching lines...) Expand all Loading... |
81 | 82 |
82 void AssignValue(Value *V, unsigned Idx); | 83 void AssignValue(Value *V, unsigned Idx); |
83 | 84 |
84 /// ResolveConstantForwardRefs - Once all constants are read, this method bulk | 85 /// ResolveConstantForwardRefs - Once all constants are read, this method bulk |
85 /// resolves any forward references. | 86 /// resolves any forward references. |
86 void ResolveConstantForwardRefs(); | 87 void ResolveConstantForwardRefs(); |
87 }; | 88 }; |
88 | 89 |
89 | 90 |
90 //===----------------------------------------------------------------------===// | 91 //===----------------------------------------------------------------------===// |
91 // BitcodeReaderMDValueList Class | 92 // NaClBitcodeReaderMDValueList Class |
92 //===----------------------------------------------------------------------===// | 93 //===----------------------------------------------------------------------===// |
93 | 94 |
94 class BitcodeReaderMDValueList { | 95 class NaClBitcodeReaderMDValueList { |
95 std::vector<WeakVH> MDValuePtrs; | 96 std::vector<WeakVH> MDValuePtrs; |
96 | 97 |
97 LLVMContext &Context; | 98 LLVMContext &Context; |
98 public: | 99 public: |
99 BitcodeReaderMDValueList(LLVMContext& C) : Context(C) {} | 100 NaClBitcodeReaderMDValueList(LLVMContext& C) : Context(C) {} |
100 | 101 |
101 // vector compatibility methods | 102 // vector compatibility methods |
102 unsigned size() const { return MDValuePtrs.size(); } | 103 unsigned size() const { return MDValuePtrs.size(); } |
103 void resize(unsigned N) { MDValuePtrs.resize(N); } | 104 void resize(unsigned N) { MDValuePtrs.resize(N); } |
104 void push_back(Value *V) { MDValuePtrs.push_back(V); } | 105 void push_back(Value *V) { MDValuePtrs.push_back(V); } |
105 void clear() { MDValuePtrs.clear(); } | 106 void clear() { MDValuePtrs.clear(); } |
106 Value *back() const { return MDValuePtrs.back(); } | 107 Value *back() const { return MDValuePtrs.back(); } |
107 void pop_back() { MDValuePtrs.pop_back(); } | 108 void pop_back() { MDValuePtrs.pop_back(); } |
108 bool empty() const { return MDValuePtrs.empty(); } | 109 bool empty() const { return MDValuePtrs.empty(); } |
109 | 110 |
110 Value *operator[](unsigned i) const { | 111 Value *operator[](unsigned i) const { |
111 assert(i < MDValuePtrs.size()); | 112 assert(i < MDValuePtrs.size()); |
112 return MDValuePtrs[i]; | 113 return MDValuePtrs[i]; |
113 } | 114 } |
114 | 115 |
115 void shrinkTo(unsigned N) { | 116 void shrinkTo(unsigned N) { |
116 assert(N <= size() && "Invalid shrinkTo request!"); | 117 assert(N <= size() && "Invalid shrinkTo request!"); |
117 MDValuePtrs.resize(N); | 118 MDValuePtrs.resize(N); |
118 } | 119 } |
119 | 120 |
120 Value *getValueFwdRef(unsigned Idx); | 121 Value *getValueFwdRef(unsigned Idx); |
121 void AssignValue(Value *V, unsigned Idx); | 122 void AssignValue(Value *V, unsigned Idx); |
122 }; | 123 }; |
123 | 124 |
124 class BitcodeReader : public GVMaterializer { | 125 class NaClBitcodeReader : public GVMaterializer { |
125 LLVMContext &Context; | 126 LLVMContext &Context; |
126 Module *TheModule; | 127 Module *TheModule; |
127 MemoryBuffer *Buffer; | 128 MemoryBuffer *Buffer; |
128 bool BufferOwned; | 129 bool BufferOwned; |
129 OwningPtr<BitstreamReader> StreamFile; | 130 OwningPtr<NaClBitstreamReader> StreamFile; |
130 BitstreamCursor Stream; | 131 NaClBitstreamCursor Stream; |
131 DataStreamer *LazyStreamer; | 132 DataStreamer *LazyStreamer; |
132 uint64_t NextUnreadBit; | 133 uint64_t NextUnreadBit; |
133 bool SeenValueSymbolTable; | 134 bool SeenValueSymbolTable; |
134 | 135 |
135 const char *ErrorString; | 136 const char *ErrorString; |
136 | 137 |
137 std::vector<Type*> TypeList; | 138 std::vector<Type*> TypeList; |
138 BitcodeReaderValueList ValueList; | 139 NaClBitcodeReaderValueList ValueList; |
139 BitcodeReaderMDValueList MDValueList; | 140 NaClBitcodeReaderMDValueList MDValueList; |
140 SmallVector<Instruction *, 64> InstructionList; | 141 SmallVector<Instruction *, 64> InstructionList; |
141 SmallVector<SmallVector<uint64_t, 64>, 64> UseListRecords; | 142 SmallVector<SmallVector<uint64_t, 64>, 64> UseListRecords; |
142 | 143 |
143 std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; | 144 std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInits; |
144 std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; | 145 std::vector<std::pair<GlobalAlias*, unsigned> > AliasInits; |
145 | 146 |
146 /// MAttributes - The set of attributes by index. Index zero in the | 147 /// MAttributes - The set of attributes by index. Index zero in the |
147 /// file is for null, and is thus not represented here. As such all indices | 148 /// file is for null, and is thus not represented here. As such all indices |
148 /// are off by one. | 149 /// are off by one. |
149 std::vector<AttributeSet> MAttributes; | 150 std::vector<AttributeSet> MAttributes; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 /// UseRelativeIDs - Indicates that we are using a new encoding for | 186 /// UseRelativeIDs - Indicates that we are using a new encoding for |
186 /// instruction operands where most operands in the current | 187 /// instruction operands where most operands in the current |
187 /// FUNCTION_BLOCK are encoded relative to the instruction number, | 188 /// FUNCTION_BLOCK are encoded relative to the instruction number, |
188 /// for a more compact encoding. Some instruction operands are not | 189 /// for a more compact encoding. Some instruction operands are not |
189 /// relative to the instruction ID: basic block numbers, and types. | 190 /// relative to the instruction ID: basic block numbers, and types. |
190 /// Once the old style function blocks have been phased out, we would | 191 /// Once the old style function blocks have been phased out, we would |
191 /// not need this flag. | 192 /// not need this flag. |
192 bool UseRelativeIDs; | 193 bool UseRelativeIDs; |
193 | 194 |
194 public: | 195 public: |
195 explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C) | 196 explicit NaClBitcodeReader(MemoryBuffer *buffer, LLVMContext &C) |
196 : Context(C), TheModule(0), Buffer(buffer), BufferOwned(false), | 197 : Context(C), TheModule(0), Buffer(buffer), BufferOwned(false), |
197 LazyStreamer(0), NextUnreadBit(0), SeenValueSymbolTable(false), | 198 LazyStreamer(0), NextUnreadBit(0), SeenValueSymbolTable(false), |
198 ErrorString(0), ValueList(C), MDValueList(C), | 199 ErrorString(0), ValueList(C), MDValueList(C), |
199 SeenFirstFunctionBody(false), UseRelativeIDs(false) { | 200 SeenFirstFunctionBody(false), UseRelativeIDs(false) { |
200 } | 201 } |
201 explicit BitcodeReader(DataStreamer *streamer, LLVMContext &C) | 202 explicit NaClBitcodeReader(DataStreamer *streamer, LLVMContext &C) |
202 : Context(C), TheModule(0), Buffer(0), BufferOwned(false), | 203 : Context(C), TheModule(0), Buffer(0), BufferOwned(false), |
203 LazyStreamer(streamer), NextUnreadBit(0), SeenValueSymbolTable(false), | 204 LazyStreamer(streamer), NextUnreadBit(0), SeenValueSymbolTable(false), |
204 ErrorString(0), ValueList(C), MDValueList(C), | 205 ErrorString(0), ValueList(C), MDValueList(C), |
205 SeenFirstFunctionBody(false), UseRelativeIDs(false) { | 206 SeenFirstFunctionBody(false), UseRelativeIDs(false) { |
206 } | 207 } |
207 ~BitcodeReader() { | 208 ~NaClBitcodeReader() { |
208 FreeState(); | 209 FreeState(); |
209 } | 210 } |
210 | 211 |
211 void materializeForwardReferencedFunctions(); | 212 void materializeForwardReferencedFunctions(); |
212 | 213 |
213 void FreeState(); | 214 void FreeState(); |
214 | 215 |
215 /// setBufferOwned - If this is true, the reader will destroy the MemoryBuffer | 216 /// setBufferOwned - If this is true, the reader will destroy the MemoryBuffer |
216 /// when the reader is destroyed. | 217 /// when the reader is destroyed. |
217 void setBufferOwned(bool Owned) { BufferOwned = Owned; } | 218 void setBufferOwned(bool Owned) { BufferOwned = Owned; } |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 bool InitStream(); | 341 bool InitStream(); |
341 bool InitStreamFromBuffer(); | 342 bool InitStreamFromBuffer(); |
342 bool InitLazyStream(); | 343 bool InitLazyStream(); |
343 bool FindFunctionInStream(Function *F, | 344 bool FindFunctionInStream(Function *F, |
344 DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator); | 345 DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator); |
345 }; | 346 }; |
346 | 347 |
347 } // End llvm namespace | 348 } // End llvm namespace |
348 | 349 |
349 #endif | 350 #endif |
OLD | NEW |