OLD | NEW |
---|---|
1 //===- subzero/src/PNaClTranslator.cpp - ICE from bitcode -----------------===// | 1 //===- subzero/src/PNaClTranslator.cpp - ICE from bitcode -----------------===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
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 file implements the PNaCl bitcode file to Ice, to machine code | 10 // This file implements the PNaCl bitcode file to Ice, to machine code |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
42 using namespace llvm; | 42 using namespace llvm; |
43 | 43 |
44 namespace { | 44 namespace { |
45 | 45 |
46 // TODO(kschimpf) Remove error recovery once implementation complete. | 46 // TODO(kschimpf) Remove error recovery once implementation complete. |
47 static cl::opt<bool> AllowErrorRecovery( | 47 static cl::opt<bool> AllowErrorRecovery( |
48 "allow-pnacl-reader-error-recovery", | 48 "allow-pnacl-reader-error-recovery", |
49 cl::desc("Allow error recovery when reading PNaCl bitcode."), | 49 cl::desc("Allow error recovery when reading PNaCl bitcode."), |
50 cl::init(false)); | 50 cl::init(false)); |
51 | 51 |
52 // Models elements in the list of types defined in the types block. | |
53 // These elements can be a (simple) type, or a function type | |
54 // signature. | |
55 class ExtendedType { | |
56 ExtendedType(const ExtendedType &) = delete; | |
57 ExtendedType &operator=(const ExtendedType &) = delete; | |
58 | |
59 public: | |
60 // Discriminator for LLVM-style RTTI. | |
61 enum ExtendedTypeKind { SimpleExtendedKind, FcnSigExtendedKind }; | |
62 virtual ~ExtendedType() {} | |
63 ExtendedTypeKind getKind() const { return Kind; } | |
64 virtual void Print(Ice::Ostream &Stream) const = 0; | |
65 | |
66 protected: | |
67 explicit ExtendedType(ExtendedTypeKind Kind) : Kind(Kind) {} | |
68 | |
69 private: | |
70 ExtendedTypeKind Kind; | |
71 }; | |
72 | |
73 Ice::Ostream &operator<<(Ice::Ostream &Stream, const ExtendedType &Ty) { | |
74 Ty.Print(Stream); | |
75 return Stream; | |
76 } | |
77 | |
78 // Models an ICE type as an extended type. | |
79 class SimpleExtendedType : public ExtendedType { | |
80 SimpleExtendedType(const SimpleExtendedType &) = delete; | |
81 SimpleExtendedType &operator=(const SimpleExtendedType &) = delete; | |
82 | |
83 public: | |
84 explicit SimpleExtendedType(Ice::Type SimpleType) | |
85 : ExtendedType(SimpleExtendedKind), SimpleType(SimpleType) {} | |
86 | |
87 ~SimpleExtendedType() final {} | |
88 | |
89 Ice::Type getType() const { return SimpleType; } | |
90 | |
91 void Print(Ice::Ostream &Stream) const final { Stream << SimpleType; } | |
92 | |
93 static bool classof(const ExtendedType *Ty) { | |
94 return Ty->getKind() == SimpleExtendedKind; | |
95 } | |
96 | |
97 private: | |
98 Ice::Type SimpleType; | |
99 }; | |
100 | |
101 // Models a function signature as an extended type. | |
102 class FcnSigExtendedType : public ExtendedType { | |
103 FcnSigExtendedType(const FcnSigExtendedType &) = delete; | |
104 FcnSigExtendedType &operator=(const FcnSigExtendedType &) = delete; | |
105 | |
106 public: | |
107 explicit FcnSigExtendedType(Ice::Type ReturnType) | |
108 : ExtendedType(FcnSigExtendedKind), FcnSig(ReturnType) {} | |
109 const Ice::FcnSigType &getFcnSig() const { return FcnSig; } | |
110 void appendArgType(Ice::Type ArgType) { FcnSig.appendArgType(ArgType); } | |
111 void Print(Ice::Ostream &Stream) const final { Stream << FcnSig; } | |
112 static bool classof(const ExtendedType *Ty) { | |
113 return Ty->getKind() == FcnSigExtendedKind; | |
114 } | |
115 | |
116 private: | |
117 Ice::FcnSigType FcnSig; | |
118 }; | |
119 | |
52 // Top-level class to read PNaCl bitcode files, and translate to ICE. | 120 // Top-level class to read PNaCl bitcode files, and translate to ICE. |
53 class TopLevelParser : public NaClBitcodeParser { | 121 class TopLevelParser : public NaClBitcodeParser { |
54 TopLevelParser(const TopLevelParser &) = delete; | 122 TopLevelParser(const TopLevelParser &) = delete; |
55 TopLevelParser &operator=(const TopLevelParser &) = delete; | 123 TopLevelParser &operator=(const TopLevelParser &) = delete; |
56 | 124 |
57 public: | 125 public: |
58 TopLevelParser(Ice::Translator &Translator, const std::string &InputName, | 126 TopLevelParser(Ice::Translator &Translator, const std::string &InputName, |
59 NaClBitcodeHeader &Header, NaClBitstreamCursor &Cursor, | 127 NaClBitcodeHeader &Header, NaClBitstreamCursor &Cursor, |
60 bool &ErrorStatus) | 128 bool &ErrorStatus) |
61 : NaClBitcodeParser(Cursor), Translator(Translator), | 129 : NaClBitcodeParser(Cursor), Translator(Translator), |
62 Mod(new Module(InputName, getGlobalContext())), DL(PNaClDataLayout), | 130 Mod(new Module(InputName, getGlobalContext())), DL(PNaClDataLayout), |
63 Header(Header), TypeConverter(getLLVMContext()), | 131 Header(Header), TypeConverter(getLLVMContext()), |
64 ErrorStatus(ErrorStatus), NumErrors(0), NumFunctionIds(0), | 132 ErrorStatus(ErrorStatus), NumErrors(0), NumFunctionIds(0), |
65 NumFunctionBlocks(0), | 133 NumFunctionBlocks(0), |
66 GlobalVarPlaceHolderType(convertToLLVMType(Ice::IceType_i8)) { | 134 GlobalVarPlaceHolderType(convertToLLVMType(Ice::IceType_i8)), |
135 UndefinedFcnSigType(Ice::IceType_void) { | |
67 Mod->setDataLayout(PNaClDataLayout); | 136 Mod->setDataLayout(PNaClDataLayout); |
68 setErrStream(Translator.getContext()->getStrDump()); | 137 setErrStream(Translator.getContext()->getStrDump()); |
69 } | 138 } |
70 | 139 |
71 ~TopLevelParser() override {} | 140 ~TopLevelParser() override { DeleteContainerPointers(TypeIDValues); } |
Jim Stichnoth
2014/10/05 15:35:47
I think that if possible, the memory allocation st
Karl
2014/10/06 21:15:54
Reorganized to no longer allocate extended types.
| |
72 | 141 |
73 Ice::Translator &getTranslator() { return Translator; } | 142 Ice::Translator &getTranslator() { return Translator; } |
74 | 143 |
75 // Generates error with given Message. Always returns true. | 144 // Generates error with given Message. Always returns true. |
76 bool Error(const std::string &Message) override { | 145 bool Error(const std::string &Message) override { |
77 ErrorStatus = true; | 146 ErrorStatus = true; |
78 ++NumErrors; | 147 ++NumErrors; |
79 NaClBitcodeParser::Error(Message); | 148 NaClBitcodeParser::Error(Message); |
80 if (!AllowErrorRecovery) | 149 if (!AllowErrorRecovery) |
81 report_fatal_error("Unable to continue"); | 150 report_fatal_error("Unable to continue"); |
(...skipping 12 matching lines...) Expand all Loading... | |
94 /// Returns the number of bytes in the bitcode header. | 163 /// Returns the number of bytes in the bitcode header. |
95 size_t getHeaderSize() const { return Header.getHeaderSize(); } | 164 size_t getHeaderSize() const { return Header.getHeaderSize(); } |
96 | 165 |
97 /// Returns the llvm context to use. | 166 /// Returns the llvm context to use. |
98 LLVMContext &getLLVMContext() const { return Mod->getContext(); } | 167 LLVMContext &getLLVMContext() const { return Mod->getContext(); } |
99 | 168 |
100 /// Changes the size of the type list to the given size. | 169 /// Changes the size of the type list to the given size. |
101 void resizeTypeIDValues(unsigned NewSize) { TypeIDValues.resize(NewSize); } | 170 void resizeTypeIDValues(unsigned NewSize) { TypeIDValues.resize(NewSize); } |
102 | 171 |
103 /// Returns the type associated with the given index. | 172 /// Returns the type associated with the given index. |
104 Type *getTypeByID(unsigned ID) { | 173 Ice::Type getTypeByID(unsigned ID) { |
Jim Stichnoth
2014/10/05 15:35:47
Can this be const?
I guess not because of setting
jvoung (off chromium)
2014/10/06 14:32:17
I wonder if this should be called "getSimpleTypeBy
Karl
2014/10/06 21:15:54
Done. Added constness and added qualifier to acces
| |
105 // Note: method resizeTypeIDValues expands TypeIDValues | 174 // Note: method resizeTypeIDValues expands TypeIDValues |
106 // to the specified size, and fills elements with NULL. | 175 // to the specified size, and fills elements with nullptr. |
107 Type *Ty = ID < TypeIDValues.size() ? TypeIDValues[ID] : NULL; | 176 ExtendedType *Ty = ID < TypeIDValues.size() ? TypeIDValues[ID] : nullptr; |
108 if (Ty) | 177 if (Ty == nullptr) { |
109 return Ty; | 178 reportTypeIDAsUndefined(ID); |
110 return reportTypeIDAsUndefined(ID); | 179 } else if (auto SimpleTy = dyn_cast<SimpleExtendedType>(Ty)) { |
180 return SimpleTy->getType(); | |
181 } else { | |
182 reportTypeIDNotSimple(ID, Ty); | |
183 } | |
184 // TODO(kschimpf) Remove error recovery once implementation complete. | |
185 return Ice::IceType_void; | |
186 } | |
187 | |
188 /// Returns the type signature associated with the given index. | |
189 const Ice::FcnSigType &getFcnSigTypeByID(unsigned ID) { | |
190 // Note: method resizeTypeIDValues expands TypeIDValues | |
191 // to the specified size, and fills elements with nullptr. | |
192 ExtendedType *Ty = ID < TypeIDValues.size() ? TypeIDValues[ID] : nullptr; | |
193 if (Ty == nullptr) { | |
194 reportFcnSigTypeIDAsUndefined(ID); | |
195 } else if (auto SigTy = dyn_cast<FcnSigExtendedType>(Ty)) { | |
196 return SigTy->getFcnSig(); | |
197 } else { | |
198 reportFcnSigTypeIDNotFcnSig(ID, Ty); | |
199 } | |
200 // TODO(kschimpf) Remove error recovery once implementation complete. | |
201 return UndefinedFcnSigType; | |
111 } | 202 } |
112 | 203 |
113 /// Defines type for ID. | 204 /// Defines type for ID. |
114 void setTypeID(unsigned ID, Type *Ty) { | 205 void setTypeID(unsigned ID, ExtendedType *Ty) { |
115 if (ID < TypeIDValues.size() && TypeIDValues[ID] == NULL) { | 206 if (ID < TypeIDValues.size() && TypeIDValues[ID] == nullptr) { |
116 TypeIDValues[ID] = Ty; | 207 TypeIDValues[ID] = Ty; |
117 return; | 208 return; |
118 } | 209 } |
119 reportBadSetTypeID(ID, Ty); | 210 reportBadSetTypeID(ID, Ty); |
120 } | 211 } |
121 | 212 |
122 /// Sets the next function ID to the given LLVM function. | 213 /// Sets the next function ID to the given LLVM function. |
123 void setNextFunctionID(Function *Fcn) { | 214 void setNextFunctionID(Function *Fcn) { |
124 ++NumFunctionIds; | 215 ++NumFunctionIds; |
125 ValueIDValues.push_back(Fcn); | 216 ValueIDValues.push_back(Fcn); |
(...skipping 11 matching lines...) Expand all Loading... | |
137 unsigned getNextFunctionBlockValueID() { | 228 unsigned getNextFunctionBlockValueID() { |
138 if (NumFunctionBlocks >= DefiningFunctionsList.size()) | 229 if (NumFunctionBlocks >= DefiningFunctionsList.size()) |
139 report_fatal_error( | 230 report_fatal_error( |
140 "More function blocks than defined function addresses"); | 231 "More function blocks than defined function addresses"); |
141 return DefiningFunctionsList[NumFunctionBlocks++]; | 232 return DefiningFunctionsList[NumFunctionBlocks++]; |
142 } | 233 } |
143 | 234 |
144 /// Returns the LLVM IR value associatd with the global value ID. | 235 /// Returns the LLVM IR value associatd with the global value ID. |
145 Value *getGlobalValueByID(unsigned ID) const { | 236 Value *getGlobalValueByID(unsigned ID) const { |
146 if (ID >= ValueIDValues.size()) | 237 if (ID >= ValueIDValues.size()) |
147 return NULL; | 238 return nullptr; |
148 return ValueIDValues[ID]; | 239 return ValueIDValues[ID]; |
149 } | 240 } |
150 | 241 |
151 /// Returns the corresponding constant associated with a global value | 242 /// Returns the corresponding constant associated with a global value |
152 /// (i.e. relocatable). | 243 /// (i.e. relocatable). |
153 Ice::Constant *getOrCreateGlobalConstantByID(unsigned ID) { | 244 Ice::Constant *getOrCreateGlobalConstantByID(unsigned ID) { |
154 // TODO(kschimpf): Can this be built when creating global initializers? | 245 // TODO(kschimpf): Can this be built when creating global initializers? |
155 if (ID >= ValueIDConstants.size()) { | 246 if (ID >= ValueIDConstants.size()) { |
156 if (ID >= ValueIDValues.size()) | 247 if (ID >= ValueIDValues.size()) |
157 return NULL; | 248 return nullptr; |
158 ValueIDConstants.resize(ValueIDValues.size()); | 249 ValueIDConstants.resize(ValueIDValues.size()); |
159 } | 250 } |
160 Ice::Constant *C = ValueIDConstants[ID]; | 251 Ice::Constant *C = ValueIDConstants[ID]; |
161 if (C != NULL) | 252 if (C != nullptr) |
162 return C; | 253 return C; |
163 Value *V = ValueIDValues[ID]; | 254 Value *V = ValueIDValues[ID]; |
164 assert(isa<GlobalValue>(V)); | 255 assert(isa<GlobalValue>(V)); |
165 C = getTranslator().getContext()->getConstantSym(getIcePointerType(), 0, | 256 C = getTranslator().getContext()->getConstantSym(getIcePointerType(), 0, |
166 V->getName()); | 257 V->getName()); |
167 ValueIDConstants[ID] = C; | 258 ValueIDConstants[ID] = C; |
168 return C; | 259 return C; |
169 } | 260 } |
170 | 261 |
171 /// Returns the number of function addresses (i.e. ID's) defined in | 262 /// Returns the number of function addresses (i.e. ID's) defined in |
172 /// the bitcode file. | 263 /// the bitcode file. |
173 unsigned getNumFunctionIDs() const { return NumFunctionIds; } | 264 unsigned getNumFunctionIDs() const { return NumFunctionIds; } |
174 | 265 |
175 /// Returns the number of global values defined in the bitcode | 266 /// Returns the number of global values defined in the bitcode |
176 /// file. | 267 /// file. |
177 unsigned getNumGlobalValueIDs() const { return ValueIDValues.size(); } | 268 unsigned getNumGlobalValueIDs() const { return ValueIDValues.size(); } |
178 | 269 |
179 /// Resizes the list of value IDs to include Count global variable | 270 /// Resizes the list of value IDs to include Count global variable |
180 /// IDs. | 271 /// IDs. |
181 void resizeValueIDsForGlobalVarCount(unsigned Count) { | 272 void resizeValueIDsForGlobalVarCount(unsigned Count) { |
182 ValueIDValues.resize(ValueIDValues.size() + Count); | 273 ValueIDValues.resize(ValueIDValues.size() + Count); |
183 } | 274 } |
184 | 275 |
185 /// Returns the global variable address associated with the given | 276 /// Returns the global variable address associated with the given |
186 /// value ID. If the ID refers to a global variable address not yet | 277 /// value ID. If the ID refers to a global variable address not yet |
187 /// defined, a placeholder is created so that we can fix it up | 278 /// defined, a placeholder is created so that we can fix it up |
188 /// later. | 279 /// later. |
189 Constant *getOrCreateGlobalVarRef(unsigned ID) { | 280 Constant *getOrCreateGlobalVarRef(unsigned ID) { |
190 if (ID >= ValueIDValues.size()) | 281 if (ID >= ValueIDValues.size()) |
191 return NULL; | 282 return nullptr; |
192 if (Value *C = ValueIDValues[ID]) | 283 if (Value *C = ValueIDValues[ID]) |
193 return dyn_cast<Constant>(C); | 284 return dyn_cast<Constant>(C); |
194 Constant *C = new GlobalVariable(*Mod, GlobalVarPlaceHolderType, false, | 285 Constant *C = new GlobalVariable(*Mod, GlobalVarPlaceHolderType, false, |
195 GlobalValue::ExternalLinkage, 0); | 286 GlobalValue::ExternalLinkage, 0); |
196 ValueIDValues[ID] = C; | 287 ValueIDValues[ID] = C; |
197 return C; | 288 return C; |
198 } | 289 } |
199 | 290 |
200 /// Assigns the given global variable (address) to the given value | 291 /// Assigns the given global variable (address) to the given value |
201 /// ID. Returns true if ID is a valid global variable ID. Otherwise | 292 /// ID. Returns true if ID is a valid global variable ID. Otherwise |
202 /// returns false. | 293 /// returns false. |
203 bool assignGlobalVariable(GlobalVariable *GV, unsigned ID) { | 294 bool assignGlobalVariable(GlobalVariable *GV, unsigned ID) { |
204 if (ID < NumFunctionIds || ID >= ValueIDValues.size()) | 295 if (ID < NumFunctionIds || ID >= ValueIDValues.size()) |
205 return false; | 296 return false; |
206 WeakVH &OldV = ValueIDValues[ID]; | 297 WeakVH &OldV = ValueIDValues[ID]; |
207 if (OldV == NULL) { | 298 if (OldV == nullptr) { |
208 ValueIDValues[ID] = GV; | 299 ValueIDValues[ID] = GV; |
209 return true; | 300 return true; |
210 } | 301 } |
211 | 302 |
212 // If reached, there was a forward reference to this value. Replace it. | 303 // If reached, there was a forward reference to this value. Replace it. |
213 Value *PrevVal = OldV; | 304 Value *PrevVal = OldV; |
214 GlobalVariable *Placeholder = cast<GlobalVariable>(PrevVal); | 305 GlobalVariable *Placeholder = cast<GlobalVariable>(PrevVal); |
215 Placeholder->replaceAllUsesWith( | 306 Placeholder->replaceAllUsesWith( |
216 ConstantExpr::getBitCast(GV, Placeholder->getType())); | 307 ConstantExpr::getBitCast(GV, Placeholder->getType())); |
217 Placeholder->eraseFromParent(); | 308 Placeholder->eraseFromParent(); |
218 ValueIDValues[ID] = GV; | 309 ValueIDValues[ID] = GV; |
219 return true; | 310 return true; |
220 } | 311 } |
221 | 312 |
222 /// Returns the corresponding ICE type for LLVMTy. | 313 /// Returns the corresponding ICE type for LLVMTy. |
223 Ice::Type convertToIceType(Type *LLVMTy) { | 314 Ice::Type convertToIceType(Type *LLVMTy) { |
224 Ice::Type IceTy = TypeConverter.convertToIceType(LLVMTy); | 315 Ice::Type IceTy = TypeConverter.convertToIceType(LLVMTy); |
225 if (IceTy >= Ice::IceType_NUM) { | 316 if (IceTy >= Ice::IceType_NUM) { |
226 return convertToIceTypeError(LLVMTy); | 317 return convertToIceTypeError(LLVMTy); |
227 } | 318 } |
228 return IceTy; | 319 return IceTy; |
229 } | 320 } |
230 | 321 |
231 /// Returns the corresponding LLVM type for IceTy. | 322 /// Returns the corresponding LLVM type for IceTy. |
232 Type *convertToLLVMType(Ice::Type IceTy) const { | 323 Type *convertToLLVMType(Ice::Type IceTy) const { |
233 return TypeConverter.convertToLLVMType(IceTy); | 324 return TypeConverter.convertToLLVMType(IceTy); |
234 } | 325 } |
235 | 326 |
236 /// Returns the LLVM integer type with the given number of Bits. If | 327 /// Returns the LLVM integer type with the given number of Bits. If |
237 /// Bits is not a valid PNaCl type, returns NULL. | 328 /// Bits is not a valid PNaCl type, returns nullptr. |
238 Type *getLLVMIntegerType(unsigned Bits) const { | 329 Type *getLLVMIntegerType(unsigned Bits) const { |
jvoung (off chromium)
2014/10/06 14:32:17
can this be removed now?
Karl
2014/10/06 21:15:54
Removed getLLVMIntegerType and getLLVMVectorType.
jvoung (off chromium)
2014/10/07 15:54:41
Can it be removed from TypeConverter now too?
| |
239 return TypeConverter.getLLVMIntegerType(Bits); | 330 return TypeConverter.getLLVMIntegerType(Bits); |
240 } | 331 } |
241 | 332 |
242 /// Returns the LLVM vector with the given Size and Ty. If not a | 333 /// Returns the LLVM vector with the given Size and Ty. If not a |
243 /// valid PNaCl vector type, returns NULL. | 334 /// valid PNaCl vector type, returns nullptr. |
244 Type *getLLVMVectorType(unsigned Size, Ice::Type Ty) const { | 335 Type *getLLVMVectorType(unsigned Size, Ice::Type Ty) const { |
245 return TypeConverter.getLLVMVectorType(Size, Ty); | 336 return TypeConverter.getLLVMVectorType(Size, Ty); |
246 } | 337 } |
247 | 338 |
248 /// Returns the model for pointer types in ICE. | 339 /// Returns the model for pointer types in ICE. |
249 Ice::Type getIcePointerType() const { | 340 Ice::Type getIcePointerType() const { |
250 return TypeConverter.getIcePointerType(); | 341 return TypeConverter.getIcePointerType(); |
251 } | 342 } |
252 | 343 |
253 private: | 344 private: |
254 // The translator associated with the parser. | 345 // The translator associated with the parser. |
255 Ice::Translator &Translator; | 346 Ice::Translator &Translator; |
256 // The parsed module. | 347 // The parsed module. |
257 std::unique_ptr<Module> Mod; | 348 std::unique_ptr<Module> Mod; |
258 // The data layout to use. | 349 // The data layout to use. |
259 DataLayout DL; | 350 DataLayout DL; |
260 // The bitcode header. | 351 // The bitcode header. |
261 NaClBitcodeHeader &Header; | 352 NaClBitcodeHeader &Header; |
262 // Converter between LLVM and ICE types. | 353 // Converter between LLVM and ICE types. |
263 Ice::TypeConverter TypeConverter; | 354 Ice::TypeConverter TypeConverter; |
264 // The exit status that should be set to true if an error occurs. | 355 // The exit status that should be set to true if an error occurs. |
265 bool &ErrorStatus; | 356 bool &ErrorStatus; |
266 // The number of errors reported. | 357 // The number of errors reported. |
267 unsigned NumErrors; | 358 unsigned NumErrors; |
268 // The types associated with each type ID. | 359 // The types associated with each type ID. |
269 std::vector<Type *> TypeIDValues; | 360 std::vector<ExtendedType *> TypeIDValues; |
270 // The (global) value IDs. | 361 // The (global) value IDs. |
271 std::vector<WeakVH> ValueIDValues; | 362 std::vector<WeakVH> ValueIDValues; |
272 // Relocatable constants associated with ValueIDValues. | 363 // Relocatable constants associated with ValueIDValues. |
273 std::vector<Ice::Constant *> ValueIDConstants; | 364 std::vector<Ice::Constant *> ValueIDConstants; |
274 // The number of function IDs. | 365 // The number of function IDs. |
275 unsigned NumFunctionIds; | 366 unsigned NumFunctionIds; |
276 // The number of function blocks (processed so far). | 367 // The number of function blocks (processed so far). |
277 unsigned NumFunctionBlocks; | 368 unsigned NumFunctionBlocks; |
278 // The list of value IDs (in the order found) of defining function | 369 // The list of value IDs (in the order found) of defining function |
279 // addresses. | 370 // addresses. |
280 std::vector<unsigned> DefiningFunctionsList; | 371 std::vector<unsigned> DefiningFunctionsList; |
281 // Cached global variable placeholder type. Used for all forward | 372 // Cached global variable placeholder type. Used for all forward |
282 // references to global variable addresses. | 373 // references to global variable addresses. |
283 Type *GlobalVarPlaceHolderType; | 374 Type *GlobalVarPlaceHolderType; |
375 // Models an undefined function type signature. | |
376 Ice::FcnSigType UndefinedFcnSigType; | |
284 | 377 |
285 bool ParseBlock(unsigned BlockID) override; | 378 bool ParseBlock(unsigned BlockID) override; |
286 | 379 |
287 /// Reports that type ID is undefined, and then returns | 380 /// Reports that type ID is undefined. |
jvoung (off chromium)
2014/10/06 14:32:17
double vs triple slash consistency
Clarify this i
Karl
2014/10/06 21:15:54
Simplified all type id look ups to go through one
| |
288 /// the void type. | 381 void reportTypeIDAsUndefined(unsigned ID); |
289 Type *reportTypeIDAsUndefined(unsigned ID); | 382 |
383 // Reports that type ID as not a simple type. | |
384 void reportTypeIDNotSimple(unsigned ID, const ExtendedType *Ty); | |
385 | |
386 // Reports that type ID is undefined. | |
jvoung (off chromium)
2014/10/06 14:32:17
Clarify this is for function signature types?
Karl
2014/10/06 21:15:54
Removed. No longer needed.
| |
387 void reportFcnSigTypeIDAsUndefined(unsigned ID); | |
388 | |
389 // Reports that type ID is not a function signature. | |
390 void reportFcnSigTypeIDNotFcnSig(unsigned ID, const ExtendedType *Ty); | |
290 | 391 |
291 /// Reports error about bad call to setTypeID. | 392 /// Reports error about bad call to setTypeID. |
292 void reportBadSetTypeID(unsigned ID, Type *Ty); | 393 void reportBadSetTypeID(unsigned ID, ExtendedType *Ty); |
Jim Stichnoth
2014/10/05 15:35:48
const ExtendedType * ?
Karl
2014/10/06 21:15:54
Added to reportBadTypeIDAs.
| |
293 | 394 |
294 // Reports that there is no corresponding ICE type for LLVMTy, and | 395 // Reports that there is no corresponding ICE type for LLVMTy, and |
295 // returns ICE::IceType_void. | 396 // returns ICE::IceType_void. |
296 Ice::Type convertToIceTypeError(Type *LLVMTy); | 397 Ice::Type convertToIceTypeError(Type *LLVMTy); |
297 }; | 398 }; |
298 | 399 |
299 Type *TopLevelParser::reportTypeIDAsUndefined(unsigned ID) { | 400 void TopLevelParser::reportTypeIDAsUndefined(unsigned ID) { |
300 std::string Buffer; | 401 std::string Buffer; |
301 raw_string_ostream StrBuf(Buffer); | 402 raw_string_ostream StrBuf(Buffer); |
302 StrBuf << "Can't find type for type id: " << ID; | 403 StrBuf << "Can't find type for type id: " << ID; |
303 Error(StrBuf.str()); | 404 Error(StrBuf.str()); |
304 // TODO(kschimpf) Remove error recovery once implementation complete. | |
305 Type *Ty = TypeConverter.convertToLLVMType(Ice::IceType_void); | |
306 // To reduce error messages, update type list if possible. | |
307 if (ID < TypeIDValues.size()) | |
308 TypeIDValues[ID] = Ty; | |
309 return Ty; | |
310 } | 405 } |
311 | 406 |
312 void TopLevelParser::reportBadSetTypeID(unsigned ID, Type *Ty) { | 407 void TopLevelParser::reportTypeIDNotSimple(unsigned ID, |
408 const ExtendedType *Ty) { | |
409 std::string Buffer; | |
410 raw_string_ostream StrBuf(Buffer); | |
411 StrBuf << "Type id " << ID << " not simple type. Found: " << *Ty; | |
412 Error(StrBuf.str()); | |
413 }; | |
414 | |
415 void TopLevelParser::reportFcnSigTypeIDAsUndefined(unsigned ID) { | |
416 std::string Buffer; | |
417 raw_string_ostream StrBuf(Buffer); | |
418 StrBuf << "Can't find function signature type for type id: " << ID; | |
419 Error(StrBuf.str()); | |
420 } | |
421 | |
422 void TopLevelParser::reportFcnSigTypeIDNotFcnSig(unsigned ID, | |
423 const ExtendedType *Ty) { | |
424 std::string Buffer; | |
425 raw_string_ostream StrBuf(Buffer); | |
426 StrBuf << "Type id " << ID << " not function signature type. Found:" << *Ty; | |
427 Error(StrBuf.str()); | |
428 } | |
429 | |
430 void TopLevelParser::reportBadSetTypeID(unsigned ID, ExtendedType *Ty) { | |
313 std::string Buffer; | 431 std::string Buffer; |
314 raw_string_ostream StrBuf(Buffer); | 432 raw_string_ostream StrBuf(Buffer); |
315 if (ID >= TypeIDValues.size()) { | 433 if (ID >= TypeIDValues.size()) { |
316 StrBuf << "Type index " << ID << " out of range: can't install."; | 434 StrBuf << "Type index " << ID |
435 << " out of range. Can't install type: " << Ty; | |
317 } else { | 436 } else { |
318 // Must be case that index already defined. | 437 // Must be case that index already defined. |
319 StrBuf << "Type index " << ID << " defined as " << *TypeIDValues[ID] | 438 StrBuf << "Type index " << ID << " defined as " << *TypeIDValues[ID] |
320 << " and " << *Ty << "."; | 439 << " and " << *Ty << "."; |
321 } | 440 } |
322 Error(StrBuf.str()); | 441 Error(StrBuf.str()); |
323 } | 442 } |
324 | 443 |
325 Ice::Type TopLevelParser::convertToIceTypeError(Type *LLVMTy) { | 444 Ice::Type TopLevelParser::convertToIceTypeError(Type *LLVMTy) { |
326 std::string Buffer; | 445 std::string Buffer; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
373 // Default implementation. Reports that the record is not | 492 // Default implementation. Reports that the record is not |
374 // understood. | 493 // understood. |
375 void ProcessRecord() override; | 494 void ProcessRecord() override; |
376 | 495 |
377 // Checks if the size of the record is Size. Return true if valid. | 496 // Checks if the size of the record is Size. Return true if valid. |
378 // Otherwise generates an error and returns false. | 497 // Otherwise generates an error and returns false. |
379 bool isValidRecordSize(unsigned Size, const char *RecordName) { | 498 bool isValidRecordSize(unsigned Size, const char *RecordName) { |
380 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); | 499 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); |
381 if (Values.size() == Size) | 500 if (Values.size() == Size) |
382 return true; | 501 return true; |
383 ReportRecordSizeError(Size, RecordName, NULL); | 502 ReportRecordSizeError(Size, RecordName, nullptr); |
384 return false; | 503 return false; |
385 } | 504 } |
386 | 505 |
387 // Checks if the size of the record is at least as large as the | 506 // Checks if the size of the record is at least as large as the |
388 // LowerLimit. Returns true if valid. Otherwise generates an error | 507 // LowerLimit. Returns true if valid. Otherwise generates an error |
389 // and returns false. | 508 // and returns false. |
390 bool isValidRecordSizeAtLeast(unsigned LowerLimit, const char *RecordName) { | 509 bool isValidRecordSizeAtLeast(unsigned LowerLimit, const char *RecordName) { |
391 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); | 510 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); |
392 if (Values.size() >= LowerLimit) | 511 if (Values.size() >= LowerLimit) |
393 return true; | 512 return true; |
(...skipping 17 matching lines...) Expand all Loading... | |
411 // valid. Otherwise generates an error and returns false. | 530 // valid. Otherwise generates an error and returns false. |
412 bool isValidRecordSizeInRange(unsigned LowerLimit, unsigned UpperLimit, | 531 bool isValidRecordSizeInRange(unsigned LowerLimit, unsigned UpperLimit, |
413 const char *RecordName) { | 532 const char *RecordName) { |
414 return isValidRecordSizeAtLeast(LowerLimit, RecordName) || | 533 return isValidRecordSizeAtLeast(LowerLimit, RecordName) || |
415 isValidRecordSizeAtMost(UpperLimit, RecordName); | 534 isValidRecordSizeAtMost(UpperLimit, RecordName); |
416 } | 535 } |
417 | 536 |
418 private: | 537 private: |
419 /// Generates a record size error. ExpectedSize is the number | 538 /// Generates a record size error. ExpectedSize is the number |
420 /// of elements expected. RecordName is the name of the kind of | 539 /// of elements expected. RecordName is the name of the kind of |
421 /// record that has incorrect size. ContextMessage (if not NULL) | 540 /// record that has incorrect size. ContextMessage (if not nullptr) |
422 /// is appended to "record expects" to describe how ExpectedSize | 541 /// is appended to "record expects" to describe how ExpectedSize |
423 /// should be interpreted. | 542 /// should be interpreted. |
424 void ReportRecordSizeError(unsigned ExpectedSize, const char *RecordName, | 543 void ReportRecordSizeError(unsigned ExpectedSize, const char *RecordName, |
425 const char *ContextMessage); | 544 const char *ContextMessage); |
426 }; | 545 }; |
427 | 546 |
428 void BlockParserBaseClass::ReportRecordSizeError(unsigned ExpectedSize, | 547 void BlockParserBaseClass::ReportRecordSizeError(unsigned ExpectedSize, |
429 const char *RecordName, | 548 const char *RecordName, |
430 const char *ContextMessage) { | 549 const char *ContextMessage) { |
431 std::string Buffer; | 550 std::string Buffer; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
470 | 589 |
471 private: | 590 private: |
472 // The type ID that will be associated with the next type defining | 591 // The type ID that will be associated with the next type defining |
473 // record in the types block. | 592 // record in the types block. |
474 unsigned NextTypeId; | 593 unsigned NextTypeId; |
475 | 594 |
476 void ProcessRecord() override; | 595 void ProcessRecord() override; |
477 }; | 596 }; |
478 | 597 |
479 void TypesParser::ProcessRecord() { | 598 void TypesParser::ProcessRecord() { |
480 Type *Ty = NULL; | 599 ExtendedType *Ty = nullptr; |
481 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); | 600 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); |
482 switch (Record.GetCode()) { | 601 switch (Record.GetCode()) { |
483 case naclbitc::TYPE_CODE_NUMENTRY: | 602 case naclbitc::TYPE_CODE_NUMENTRY: |
484 // NUMENTRY: [numentries] | 603 // NUMENTRY: [numentries] |
485 if (!isValidRecordSize(1, "Type count")) | 604 if (!isValidRecordSize(1, "Type count")) |
486 return; | 605 return; |
487 Context->resizeTypeIDValues(Values[0]); | 606 Context->resizeTypeIDValues(Values[0]); |
488 return; | 607 return; |
489 case naclbitc::TYPE_CODE_VOID: | 608 case naclbitc::TYPE_CODE_VOID: |
490 // VOID | 609 // VOID |
491 if (!isValidRecordSize(0, "Type void")) | 610 if (!isValidRecordSize(0, "Type void")) |
492 return; | 611 return; |
493 Ty = Context->convertToLLVMType(Ice::IceType_void); | 612 Ty = new SimpleExtendedType(Ice::IceType_void); |
494 break; | 613 break; |
495 case naclbitc::TYPE_CODE_FLOAT: | 614 case naclbitc::TYPE_CODE_FLOAT: |
496 // FLOAT | 615 // FLOAT |
497 if (!isValidRecordSize(0, "Type float")) | 616 if (!isValidRecordSize(0, "Type float")) |
498 return; | 617 return; |
499 Ty = Context->convertToLLVMType(Ice::IceType_f32); | 618 Ty = new SimpleExtendedType(Ice::IceType_f32); |
500 break; | 619 break; |
501 case naclbitc::TYPE_CODE_DOUBLE: | 620 case naclbitc::TYPE_CODE_DOUBLE: |
502 // DOUBLE | 621 // DOUBLE |
503 if (!isValidRecordSize(0, "Type double")) | 622 if (!isValidRecordSize(0, "Type double")) |
504 return; | 623 return; |
505 Ty = Context->convertToLLVMType(Ice::IceType_f64); | 624 Ty = new SimpleExtendedType(Ice::IceType_f64); |
506 break; | 625 break; |
507 case naclbitc::TYPE_CODE_INTEGER: | 626 case naclbitc::TYPE_CODE_INTEGER: |
508 // INTEGER: [width] | 627 // INTEGER: [width] |
509 if (!isValidRecordSize(1, "Type integer")) | 628 if (!isValidRecordSize(1, "Type integer")) |
510 return; | 629 return; |
511 Ty = Context->getLLVMIntegerType(Values[0]); | 630 switch (Values[0]) { |
512 if (Ty == NULL) { | 631 case 1: |
632 Ty = new SimpleExtendedType(Ice::IceType_i1); | |
633 break; | |
634 case 8: | |
635 Ty = new SimpleExtendedType(Ice::IceType_i8); | |
636 break; | |
637 case 16: | |
638 Ty = new SimpleExtendedType(Ice::IceType_i16); | |
639 break; | |
640 case 32: | |
641 Ty = new SimpleExtendedType(Ice::IceType_i32); | |
642 break; | |
643 case 64: | |
644 Ty = new SimpleExtendedType(Ice::IceType_i64); | |
645 break; | |
646 default: | |
647 break; | |
648 } | |
649 if (Ty == nullptr) { | |
513 std::string Buffer; | 650 std::string Buffer; |
514 raw_string_ostream StrBuf(Buffer); | 651 raw_string_ostream StrBuf(Buffer); |
515 StrBuf << "Type integer record with invalid bitsize: " << Values[0]; | 652 StrBuf << "Type integer record with invalid bitsize: " << Values[0]; |
516 Error(StrBuf.str()); | 653 Error(StrBuf.str()); |
517 // TODO(kschimpf) Remove error recovery once implementation complete. | |
518 // Fix type so that we can continue. | |
519 Ty = Context->convertToLLVMType(Ice::IceType_i32); | |
520 } | 654 } |
521 break; | 655 break; |
522 case naclbitc::TYPE_CODE_VECTOR: { | 656 case naclbitc::TYPE_CODE_VECTOR: { |
523 // VECTOR: [numelts, eltty] | 657 // VECTOR: [numelts, eltty] |
524 if (!isValidRecordSize(2, "Type vector")) | 658 if (!isValidRecordSize(2, "Type vector")) |
525 return; | 659 return; |
526 Type *BaseTy = Context->getTypeByID(Values[1]); | 660 Ice::Type BaseTy = Context->getTypeByID(Values[1]); |
527 Ty = Context->getLLVMVectorType(Values[0], | 661 Ice::SizeT Size = Values[0]; |
jvoung (off chromium)
2014/10/06 14:32:17
can getLLVMVectorType be removed now?
Karl
2014/10/06 21:15:54
Done.
| |
528 Context->convertToIceType(BaseTy)); | 662 switch (BaseTy) { |
529 if (Ty == NULL) { | 663 case Ice::IceType_i1: |
664 switch (Size) { | |
665 case 4: | |
666 Ty = new SimpleExtendedType(Ice::IceType_v4i1); | |
667 break; | |
668 case 8: | |
669 Ty = new SimpleExtendedType(Ice::IceType_v8i1); | |
670 break; | |
671 case 16: | |
672 Ty = new SimpleExtendedType(Ice::IceType_v16i1); | |
673 break; | |
674 default: | |
675 break; | |
676 } | |
677 break; | |
678 case Ice::IceType_i8: | |
679 if (Size == 16) | |
680 Ty = new SimpleExtendedType(Ice::IceType_v16i8); | |
681 break; | |
682 case Ice::IceType_i16: | |
683 if (Size == 8) | |
684 Ty = new SimpleExtendedType(Ice::IceType_v8i16); | |
685 break; | |
686 case Ice::IceType_i32: | |
687 if (Size == 4) | |
688 Ty = new SimpleExtendedType(Ice::IceType_v4i32); | |
689 break; | |
690 case Ice::IceType_f32: | |
691 if (Size == 4) | |
692 Ty = new SimpleExtendedType(Ice::IceType_v4f32); | |
693 break; | |
694 default: | |
695 break; | |
696 } | |
697 | |
698 if (Ty == nullptr) { | |
530 std::string Buffer; | 699 std::string Buffer; |
531 raw_string_ostream StrBuf(Buffer); | 700 raw_string_ostream StrBuf(Buffer); |
532 StrBuf << "Invalid type vector record: <" << Values[0] << " x " << *BaseTy | 701 StrBuf << "Invalid type vector record: <" << Values[0] << " x " << BaseTy |
533 << ">"; | 702 << ">"; |
534 Error(StrBuf.str()); | 703 Error(StrBuf.str()); |
535 Ty = Context->convertToLLVMType(Ice::IceType_void); | |
536 } | 704 } |
537 break; | 705 break; |
538 } | 706 } |
539 case naclbitc::TYPE_CODE_FUNCTION: { | 707 case naclbitc::TYPE_CODE_FUNCTION: { |
540 // FUNCTION: [vararg, retty, paramty x N] | 708 // FUNCTION: [vararg, retty, paramty x N] |
541 if (!isValidRecordSizeAtLeast(2, "Type signature")) | 709 if (!isValidRecordSizeAtLeast(2, "Type signature")) |
542 return; | 710 return; |
543 SmallVector<Type *, 8> ArgTys; | 711 if (Values[0]) |
712 Error("Function type can't define varargs"); | |
713 FcnSigExtendedType *FcnTy = | |
714 new FcnSigExtendedType(Context->getTypeByID(Values[1])); | |
544 for (unsigned i = 2, e = Values.size(); i != e; ++i) { | 715 for (unsigned i = 2, e = Values.size(); i != e; ++i) { |
545 ArgTys.push_back(Context->getTypeByID(Values[i])); | 716 // Check that type void not used as argument type. |
717 // Note: PNaCl restrictions can't be checked until we | |
718 // know the name, because we have to check for intrinsic signatures. | |
719 Ice::Type ArgTy = Context->getTypeByID(Values[i]); | |
720 if (ArgTy == Ice::IceType_void) { | |
721 std::string Buffer; | |
722 raw_string_ostream StrBuf(Buffer); | |
723 StrBuf << "Type for parameter " << (i - 1) | |
724 << " not valid. Found: " << ArgTy; | |
725 // TODO(kschimpf) Remove error recovery once implementation complete. | |
726 ArgTy = Ice::IceType_i32; | |
727 } | |
728 FcnTy->appendArgType(ArgTy); | |
546 } | 729 } |
547 Ty = FunctionType::get(Context->getTypeByID(Values[1]), ArgTys, Values[0]); | 730 Ty = FcnTy; |
548 break; | 731 break; |
549 } | 732 } |
550 default: | 733 default: |
551 BlockParserBaseClass::ProcessRecord(); | 734 BlockParserBaseClass::ProcessRecord(); |
552 return; | 735 return; |
553 } | 736 } |
554 // If Ty not defined, assume error. Use void as filler. | 737 // If Ty not defined, assume error. Use void as filler. |
555 if (Ty == NULL) | 738 // TODO(kschimpf) Remove error recovery once implementation complete. |
556 Ty = Context->convertToLLVMType(Ice::IceType_void); | 739 // Fix type so that we can continue. |
740 if (Ty == nullptr) | |
741 Ty = new SimpleExtendedType(Ice::IceType_void); | |
557 Context->setTypeID(NextTypeId++, Ty); | 742 Context->setTypeID(NextTypeId++, Ty); |
558 } | 743 } |
559 | 744 |
560 /// Parses the globals block (i.e. global variables). | 745 /// Parses the globals block (i.e. global variables). |
561 class GlobalsParser : public BlockParserBaseClass { | 746 class GlobalsParser : public BlockParserBaseClass { |
562 public: | 747 public: |
563 GlobalsParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser) | 748 GlobalsParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser) |
564 : BlockParserBaseClass(BlockID, EnclosingParser), InitializersNeeded(0), | 749 : BlockParserBaseClass(BlockID, EnclosingParser), InitializersNeeded(0), |
565 Alignment(1), IsConstant(false) { | 750 Alignment(1), IsConstant(false) { |
566 NextGlobalID = Context->getNumFunctionIDs(); | 751 NextGlobalID = Context->getNumFunctionIDs(); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
629 if (InitializersNeeded <= Initializers.size()) { | 814 if (InitializersNeeded <= Initializers.size()) { |
630 Error(std::string(RecordName) + | 815 Error(std::string(RecordName) + |
631 " record: Too many initializers, ignoring."); | 816 " record: Too many initializers, ignoring."); |
632 } | 817 } |
633 } | 818 } |
634 | 819 |
635 // Takes the initializers (and other parser state values) and | 820 // Takes the initializers (and other parser state values) and |
636 // installs a global variable (with the initializers) into the list | 821 // installs a global variable (with the initializers) into the list |
637 // of ValueIDs. | 822 // of ValueIDs. |
638 void installGlobalVar() { | 823 void installGlobalVar() { |
639 Constant *Init = NULL; | 824 Constant *Init = nullptr; |
640 switch (Initializers.size()) { | 825 switch (Initializers.size()) { |
641 case 0: | 826 case 0: |
642 Error("No initializer for global variable in global vars block"); | 827 Error("No initializer for global variable in global vars block"); |
643 return; | 828 return; |
644 case 1: | 829 case 1: |
645 Init = Initializers[0]; | 830 Init = Initializers[0]; |
646 break; | 831 break; |
647 default: | 832 default: |
648 Init = ConstantStruct::getAnon(Context->getLLVMContext(), Initializers, | 833 Init = ConstantStruct::getAnon(Context->getLLVMContext(), Initializers, |
649 true); | 834 true); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
733 Constant *Init = ConstantDataArray::get( | 918 Constant *Init = ConstantDataArray::get( |
734 Context->getLLVMContext(), ArrayRef<uint8_t>(Buf.data(), Buf.size())); | 919 Context->getLLVMContext(), ArrayRef<uint8_t>(Buf.data(), Buf.size())); |
735 Initializers.push_back(Init); | 920 Initializers.push_back(Init); |
736 break; | 921 break; |
737 } | 922 } |
738 case naclbitc::GLOBALVAR_RELOC: { | 923 case naclbitc::GLOBALVAR_RELOC: { |
739 // RELOC: [val, [addend]] | 924 // RELOC: [val, [addend]] |
740 if (!isValidRecordSizeInRange(1, 2, "Globals reloc")) | 925 if (!isValidRecordSizeInRange(1, 2, "Globals reloc")) |
741 return; | 926 return; |
742 Constant *BaseVal = Context->getOrCreateGlobalVarRef(Values[0]); | 927 Constant *BaseVal = Context->getOrCreateGlobalVarRef(Values[0]); |
743 if (BaseVal == NULL) { | 928 if (BaseVal == nullptr) { |
744 std::string Buffer; | 929 std::string Buffer; |
745 raw_string_ostream StrBuf(Buffer); | 930 raw_string_ostream StrBuf(Buffer); |
746 StrBuf << "Can't find global relocation value: " << Values[0]; | 931 StrBuf << "Can't find global relocation value: " << Values[0]; |
747 Error(StrBuf.str()); | 932 Error(StrBuf.str()); |
748 return; | 933 return; |
749 } | 934 } |
750 Type *IntPtrType = Context->convertToLLVMType(Context->getIcePointerType()); | 935 Type *IntPtrType = Context->convertToLLVMType(Context->getIcePointerType()); |
751 Constant *Val = ConstantExpr::getPtrToInt(BaseVal, IntPtrType); | 936 Constant *Val = ConstantExpr::getPtrToInt(BaseVal, IntPtrType); |
752 if (Values.size() == 2) { | 937 if (Values.size() == 2) { |
753 Val = ConstantExpr::getAdd(Val, ConstantInt::get(IntPtrType, Values[1])); | 938 Val = ConstantExpr::getAdd(Val, ConstantInt::get(IntPtrType, Values[1])); |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
949 return Func->makeVariable(Ty); | 1134 return Func->makeVariable(Ty); |
950 } | 1135 } |
951 | 1136 |
952 // Generates the next available local variable using the given type. | 1137 // Generates the next available local variable using the given type. |
953 Ice::Variable *getNextInstVar(Ice::Type Ty) { | 1138 Ice::Variable *getNextInstVar(Ice::Type Ty) { |
954 assert(NextLocalInstIndex >= CachedNumGlobalValueIDs); | 1139 assert(NextLocalInstIndex >= CachedNumGlobalValueIDs); |
955 // Before creating one, see if a forwardtyperef has already defined it. | 1140 // Before creating one, see if a forwardtyperef has already defined it. |
956 uint32_t LocalIndex = NextLocalInstIndex - CachedNumGlobalValueIDs; | 1141 uint32_t LocalIndex = NextLocalInstIndex - CachedNumGlobalValueIDs; |
957 if (LocalIndex < LocalOperands.size()) { | 1142 if (LocalIndex < LocalOperands.size()) { |
958 Ice::Operand *Op = LocalOperands[LocalIndex]; | 1143 Ice::Operand *Op = LocalOperands[LocalIndex]; |
959 if (Op != NULL) { | 1144 if (Op != nullptr) { |
960 if (Ice::Variable *Var = dyn_cast<Ice::Variable>(Op)) { | 1145 if (Ice::Variable *Var = dyn_cast<Ice::Variable>(Op)) { |
961 if (Var->getType() == Ty) { | 1146 if (Var->getType() == Ty) { |
962 ++NextLocalInstIndex; | 1147 ++NextLocalInstIndex; |
963 return Var; | 1148 return Var; |
964 } | 1149 } |
965 } | 1150 } |
966 std::string Buffer; | 1151 std::string Buffer; |
967 raw_string_ostream StrBuf(Buffer); | 1152 raw_string_ostream StrBuf(Buffer); |
968 StrBuf << "Illegal forward referenced instruction (" | 1153 StrBuf << "Illegal forward referenced instruction (" |
969 << NextLocalInstIndex << "): " << *Op; | 1154 << NextLocalInstIndex << "): " << *Op; |
(...skipping 30 matching lines...) Expand all Loading... | |
1000 } | 1185 } |
1001 uint32_t LocalIndex = Index - CachedNumGlobalValueIDs; | 1186 uint32_t LocalIndex = Index - CachedNumGlobalValueIDs; |
1002 if (LocalIndex >= LocalOperands.size()) { | 1187 if (LocalIndex >= LocalOperands.size()) { |
1003 std::string Buffer; | 1188 std::string Buffer; |
1004 raw_string_ostream StrBuf(Buffer); | 1189 raw_string_ostream StrBuf(Buffer); |
1005 StrBuf << "Value index " << Index << " not defined!"; | 1190 StrBuf << "Value index " << Index << " not defined!"; |
1006 Error(StrBuf.str()); | 1191 Error(StrBuf.str()); |
1007 report_fatal_error("Unable to continue"); | 1192 report_fatal_error("Unable to continue"); |
1008 } | 1193 } |
1009 Ice::Operand *Op = LocalOperands[LocalIndex]; | 1194 Ice::Operand *Op = LocalOperands[LocalIndex]; |
1010 if (Op == NULL) { | 1195 if (Op == nullptr) { |
1011 std::string Buffer; | 1196 std::string Buffer; |
1012 raw_string_ostream StrBuf(Buffer); | 1197 raw_string_ostream StrBuf(Buffer); |
1013 StrBuf << "Value index " << Index << " not defined!"; | 1198 StrBuf << "Value index " << Index << " not defined!"; |
1014 Error(StrBuf.str()); | 1199 Error(StrBuf.str()); |
1015 report_fatal_error("Unable to continue"); | 1200 report_fatal_error("Unable to continue"); |
1016 } | 1201 } |
1017 return Op; | 1202 return Op; |
1018 } | 1203 } |
1019 | 1204 |
1020 // Sets element Index (in the local operands list) to Op. | 1205 // Sets element Index (in the local operands list) to Op. |
1021 void setOperand(uint32_t Index, Ice::Operand *Op) { | 1206 void setOperand(uint32_t Index, Ice::Operand *Op) { |
1022 assert(Op); | 1207 assert(Op); |
1023 // Check if simple push works. | 1208 // Check if simple push works. |
1024 uint32_t LocalIndex = Index - CachedNumGlobalValueIDs; | 1209 uint32_t LocalIndex = Index - CachedNumGlobalValueIDs; |
1025 if (LocalIndex == LocalOperands.size()) { | 1210 if (LocalIndex == LocalOperands.size()) { |
1026 LocalOperands.push_back(Op); | 1211 LocalOperands.push_back(Op); |
1027 return; | 1212 return; |
1028 } | 1213 } |
1029 | 1214 |
1030 // Must be forward reference, expand vector to accommodate. | 1215 // Must be forward reference, expand vector to accommodate. |
1031 if (LocalIndex >= LocalOperands.size()) | 1216 if (LocalIndex >= LocalOperands.size()) |
1032 LocalOperands.resize(LocalIndex + 1); | 1217 LocalOperands.resize(LocalIndex + 1); |
1033 | 1218 |
1034 // If element not defined, set it. | 1219 // If element not defined, set it. |
1035 Ice::Operand *OldOp = LocalOperands[LocalIndex]; | 1220 Ice::Operand *OldOp = LocalOperands[LocalIndex]; |
1036 if (OldOp == NULL) { | 1221 if (OldOp == nullptr) { |
1037 LocalOperands[LocalIndex] = Op; | 1222 LocalOperands[LocalIndex] = Op; |
1038 return; | 1223 return; |
1039 } | 1224 } |
1040 | 1225 |
1041 // See if forward reference matches. | 1226 // See if forward reference matches. |
1042 if (OldOp == Op) | 1227 if (OldOp == Op) |
1043 return; | 1228 return; |
1044 | 1229 |
1045 // Error has occurred. | 1230 // Error has occurred. |
1046 std::string Buffer; | 1231 std::string Buffer; |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1466 return; | 1651 return; |
1467 CurrentNode->appendInst(Ice::InstArithmetic::create( | 1652 CurrentNode->appendInst(Ice::InstArithmetic::create( |
1468 Func, Opcode, getNextInstVar(Type1), Op1, Op2)); | 1653 Func, Opcode, getNextInstVar(Type1), Op1, Op2)); |
1469 break; | 1654 break; |
1470 } | 1655 } |
1471 case naclbitc::FUNC_CODE_INST_CAST: { | 1656 case naclbitc::FUNC_CODE_INST_CAST: { |
1472 // CAST: [opval, destty, castopc] | 1657 // CAST: [opval, destty, castopc] |
1473 if (!isValidRecordSize(3, "function block cast")) | 1658 if (!isValidRecordSize(3, "function block cast")) |
1474 return; | 1659 return; |
1475 Ice::Operand *Src = getRelativeOperand(Values[0], BaseIndex); | 1660 Ice::Operand *Src = getRelativeOperand(Values[0], BaseIndex); |
1476 Type *CastType = Context->getTypeByID(Values[1]); | 1661 Ice::Type CastType = Context->getTypeByID(Values[1]); |
1477 Instruction::CastOps LLVMCastOp; | 1662 Instruction::CastOps LLVMCastOp; |
1478 Ice::InstCast::OpKind CastKind; | 1663 Ice::InstCast::OpKind CastKind; |
1479 if (!naclbitc::DecodeCastOpcode(Values[2], LLVMCastOp) || | 1664 if (!naclbitc::DecodeCastOpcode(Values[2], LLVMCastOp) || |
1480 !convertLLVMCastOpToIceOp(LLVMCastOp, CastKind)) { | 1665 !convertLLVMCastOpToIceOp(LLVMCastOp, CastKind)) { |
1481 std::string Buffer; | 1666 std::string Buffer; |
1482 raw_string_ostream StrBuf(Buffer); | 1667 raw_string_ostream StrBuf(Buffer); |
1483 StrBuf << "Cast opcode not understood: " << Values[2]; | 1668 StrBuf << "Cast opcode not understood: " << Values[2]; |
1484 Error(StrBuf.str()); | 1669 Error(StrBuf.str()); |
1485 return; | 1670 return; |
1486 } | 1671 } |
1487 Type *SrcType = Context->convertToLLVMType(Src->getType()); | 1672 Ice::Type SrcType = Src->getType(); |
1488 if (!CastInst::castIsValid(LLVMCastOp, SrcType, CastType)) { | 1673 if (!CastInst::castIsValid(LLVMCastOp, Context->convertToLLVMType(SrcType), |
1674 Context->convertToLLVMType(CastType))) { | |
1489 std::string Buffer; | 1675 std::string Buffer; |
1490 raw_string_ostream StrBuf(Buffer); | 1676 raw_string_ostream StrBuf(Buffer); |
1491 StrBuf << "Illegal cast: " << Instruction::getOpcodeName(LLVMCastOp) | 1677 StrBuf << "Illegal cast: " << Instruction::getOpcodeName(LLVMCastOp) |
1492 << " " << *SrcType << " to " << *CastType; | 1678 << " " << SrcType << " to " << CastType; |
1493 Error(StrBuf.str()); | 1679 Error(StrBuf.str()); |
1494 return; | 1680 return; |
1495 } | 1681 } |
1496 CurrentNode->appendInst(Ice::InstCast::create( | 1682 CurrentNode->appendInst( |
1497 Func, CastKind, getNextInstVar(Context->convertToIceType(CastType)), | 1683 Ice::InstCast::create(Func, CastKind, getNextInstVar(CastType), Src)); |
1498 Src)); | |
1499 break; | 1684 break; |
1500 } | 1685 } |
1501 case naclbitc::FUNC_CODE_INST_VSELECT: { | 1686 case naclbitc::FUNC_CODE_INST_VSELECT: { |
1502 // VSELECT: [opval, opval, pred] | 1687 // VSELECT: [opval, opval, pred] |
1503 Ice::Operand *ThenVal = getRelativeOperand(Values[0], BaseIndex); | 1688 Ice::Operand *ThenVal = getRelativeOperand(Values[0], BaseIndex); |
1504 Ice::Type ThenType = ThenVal->getType(); | 1689 Ice::Type ThenType = ThenVal->getType(); |
1505 Ice::Operand *ElseVal = getRelativeOperand(Values[1], BaseIndex); | 1690 Ice::Operand *ElseVal = getRelativeOperand(Values[1], BaseIndex); |
1506 Ice::Type ElseType = ElseVal->getType(); | 1691 Ice::Type ElseType = ElseVal->getType(); |
1507 if (ThenType != ElseType) { | 1692 if (ThenType != ElseType) { |
1508 std::string Buffer; | 1693 std::string Buffer; |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1671 CurrentNode->appendInst( | 1856 CurrentNode->appendInst( |
1672 Ice::InstRet::create(Func, getRelativeOperand(Values[0], BaseIndex))); | 1857 Ice::InstRet::create(Func, getRelativeOperand(Values[0], BaseIndex))); |
1673 } | 1858 } |
1674 InstIsTerminating = true; | 1859 InstIsTerminating = true; |
1675 break; | 1860 break; |
1676 } | 1861 } |
1677 case naclbitc::FUNC_CODE_INST_BR: { | 1862 case naclbitc::FUNC_CODE_INST_BR: { |
1678 if (Values.size() == 1) { | 1863 if (Values.size() == 1) { |
1679 // BR: [bb#] | 1864 // BR: [bb#] |
1680 Ice::CfgNode *Block = getBranchBasicBlock(Values[0]); | 1865 Ice::CfgNode *Block = getBranchBasicBlock(Values[0]); |
1681 if (Block == NULL) | 1866 if (Block == nullptr) |
1682 return; | 1867 return; |
1683 CurrentNode->appendInst(Ice::InstBr::create(Func, Block)); | 1868 CurrentNode->appendInst(Ice::InstBr::create(Func, Block)); |
1684 } else { | 1869 } else { |
1685 // BR: [bb#, bb#, opval] | 1870 // BR: [bb#, bb#, opval] |
1686 if (!isValidRecordSize(3, "function block branch")) | 1871 if (!isValidRecordSize(3, "function block branch")) |
1687 return; | 1872 return; |
1688 Ice::Operand *Cond = getRelativeOperand(Values[2], BaseIndex); | 1873 Ice::Operand *Cond = getRelativeOperand(Values[2], BaseIndex); |
1689 if (Cond->getType() != Ice::IceType_i1) { | 1874 if (Cond->getType() != Ice::IceType_i1) { |
1690 std::string Buffer; | 1875 std::string Buffer; |
1691 raw_string_ostream StrBuf(Buffer); | 1876 raw_string_ostream StrBuf(Buffer); |
1692 StrBuf << "Branch condition " << *Cond << " not i1. Found: " | 1877 StrBuf << "Branch condition " << *Cond << " not i1. Found: " |
1693 << Cond->getType(); | 1878 << Cond->getType(); |
1694 Error(StrBuf.str()); | 1879 Error(StrBuf.str()); |
1695 return; | 1880 return; |
1696 } | 1881 } |
1697 Ice::CfgNode *ThenBlock = getBranchBasicBlock(Values[0]); | 1882 Ice::CfgNode *ThenBlock = getBranchBasicBlock(Values[0]); |
1698 Ice::CfgNode *ElseBlock = getBranchBasicBlock(Values[1]); | 1883 Ice::CfgNode *ElseBlock = getBranchBasicBlock(Values[1]); |
1699 if (ThenBlock == NULL || ElseBlock == NULL) | 1884 if (ThenBlock == nullptr || ElseBlock == nullptr) |
1700 return; | 1885 return; |
1701 CurrentNode->appendInst( | 1886 CurrentNode->appendInst( |
1702 Ice::InstBr::create(Func, Cond, ThenBlock, ElseBlock)); | 1887 Ice::InstBr::create(Func, Cond, ThenBlock, ElseBlock)); |
1703 } | 1888 } |
1704 InstIsTerminating = true; | 1889 InstIsTerminating = true; |
1705 break; | 1890 break; |
1706 } | 1891 } |
1707 case naclbitc::FUNC_CODE_INST_SWITCH: { | 1892 case naclbitc::FUNC_CODE_INST_SWITCH: { |
1708 // SWITCH: [Condty, Cond, BbIndex, NumCases Case ...] | 1893 // SWITCH: [Condty, Cond, BbIndex, NumCases Case ...] |
1709 // where Case = [1, 1, Value, BbIndex]. | 1894 // where Case = [1, 1, Value, BbIndex]. |
1710 // | 1895 // |
1711 // Note: Unlike most instructions, we don't infer the type of | 1896 // Note: Unlike most instructions, we don't infer the type of |
1712 // Cond, but provide it as a separate field. There are also | 1897 // Cond, but provide it as a separate field. There are also |
1713 // unnecesary data fields (i.e. constants 1). These were not | 1898 // unnecesary data fields (i.e. constants 1). These were not |
1714 // cleaned up in PNaCl bitcode because the bitcode format was | 1899 // cleaned up in PNaCl bitcode because the bitcode format was |
1715 // already frozen when the problem was noticed. | 1900 // already frozen when the problem was noticed. |
1716 if (!isValidRecordSizeAtLeast(4, "function block switch")) | 1901 if (!isValidRecordSizeAtLeast(4, "function block switch")) |
1717 return; | 1902 return; |
1718 Ice::Type CondTy = | 1903 Ice::Type CondTy = Context->getTypeByID(Values[0]); |
1719 Context->convertToIceType(Context->getTypeByID(Values[0])); | |
1720 if (!Ice::isScalarIntegerType(CondTy)) { | 1904 if (!Ice::isScalarIntegerType(CondTy)) { |
1721 std::string Buffer; | 1905 std::string Buffer; |
1722 raw_string_ostream StrBuf(Buffer); | 1906 raw_string_ostream StrBuf(Buffer); |
1723 StrBuf << "Case condition must be non-wide integer. Found: " << CondTy; | 1907 StrBuf << "Case condition must be non-wide integer. Found: " << CondTy; |
1724 Error(StrBuf.str()); | 1908 Error(StrBuf.str()); |
1725 return; | 1909 return; |
1726 } | 1910 } |
1727 Ice::SizeT BitWidth = Ice::getScalarIntBitWidth(CondTy); | 1911 Ice::SizeT BitWidth = Ice::getScalarIntBitWidth(CondTy); |
1728 Ice::Operand *Cond = getRelativeOperand(Values[1], BaseIndex); | 1912 Ice::Operand *Cond = getRelativeOperand(Values[1], BaseIndex); |
1729 if (CondTy != Cond->getType()) { | 1913 if (CondTy != Cond->getType()) { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1777 if (!isValidRecordSizeAtLeast(3, "function block phi")) | 1961 if (!isValidRecordSizeAtLeast(3, "function block phi")) |
1778 return; | 1962 return; |
1779 if ((Values.size() & 0x1) == 0) { | 1963 if ((Values.size() & 0x1) == 0) { |
1780 // Not an odd number of values. | 1964 // Not an odd number of values. |
1781 std::string Buffer; | 1965 std::string Buffer; |
1782 raw_string_ostream StrBuf(Buffer); | 1966 raw_string_ostream StrBuf(Buffer); |
1783 StrBuf << "function block phi record size not valid: " << Values.size(); | 1967 StrBuf << "function block phi record size not valid: " << Values.size(); |
1784 Error(StrBuf.str()); | 1968 Error(StrBuf.str()); |
1785 return; | 1969 return; |
1786 } | 1970 } |
1787 Ice::Type Ty = Context->convertToIceType(Context->getTypeByID(Values[0])); | 1971 Ice::Type Ty = Context->getTypeByID(Values[0]); |
1788 if (Ty == Ice::IceType_void) { | 1972 if (Ty == Ice::IceType_void) { |
1789 Error("Phi record using type void not allowed"); | 1973 Error("Phi record using type void not allowed"); |
1790 return; | 1974 return; |
1791 } | 1975 } |
1792 Ice::Variable *Dest = getNextInstVar(Ty); | 1976 Ice::Variable *Dest = getNextInstVar(Ty); |
1793 Ice::InstPhi *Phi = Ice::InstPhi::create(Func, Values.size() >> 1, Dest); | 1977 Ice::InstPhi *Phi = Ice::InstPhi::create(Func, Values.size() >> 1, Dest); |
1794 for (unsigned i = 1; i < Values.size(); i += 2) { | 1978 for (unsigned i = 1; i < Values.size(); i += 2) { |
1795 Ice::Operand *Op = | 1979 Ice::Operand *Op = |
1796 getRelativeOperand(NaClDecodeSignRotatedValue(Values[i]), BaseIndex); | 1980 getRelativeOperand(NaClDecodeSignRotatedValue(Values[i]), BaseIndex); |
1797 if (Op->getType() != Ty) { | 1981 if (Op->getType() != Ty) { |
(...skipping 30 matching lines...) Expand all Loading... | |
1828 } | 2012 } |
1829 case naclbitc::FUNC_CODE_INST_LOAD: { | 2013 case naclbitc::FUNC_CODE_INST_LOAD: { |
1830 // LOAD: [address, align, ty] | 2014 // LOAD: [address, align, ty] |
1831 if (!isValidRecordSize(3, "function block load")) | 2015 if (!isValidRecordSize(3, "function block load")) |
1832 return; | 2016 return; |
1833 Ice::Operand *Address = getRelativeOperand(Values[0], BaseIndex); | 2017 Ice::Operand *Address = getRelativeOperand(Values[0], BaseIndex); |
1834 if (!isValidPointerType(Address, "Load")) | 2018 if (!isValidPointerType(Address, "Load")) |
1835 return; | 2019 return; |
1836 unsigned Alignment; | 2020 unsigned Alignment; |
1837 extractAlignment("Load", Values[1], Alignment); | 2021 extractAlignment("Load", Values[1], Alignment); |
1838 Ice::Type Ty = Context->convertToIceType(Context->getTypeByID(Values[2])); | 2022 Ice::Type Ty = Context->getTypeByID(Values[2]); |
1839 if (!isValidLoadStoreAlignment(Alignment, Ty, "Load")) | 2023 if (!isValidLoadStoreAlignment(Alignment, Ty, "Load")) |
1840 return; | 2024 return; |
1841 CurrentNode->appendInst( | 2025 CurrentNode->appendInst( |
1842 Ice::InstLoad::create(Func, getNextInstVar(Ty), Address, Alignment)); | 2026 Ice::InstLoad::create(Func, getNextInstVar(Ty), Address, Alignment)); |
1843 break; | 2027 break; |
1844 } | 2028 } |
1845 case naclbitc::FUNC_CODE_INST_STORE: { | 2029 case naclbitc::FUNC_CODE_INST_STORE: { |
1846 // STORE: [address, value, align] | 2030 // STORE: [address, value, align] |
1847 if (!isValidRecordSize(3, "function block store")) | 2031 if (!isValidRecordSize(3, "function block store")) |
1848 return; | 2032 return; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1890 << " not understood."; | 2074 << " not understood."; |
1891 Error(StrBuf.str()); | 2075 Error(StrBuf.str()); |
1892 return; | 2076 return; |
1893 } | 2077 } |
1894 bool IsTailCall = static_cast<bool>(CCInfo & 1); | 2078 bool IsTailCall = static_cast<bool>(CCInfo & 1); |
1895 | 2079 |
1896 // Extract out the called function and its return type. | 2080 // Extract out the called function and its return type. |
1897 uint32_t CalleeIndex = convertRelativeToAbsIndex(Values[1], BaseIndex); | 2081 uint32_t CalleeIndex = convertRelativeToAbsIndex(Values[1], BaseIndex); |
1898 Ice::Operand *Callee = getOperand(CalleeIndex); | 2082 Ice::Operand *Callee = getOperand(CalleeIndex); |
1899 Ice::Type ReturnType = Ice::IceType_void; | 2083 Ice::Type ReturnType = Ice::IceType_void; |
1900 const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = NULL; | 2084 const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = nullptr; |
1901 if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) { | 2085 if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) { |
1902 Function *Fcn = | 2086 Function *Fcn = |
1903 dyn_cast<Function>(Context->getGlobalValueByID(CalleeIndex)); | 2087 dyn_cast<Function>(Context->getGlobalValueByID(CalleeIndex)); |
1904 if (Fcn == NULL) { | 2088 if (Fcn == nullptr) { |
1905 std::string Buffer; | 2089 std::string Buffer; |
1906 raw_string_ostream StrBuf(Buffer); | 2090 raw_string_ostream StrBuf(Buffer); |
1907 StrBuf << "Function call to non-function: " << *Callee; | 2091 StrBuf << "Function call to non-function: " << *Callee; |
1908 Error(StrBuf.str()); | 2092 Error(StrBuf.str()); |
1909 return; | 2093 return; |
1910 } | 2094 } |
1911 | 2095 |
1912 FunctionType *FcnTy = Fcn->getFunctionType(); | 2096 FunctionType *FcnTy = Fcn->getFunctionType(); |
1913 ReturnType = Context->convertToIceType(FcnTy->getReturnType()); | 2097 ReturnType = Context->convertToIceType(FcnTy->getReturnType()); |
1914 | 2098 |
1915 // Check if this direct call is to an Intrinsic (starts with "llvm.") | 2099 // Check if this direct call is to an Intrinsic (starts with "llvm.") |
1916 static Ice::IceString LLVMPrefix("llvm."); | 2100 static Ice::IceString LLVMPrefix("llvm."); |
1917 Ice::IceString Name = Fcn->getName(); | 2101 Ice::IceString Name = Fcn->getName(); |
1918 if (isStringPrefix(Name, LLVMPrefix)) { | 2102 if (isStringPrefix(Name, LLVMPrefix)) { |
1919 Ice::IceString Suffix = Name.substr(LLVMPrefix.size()); | 2103 Ice::IceString Suffix = Name.substr(LLVMPrefix.size()); |
1920 IntrinsicInfo = | 2104 IntrinsicInfo = |
1921 getTranslator().getContext()->getIntrinsicsInfo().find(Suffix); | 2105 getTranslator().getContext()->getIntrinsicsInfo().find(Suffix); |
1922 if (!IntrinsicInfo) { | 2106 if (!IntrinsicInfo) { |
1923 std::string Buffer; | 2107 std::string Buffer; |
1924 raw_string_ostream StrBuf(Buffer); | 2108 raw_string_ostream StrBuf(Buffer); |
1925 StrBuf << "Invalid PNaCl intrinsic call to " << Name; | 2109 StrBuf << "Invalid PNaCl intrinsic call to " << Name; |
1926 Error(StrBuf.str()); | 2110 Error(StrBuf.str()); |
1927 return; | 2111 return; |
1928 } | 2112 } |
1929 } | 2113 } |
1930 } else { | 2114 } else { |
1931 ReturnType = Context->convertToIceType(Context->getTypeByID(Values[2])); | 2115 ReturnType = Context->getTypeByID(Values[2]); |
1932 } | 2116 } |
1933 | 2117 |
1934 // Create the call instruction. | 2118 // Create the call instruction. |
1935 Ice::Variable *Dest = | 2119 Ice::Variable *Dest = (ReturnType == Ice::IceType_void) |
1936 (ReturnType == Ice::IceType_void) ? NULL : getNextInstVar(ReturnType); | 2120 ? nullptr |
2121 : getNextInstVar(ReturnType); | |
1937 Ice::SizeT NumParams = Values.size() - ParamsStartIndex; | 2122 Ice::SizeT NumParams = Values.size() - ParamsStartIndex; |
1938 Ice::InstCall *Inst = NULL; | 2123 Ice::InstCall *Inst = nullptr; |
1939 if (IntrinsicInfo) { | 2124 if (IntrinsicInfo) { |
1940 Inst = | 2125 Inst = |
1941 Ice::InstIntrinsicCall::create(Func, NumParams, Dest, Callee, | 2126 Ice::InstIntrinsicCall::create(Func, NumParams, Dest, Callee, |
1942 IntrinsicInfo->Info); | 2127 IntrinsicInfo->Info); |
1943 } else { | 2128 } else { |
1944 Inst = Ice::InstCall::create(Func, NumParams, Dest, Callee, IsTailCall); | 2129 Inst = Ice::InstCall::create(Func, NumParams, Dest, Callee, IsTailCall); |
1945 } | 2130 } |
1946 | 2131 |
1947 // Add parameters. | 2132 // Add parameters. |
1948 for (Ice::SizeT ParamIndex = 0; ParamIndex < NumParams; ++ParamIndex) { | 2133 for (Ice::SizeT ParamIndex = 0; ParamIndex < NumParams; ++ParamIndex) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1992 } | 2177 } |
1993 } | 2178 } |
1994 | 2179 |
1995 CurrentNode->appendInst(Inst); | 2180 CurrentNode->appendInst(Inst); |
1996 return; | 2181 return; |
1997 } | 2182 } |
1998 case naclbitc::FUNC_CODE_INST_FORWARDTYPEREF: { | 2183 case naclbitc::FUNC_CODE_INST_FORWARDTYPEREF: { |
1999 // FORWARDTYPEREF: [opval, ty] | 2184 // FORWARDTYPEREF: [opval, ty] |
2000 if (!isValidRecordSize(2, "function block forward type ref")) | 2185 if (!isValidRecordSize(2, "function block forward type ref")) |
2001 return; | 2186 return; |
2002 setOperand(Values[0], createInstVar(Context->convertToIceType( | 2187 setOperand(Values[0], createInstVar(Context->getTypeByID(Values[1]))); |
2003 Context->getTypeByID(Values[1])))); | |
2004 break; | 2188 break; |
2005 } | 2189 } |
2006 default: | 2190 default: |
2007 // Generate error message! | 2191 // Generate error message! |
2008 BlockParserBaseClass::ProcessRecord(); | 2192 BlockParserBaseClass::ProcessRecord(); |
2009 break; | 2193 break; |
2010 } | 2194 } |
2011 } | 2195 } |
2012 | 2196 |
2013 /// Parses constants within a function block. | 2197 /// Parses constants within a function block. |
(...skipping 28 matching lines...) Expand all Loading... | |
2042 } | 2226 } |
2043 }; | 2227 }; |
2044 | 2228 |
2045 void ConstantsParser::ProcessRecord() { | 2229 void ConstantsParser::ProcessRecord() { |
2046 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); | 2230 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); |
2047 switch (Record.GetCode()) { | 2231 switch (Record.GetCode()) { |
2048 case naclbitc::CST_CODE_SETTYPE: { | 2232 case naclbitc::CST_CODE_SETTYPE: { |
2049 // SETTYPE: [typeid] | 2233 // SETTYPE: [typeid] |
2050 if (!isValidRecordSize(1, "constants block set type")) | 2234 if (!isValidRecordSize(1, "constants block set type")) |
2051 return; | 2235 return; |
2052 NextConstantType = | 2236 NextConstantType = Context->getTypeByID(Values[0]); |
2053 Context->convertToIceType(Context->getTypeByID(Values[0])); | |
2054 if (NextConstantType == Ice::IceType_void) | 2237 if (NextConstantType == Ice::IceType_void) |
2055 Error("constants block set type not allowed for void type"); | 2238 Error("constants block set type not allowed for void type"); |
2056 return; | 2239 return; |
2057 } | 2240 } |
2058 case naclbitc::CST_CODE_UNDEF: { | 2241 case naclbitc::CST_CODE_UNDEF: { |
2059 // UNDEF | 2242 // UNDEF |
2060 if (!isValidRecordSize(0, "constants block undef")) | 2243 if (!isValidRecordSize(0, "constants block undef")) |
2061 return; | 2244 return; |
2062 if (!isValidNextConstantType()) | 2245 if (!isValidNextConstantType()) |
2063 return; | 2246 return; |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2248 | 2431 |
2249 ~ModuleValuesymtabParser() override {} | 2432 ~ModuleValuesymtabParser() override {} |
2250 | 2433 |
2251 private: | 2434 private: |
2252 void setValueName(uint64_t Index, StringType &Name) override; | 2435 void setValueName(uint64_t Index, StringType &Name) override; |
2253 void setBbName(uint64_t Index, StringType &Name) override; | 2436 void setBbName(uint64_t Index, StringType &Name) override; |
2254 }; | 2437 }; |
2255 | 2438 |
2256 void ModuleValuesymtabParser::setValueName(uint64_t Index, StringType &Name) { | 2439 void ModuleValuesymtabParser::setValueName(uint64_t Index, StringType &Name) { |
2257 Value *V = Context->getGlobalValueByID(Index); | 2440 Value *V = Context->getGlobalValueByID(Index); |
2258 if (V == NULL) { | 2441 if (V == nullptr) { |
2259 std::string Buffer; | 2442 std::string Buffer; |
2260 raw_string_ostream StrBuf(Buffer); | 2443 raw_string_ostream StrBuf(Buffer); |
2261 StrBuf << "Invalid global address ID in valuesymtab: " << Index; | 2444 StrBuf << "Invalid global address ID in valuesymtab: " << Index; |
2262 Error(StrBuf.str()); | 2445 Error(StrBuf.str()); |
2263 return; | 2446 return; |
2264 } | 2447 } |
2265 V->setName(StringRef(Name.data(), Name.size())); | 2448 V->setName(StringRef(Name.data(), Name.size())); |
2266 } | 2449 } |
2267 | 2450 |
2268 void ModuleValuesymtabParser::setBbName(uint64_t Index, StringType &Name) { | 2451 void ModuleValuesymtabParser::setBbName(uint64_t Index, StringType &Name) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2312 raw_string_ostream StrBuf(Buffer); | 2495 raw_string_ostream StrBuf(Buffer); |
2313 StrBuf << "Unknown bitstream version: " << Version; | 2496 StrBuf << "Unknown bitstream version: " << Version; |
2314 Error(StrBuf.str()); | 2497 Error(StrBuf.str()); |
2315 } | 2498 } |
2316 return; | 2499 return; |
2317 } | 2500 } |
2318 case naclbitc::MODULE_CODE_FUNCTION: { | 2501 case naclbitc::MODULE_CODE_FUNCTION: { |
2319 // FUNCTION: [type, callingconv, isproto, linkage] | 2502 // FUNCTION: [type, callingconv, isproto, linkage] |
2320 if (!isValidRecordSize(4, "Function heading")) | 2503 if (!isValidRecordSize(4, "Function heading")) |
2321 return; | 2504 return; |
2322 Type *Ty = Context->getTypeByID(Values[0]); | 2505 const Ice::FcnSigType &Ty = Context->getFcnSigTypeByID(Values[0]); |
2323 FunctionType *FTy = dyn_cast<FunctionType>(Ty); | |
2324 if (FTy == NULL) { | |
2325 std::string Buffer; | |
2326 raw_string_ostream StrBuf(Buffer); | |
2327 StrBuf << "Function heading expects function type. Found: " << Ty; | |
2328 Error(StrBuf.str()); | |
2329 return; | |
2330 } | |
2331 CallingConv::ID CallingConv; | 2506 CallingConv::ID CallingConv; |
2332 if (!naclbitc::DecodeCallingConv(Values[1], CallingConv)) { | 2507 if (!naclbitc::DecodeCallingConv(Values[1], CallingConv)) { |
2333 std::string Buffer; | 2508 std::string Buffer; |
2334 raw_string_ostream StrBuf(Buffer); | 2509 raw_string_ostream StrBuf(Buffer); |
2335 StrBuf << "Function heading has unknown calling convention: " | 2510 StrBuf << "Function heading has unknown calling convention: " |
2336 << Values[1]; | 2511 << Values[1]; |
2337 Error(StrBuf.str()); | 2512 Error(StrBuf.str()); |
2338 return; | 2513 return; |
2339 } | 2514 } |
2340 GlobalValue::LinkageTypes Linkage; | 2515 GlobalValue::LinkageTypes Linkage; |
2341 if (!naclbitc::DecodeLinkage(Values[3], Linkage)) { | 2516 if (!naclbitc::DecodeLinkage(Values[3], Linkage)) { |
2342 std::string Buffer; | 2517 std::string Buffer; |
2343 raw_string_ostream StrBuf(Buffer); | 2518 raw_string_ostream StrBuf(Buffer); |
2344 StrBuf << "Function heading has unknown linkage. Found " << Values[3]; | 2519 StrBuf << "Function heading has unknown linkage. Found " << Values[3]; |
2345 Error(StrBuf.str()); | 2520 Error(StrBuf.str()); |
2346 return; | 2521 return; |
2347 } | 2522 } |
2348 Function *Func = Function::Create(FTy, Linkage, "", Context->getModule()); | 2523 SmallVector<Type *, 8> ArgTys; |
2524 for (Ice::Type ArgType : Ty.getArgList()) { | |
2525 ArgTys.push_back(Context->convertToLLVMType(ArgType)); | |
2526 } | |
2527 Function *Func = Function::Create( | |
2528 FunctionType::get(Context->convertToLLVMType(Ty.getReturnType()), | |
2529 ArgTys, false), | |
2530 Linkage, "", Context->getModule()); | |
2349 Func->setCallingConv(CallingConv); | 2531 Func->setCallingConv(CallingConv); |
2350 if (Values[2] == 0) | 2532 if (Values[2] == 0) |
2351 Context->setNextValueIDAsImplementedFunction(); | 2533 Context->setNextValueIDAsImplementedFunction(); |
2352 Context->setNextFunctionID(Func); | 2534 Context->setNextFunctionID(Func); |
2353 // TODO(kschimpf) verify if Func matches PNaCl ABI. | 2535 // TODO(kschimpf) verify if Func matches PNaCl ABI. |
2354 return; | 2536 return; |
2355 } | 2537 } |
2356 default: | 2538 default: |
2357 BlockParserBaseClass::ProcessRecord(); | 2539 BlockParserBaseClass::ProcessRecord(); |
2358 return; | 2540 return; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2417 | 2599 |
2418 if (TopLevelBlocks != 1) { | 2600 if (TopLevelBlocks != 1) { |
2419 errs() << IRFilename | 2601 errs() << IRFilename |
2420 << ": Contains more than one module. Found: " << TopLevelBlocks | 2602 << ": Contains more than one module. Found: " << TopLevelBlocks |
2421 << "\n"; | 2603 << "\n"; |
2422 ErrorStatus = true; | 2604 ErrorStatus = true; |
2423 } | 2605 } |
2424 } | 2606 } |
2425 | 2607 |
2426 } // end of namespace Ice | 2608 } // end of namespace Ice |
OLD | NEW |