Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(404)

Side by Side Diff: lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h

Issue 14314016: Copy LLVM bitcode reader to generate a PNaCl wire format reader. (Closed) Base URL: http://git.chromium.org/native_client/pnacl-llvm.git@master
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/Bitcode/NaCl/Reader/Makefile ('k') | lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/NaClLLVMBitCodes.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
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
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
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
OLDNEW
« no previous file with comments | « lib/Bitcode/NaCl/Reader/Makefile ('k') | lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698