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

Side by Side Diff: src/PNaClTranslator.cpp

Issue 625243002: Convert Subzero's bitcode reader to generate ICE types. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix issues in patch set 3. Created 6 years, 2 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
« src/IceTypes.h ('K') | « src/IceTypes.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 undefined, a (simple) type, or a function type
54 // signature. Note that an extended type is undefined on construction.
55 // Use methods setAsSimpleType and setAsFuncSigType to define
56 // the extended type.
57 class ExtendedType {
58
59 public:
60 /// Discriminator for LLVM-style RTTI.
61 enum TypeKind { Undefined, Simple, FuncSig };
62
63 explicit ExtendedType() : Kind(Undefined) {}
Jim Stichnoth 2014/10/06 22:48:52 I don't think you need "explicit" on a zero-arg ct
Karl 2014/10/07 20:15:58 Done.
64
65 explicit ExtendedType(const ExtendedType &Ty)
66 : Signature(Ty.Signature), Kind(Ty.Kind) {}
67
68 ExtendedType &operator=(const ExtendedType &Ty) {
Jim Stichnoth 2014/10/06 22:48:52 This is a shallow copy, so can you just use the de
Karl 2014/10/07 20:15:59 Removed assignment, not needed. Replaced explicit
69 Kind = Ty.Kind;
70 Signature = Ty.Signature;
71 return *this;
72 }
73
74 virtual ~ExtendedType() {}
75
76 ExtendedType::TypeKind getKind() const { return Kind; }
77 void Dump(Ice::Ostream &Stream) const;
78
79 /// Changes the extended type to a simple type with the given
80 /// value.
81 void setAsSimpleType(Ice::Type Ty) {
82 assert(Kind == Undefined);
83 Kind = Simple;
84 Signature.setReturnType(Ty);
85 }
86
87 /// Changes the extended type to an (empty) function signature type.
88 void setAsFunctionType() {
89 assert(Kind == Undefined);
90 Kind = FuncSig;
91 }
92
93 /// Changes type back to undefined type.
94 void resetToUndefined() {
95 if (Kind != Undefined) {
96 Kind = Undefined;
97 Signature.reset();
98 }
99 }
100
101 protected:
102 // Note: For simple types, the return type of the signature will
jvoung (off chromium) 2014/10/07 15:54:42 extra space between sig and will
Karl 2014/10/07 20:15:59 Done.
103 // be used to hold the simple type.
104 Ice::FuncSigType Signature;
105
106 private:
107 ExtendedType::TypeKind Kind;
108 };
109
110 Ice::Ostream &operator<<(Ice::Ostream &Stream, const ExtendedType &Ty) {
111 Ty.Dump(Stream);
112 return Stream;
113 }
114
115 Ice::Ostream &operator<<(Ice::Ostream &Stream, ExtendedType::TypeKind Kind) {
116 Stream << "ExtendedType::";
117 switch (Kind) {
118 case ExtendedType::Undefined:
119 Stream << "Undefined";
120 break;
121 case ExtendedType::Simple:
122 Stream << "Simple";
123 break;
124 case ExtendedType::FuncSig:
125 Stream << "FuncSig";
126 break;
127 default:
128 Stream << "??";
129 break;
130 }
131 return Stream;
132 }
133
134 // Models an ICE type as an extended type.
135 class SimpleExtendedType : public ExtendedType {
136 SimpleExtendedType(const SimpleExtendedType &) = delete;
137 SimpleExtendedType &operator=(const SimpleExtendedType &) = delete;
138
139 public:
140 Ice::Type getType() const { return Signature.getReturnType(); }
141
142 static bool classof(const ExtendedType *Ty) {
143 return Ty->getKind() == Simple;
144 }
145 };
146
147 // Models a function signature as an extended type.
148 class FuncSigExtendedType : public ExtendedType {
149 FuncSigExtendedType(const FuncSigExtendedType &) = delete;
150 FuncSigExtendedType &operator=(const FuncSigExtendedType &) = delete;
151
152 public:
153 const Ice::FuncSigType &getSignature() const { return Signature; }
154 void setReturnType(Ice::Type ReturnType) {
155 Signature.setReturnType(ReturnType);
156 }
157 void appendArgType(Ice::Type ArgType) { Signature.appendArgType(ArgType); }
158 static bool classof(const ExtendedType *Ty) {
159 return Ty->getKind() == FuncSig;
160 }
161 };
162
163 void ExtendedType::Dump(Ice::Ostream &Stream) const {
164 Stream << Kind;
165 switch (Kind) {
166 case Simple: {
167 Stream << " " << Signature.getReturnType();
168 break;
169 }
170 case FuncSig: {
171 Stream << " " << Signature;
172 }
173 default:
174 break;
175 }
176 }
177
52 // Top-level class to read PNaCl bitcode files, and translate to ICE. 178 // Top-level class to read PNaCl bitcode files, and translate to ICE.
53 class TopLevelParser : public NaClBitcodeParser { 179 class TopLevelParser : public NaClBitcodeParser {
54 TopLevelParser(const TopLevelParser &) = delete; 180 TopLevelParser(const TopLevelParser &) = delete;
55 TopLevelParser &operator=(const TopLevelParser &) = delete; 181 TopLevelParser &operator=(const TopLevelParser &) = delete;
56 182
57 public: 183 public:
58 TopLevelParser(Ice::Translator &Translator, const std::string &InputName, 184 TopLevelParser(Ice::Translator &Translator, const std::string &InputName,
59 NaClBitcodeHeader &Header, NaClBitstreamCursor &Cursor, 185 NaClBitcodeHeader &Header, NaClBitstreamCursor &Cursor,
60 bool &ErrorStatus) 186 bool &ErrorStatus)
61 : NaClBitcodeParser(Cursor), Translator(Translator), 187 : NaClBitcodeParser(Cursor), Translator(Translator),
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 219
94 /// Returns the number of bytes in the bitcode header. 220 /// Returns the number of bytes in the bitcode header.
95 size_t getHeaderSize() const { return Header.getHeaderSize(); } 221 size_t getHeaderSize() const { return Header.getHeaderSize(); }
96 222
97 /// Returns the llvm context to use. 223 /// Returns the llvm context to use.
98 LLVMContext &getLLVMContext() const { return Mod->getContext(); } 224 LLVMContext &getLLVMContext() const { return Mod->getContext(); }
99 225
100 /// Changes the size of the type list to the given size. 226 /// Changes the size of the type list to the given size.
101 void resizeTypeIDValues(unsigned NewSize) { TypeIDValues.resize(NewSize); } 227 void resizeTypeIDValues(unsigned NewSize) { TypeIDValues.resize(NewSize); }
102 228
103 /// Returns the type associated with the given index. 229 /// Returns the undefined type associated with type ID.
104 Type *getTypeByID(unsigned ID) { 230 ExtendedType *getUndefinedTypeByID(unsigned ID) const {
105 // Note: method resizeTypeIDValues expands TypeIDValues 231 ExtendedType *Ty = const_cast<::ExtendedType *>(
106 // to the specified size, and fills elements with NULL. 232 getTypeByIDAsKind(ID, ExtendedType::Undefined));
107 Type *Ty = ID < TypeIDValues.size() ? TypeIDValues[ID] : NULL; 233 if (Ty == nullptr)
108 if (Ty) 234 Ty = const_cast<TopLevelParser *>(this)->getDummyUndefinedExtendedType();
jvoung (off chromium) 2014/10/07 15:54:41 In this case, how does the result of getDummyUndef
Karl 2014/10/07 20:15:58 This method is called only once for each ID, to ge
109 return Ty; 235 return Ty;
110 return reportTypeIDAsUndefined(ID);
111 } 236 }
112 237
113 /// Defines type for ID. 238 /// Returns the type associated with the given index.
114 void setTypeID(unsigned ID, Type *Ty) { 239 Ice::Type getSimpleTypeByID(unsigned ID) const {
115 if (ID < TypeIDValues.size() && TypeIDValues[ID] == NULL) { 240 const ExtendedType *Ty = getTypeByIDAsKind(ID, ExtendedType::Simple);
116 TypeIDValues[ID] = Ty; 241 if (Ty == nullptr)
117 return; 242 // Return error recovery value.
118 } 243 return Ice::IceType_void;
119 reportBadSetTypeID(ID, Ty); 244 return cast<SimpleExtendedType>(Ty)->getType();
245 }
246
247 /// Returns the type signature associated with the given index.
248 const Ice::FuncSigType &getFuncSigTypeByID(unsigned ID) const {
249 const ExtendedType *Ty = getTypeByIDAsKind(ID, ExtendedType::FuncSig);
250 if (Ty == nullptr)
251 // Return error recovery value.
252 return UndefinedFuncSigType;
253 return cast<FuncSigExtendedType>(Ty)->getSignature();
120 } 254 }
121 255
122 /// Sets the next function ID to the given LLVM function. 256 /// Sets the next function ID to the given LLVM function.
123 void setNextFunctionID(Function *Fcn) { 257 void setNextFunctionID(Function *Fcn) {
124 ++NumFunctionIds; 258 ++NumFunctionIds;
125 ValueIDValues.push_back(Fcn); 259 ValueIDValues.push_back(Fcn);
126 } 260 }
127 261
128 /// Defines the next function ID as one that has an implementation 262 /// Defines the next function ID as one that has an implementation
129 /// (i.e a corresponding function block in the bitcode). 263 /// (i.e a corresponding function block in the bitcode).
130 void setNextValueIDAsImplementedFunction() { 264 void setNextValueIDAsImplementedFunction() {
131 DefiningFunctionsList.push_back(ValueIDValues.size()); 265 DefiningFunctionsList.push_back(ValueIDValues.size());
132 } 266 }
133 267
134 /// Returns the value id that should be associated with the the 268 /// Returns the value id that should be associated with the the
135 /// current function block. Increments internal counters during call 269 /// current function block. Increments internal counters during call
136 /// so that it will be in correct position for next function block. 270 /// so that it will be in correct position for next function block.
137 unsigned getNextFunctionBlockValueID() { 271 unsigned getNextFunctionBlockValueID() {
138 if (NumFunctionBlocks >= DefiningFunctionsList.size()) 272 if (NumFunctionBlocks >= DefiningFunctionsList.size())
139 report_fatal_error( 273 report_fatal_error(
140 "More function blocks than defined function addresses"); 274 "More function blocks than defined function addresses");
141 return DefiningFunctionsList[NumFunctionBlocks++]; 275 return DefiningFunctionsList[NumFunctionBlocks++];
142 } 276 }
143 277
144 /// Returns the LLVM IR value associatd with the global value ID. 278 /// Returns the LLVM IR value associatd with the global value ID.
145 Value *getGlobalValueByID(unsigned ID) const { 279 Value *getGlobalValueByID(unsigned ID) const {
146 if (ID >= ValueIDValues.size()) 280 if (ID >= ValueIDValues.size())
147 return NULL; 281 return nullptr;
148 return ValueIDValues[ID]; 282 return ValueIDValues[ID];
149 } 283 }
150 284
151 /// Returns the corresponding constant associated with a global value 285 /// Returns the corresponding constant associated with a global value
152 /// (i.e. relocatable). 286 /// (i.e. relocatable).
153 Ice::Constant *getOrCreateGlobalConstantByID(unsigned ID) { 287 Ice::Constant *getOrCreateGlobalConstantByID(unsigned ID) {
154 // TODO(kschimpf): Can this be built when creating global initializers? 288 // TODO(kschimpf): Can this be built when creating global initializers?
155 if (ID >= ValueIDConstants.size()) { 289 if (ID >= ValueIDConstants.size()) {
156 if (ID >= ValueIDValues.size()) 290 if (ID >= ValueIDValues.size())
157 return NULL; 291 return nullptr;
158 ValueIDConstants.resize(ValueIDValues.size()); 292 ValueIDConstants.resize(ValueIDValues.size());
159 } 293 }
160 Ice::Constant *C = ValueIDConstants[ID]; 294 Ice::Constant *C = ValueIDConstants[ID];
161 if (C != NULL) 295 if (C != nullptr)
162 return C; 296 return C;
163 Value *V = ValueIDValues[ID]; 297 Value *V = ValueIDValues[ID];
164 assert(isa<GlobalValue>(V)); 298 assert(isa<GlobalValue>(V));
165 C = getTranslator().getContext()->getConstantSym(getIcePointerType(), 0, 299 C = getTranslator().getContext()->getConstantSym(getIcePointerType(), 0,
166 V->getName()); 300 V->getName());
167 ValueIDConstants[ID] = C; 301 ValueIDConstants[ID] = C;
168 return C; 302 return C;
169 } 303 }
170 304
171 /// Returns the number of function addresses (i.e. ID's) defined in 305 /// Returns the number of function addresses (i.e. ID's) defined in
172 /// the bitcode file. 306 /// the bitcode file.
173 unsigned getNumFunctionIDs() const { return NumFunctionIds; } 307 unsigned getNumFunctionIDs() const { return NumFunctionIds; }
174 308
175 /// Returns the number of global values defined in the bitcode 309 /// Returns the number of global values defined in the bitcode
176 /// file. 310 /// file.
177 unsigned getNumGlobalValueIDs() const { return ValueIDValues.size(); } 311 unsigned getNumGlobalValueIDs() const { return ValueIDValues.size(); }
178 312
179 /// Resizes the list of value IDs to include Count global variable 313 /// Resizes the list of value IDs to include Count global variable
180 /// IDs. 314 /// IDs.
181 void resizeValueIDsForGlobalVarCount(unsigned Count) { 315 void resizeValueIDsForGlobalVarCount(unsigned Count) {
182 ValueIDValues.resize(ValueIDValues.size() + Count); 316 ValueIDValues.resize(ValueIDValues.size() + Count);
183 } 317 }
184 318
185 /// Returns the global variable address associated with the given 319 /// Returns the global variable address associated with the given
186 /// value ID. If the ID refers to a global variable address not yet 320 /// 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 321 /// defined, a placeholder is created so that we can fix it up
188 /// later. 322 /// later.
189 Constant *getOrCreateGlobalVarRef(unsigned ID) { 323 Constant *getOrCreateGlobalVarRef(unsigned ID) {
190 if (ID >= ValueIDValues.size()) 324 if (ID >= ValueIDValues.size())
191 return NULL; 325 return nullptr;
192 if (Value *C = ValueIDValues[ID]) 326 if (Value *C = ValueIDValues[ID])
193 return dyn_cast<Constant>(C); 327 return dyn_cast<Constant>(C);
194 Constant *C = new GlobalVariable(*Mod, GlobalVarPlaceHolderType, false, 328 Constant *C = new GlobalVariable(*Mod, GlobalVarPlaceHolderType, false,
195 GlobalValue::ExternalLinkage, 0); 329 GlobalValue::ExternalLinkage, 0);
196 ValueIDValues[ID] = C; 330 ValueIDValues[ID] = C;
197 return C; 331 return C;
198 } 332 }
199 333
200 /// Assigns the given global variable (address) to the given value 334 /// Assigns the given global variable (address) to the given value
201 /// ID. Returns true if ID is a valid global variable ID. Otherwise 335 /// ID. Returns true if ID is a valid global variable ID. Otherwise
202 /// returns false. 336 /// returns false.
203 bool assignGlobalVariable(GlobalVariable *GV, unsigned ID) { 337 bool assignGlobalVariable(GlobalVariable *GV, unsigned ID) {
204 if (ID < NumFunctionIds || ID >= ValueIDValues.size()) 338 if (ID < NumFunctionIds || ID >= ValueIDValues.size())
205 return false; 339 return false;
206 WeakVH &OldV = ValueIDValues[ID]; 340 WeakVH &OldV = ValueIDValues[ID];
207 if (OldV == NULL) { 341 if (OldV == nullptr) {
208 ValueIDValues[ID] = GV; 342 ValueIDValues[ID] = GV;
209 return true; 343 return true;
210 } 344 }
211 345
212 // If reached, there was a forward reference to this value. Replace it. 346 // If reached, there was a forward reference to this value. Replace it.
213 Value *PrevVal = OldV; 347 Value *PrevVal = OldV;
214 GlobalVariable *Placeholder = cast<GlobalVariable>(PrevVal); 348 GlobalVariable *Placeholder = cast<GlobalVariable>(PrevVal);
215 Placeholder->replaceAllUsesWith( 349 Placeholder->replaceAllUsesWith(
216 ConstantExpr::getBitCast(GV, Placeholder->getType())); 350 ConstantExpr::getBitCast(GV, Placeholder->getType()));
217 Placeholder->eraseFromParent(); 351 Placeholder->eraseFromParent();
218 ValueIDValues[ID] = GV; 352 ValueIDValues[ID] = GV;
219 return true; 353 return true;
220 } 354 }
221 355
222 /// Returns the corresponding ICE type for LLVMTy. 356 /// Returns the corresponding ICE type for LLVMTy.
223 Ice::Type convertToIceType(Type *LLVMTy) { 357 Ice::Type convertToIceType(Type *LLVMTy) {
224 Ice::Type IceTy = TypeConverter.convertToIceType(LLVMTy); 358 Ice::Type IceTy = TypeConverter.convertToIceType(LLVMTy);
225 if (IceTy >= Ice::IceType_NUM) { 359 if (IceTy >= Ice::IceType_NUM) {
226 return convertToIceTypeError(LLVMTy); 360 return convertToIceTypeError(LLVMTy);
227 } 361 }
228 return IceTy; 362 return IceTy;
229 } 363 }
230 364
231 /// Returns the corresponding LLVM type for IceTy. 365 /// Returns the corresponding LLVM type for IceTy.
232 Type *convertToLLVMType(Ice::Type IceTy) const { 366 Type *convertToLLVMType(Ice::Type IceTy) const {
233 return TypeConverter.convertToLLVMType(IceTy); 367 return TypeConverter.convertToLLVMType(IceTy);
234 } 368 }
235 369
236 /// Returns the LLVM integer type with the given number of Bits. If
237 /// Bits is not a valid PNaCl type, returns NULL.
238 Type *getLLVMIntegerType(unsigned Bits) const {
239 return TypeConverter.getLLVMIntegerType(Bits);
240 }
241
242 /// Returns the LLVM vector with the given Size and Ty. If not a
243 /// valid PNaCl vector type, returns NULL.
244 Type *getLLVMVectorType(unsigned Size, Ice::Type Ty) const {
245 return TypeConverter.getLLVMVectorType(Size, Ty);
246 }
247
248 /// Returns the model for pointer types in ICE. 370 /// Returns the model for pointer types in ICE.
249 Ice::Type getIcePointerType() const { 371 Ice::Type getIcePointerType() const {
250 return TypeConverter.getIcePointerType(); 372 return TypeConverter.getIcePointerType();
251 } 373 }
252 374
253 private: 375 private:
254 // The translator associated with the parser. 376 // The translator associated with the parser.
255 Ice::Translator &Translator; 377 Ice::Translator &Translator;
256 // The parsed module. 378 // The parsed module.
257 std::unique_ptr<Module> Mod; 379 std::unique_ptr<Module> Mod;
258 // The data layout to use. 380 // The data layout to use.
259 DataLayout DL; 381 DataLayout DL;
260 // The bitcode header. 382 // The bitcode header.
261 NaClBitcodeHeader &Header; 383 NaClBitcodeHeader &Header;
262 // Converter between LLVM and ICE types. 384 // Converter between LLVM and ICE types.
263 Ice::TypeConverter TypeConverter; 385 Ice::TypeConverter TypeConverter;
264 // The exit status that should be set to true if an error occurs. 386 // The exit status that should be set to true if an error occurs.
265 bool &ErrorStatus; 387 bool &ErrorStatus;
266 // The number of errors reported. 388 // The number of errors reported.
267 unsigned NumErrors; 389 unsigned NumErrors;
268 // The types associated with each type ID. 390 // The types associated with each type ID.
269 std::vector<Type *> TypeIDValues; 391 std::vector<ExtendedType> TypeIDValues;
270 // The (global) value IDs. 392 // The (global) value IDs.
271 std::vector<WeakVH> ValueIDValues; 393 std::vector<WeakVH> ValueIDValues;
272 // Relocatable constants associated with ValueIDValues. 394 // Relocatable constants associated with ValueIDValues.
273 std::vector<Ice::Constant *> ValueIDConstants; 395 std::vector<Ice::Constant *> ValueIDConstants;
274 // The number of function IDs. 396 // The number of function IDs.
275 unsigned NumFunctionIds; 397 unsigned NumFunctionIds;
276 // The number of function blocks (processed so far). 398 // The number of function blocks (processed so far).
277 unsigned NumFunctionBlocks; 399 unsigned NumFunctionBlocks;
278 // The list of value IDs (in the order found) of defining function 400 // The list of value IDs (in the order found) of defining function
279 // addresses. 401 // addresses.
280 std::vector<unsigned> DefiningFunctionsList; 402 std::vector<unsigned> DefiningFunctionsList;
281 // Cached global variable placeholder type. Used for all forward 403 // Cached global variable placeholder type. Used for all forward
282 // references to global variable addresses. 404 // references to global variable addresses.
283 Type *GlobalVarPlaceHolderType; 405 Type *GlobalVarPlaceHolderType;
406 // Models an undefined function type signature.
407 Ice::FuncSigType UndefinedFuncSigType;
408 // Models an badly indexed undefined extended type.
Jim Stichnoth 2014/10/06 22:48:52 a badly
Karl 2014/10/07 20:15:59 Removed the need for this field, so this has been
409 ExtendedType DummyUndefinedExtendedType;
284 410
285 bool ParseBlock(unsigned BlockID) override; 411 bool ParseBlock(unsigned BlockID) override;
286 412
287 /// Reports that type ID is undefined, and then returns 413 // Gets extended type associated with the given index, assuming the
288 /// the void type. 414 // extended type is of the WantedKind. Generates error message if
289 Type *reportTypeIDAsUndefined(unsigned ID); 415 // corresponding extended type of WantedKind can't be found, and
416 // returns nullptr.
417 const ExtendedType *
418 getTypeByIDAsKind(unsigned ID, ExtendedType::TypeKind WantedKind) const {
419 const ExtendedType *Ty = nullptr;
420 if (ID < TypeIDValues.size()) {
421 Ty = &TypeIDValues[ID];
422 if (Ty->getKind() == WantedKind)
423 return Ty;
424 }
425 // Note: We turn off constness so that we can generate an error message.
Jim Stichnoth 2014/10/06 22:48:51 "... so that we can set ErrorStatus"
Karl 2014/10/07 20:15:59 Done.
426 const_cast<TopLevelParser *>(this)->reportBadTypeIDAs(ID, Ty, WantedKind);
427 return nullptr;
428 }
290 429
291 /// Reports error about bad call to setTypeID. 430 // Reports that type ID is undefined.
292 void reportBadSetTypeID(unsigned ID, Type *Ty); 431 void reportBadTypeIDAs(unsigned ID, const ExtendedType *Ty,
432 ExtendedType::TypeKind WantedType);
433
434 // Returns dummy undefined extended type. Used to guarantee
435 // that getUndefinedByTypeID always returns a valid extended type.
jvoung (off chromium) 2014/10/07 15:54:41 getUndefinedTypeByID?
Karl 2014/10/07 20:15:58 This method has been removed, so nothing to be fix
436 ExtendedType *getDummyUndefinedExtendedType();
293 437
294 // Reports that there is no corresponding ICE type for LLVMTy, and 438 // Reports that there is no corresponding ICE type for LLVMTy, and
295 // returns ICE::IceType_void. 439 // returns ICE::IceType_void.
296 Ice::Type convertToIceTypeError(Type *LLVMTy); 440 Ice::Type convertToIceTypeError(Type *LLVMTy);
297 }; 441 };
298 442
299 Type *TopLevelParser::reportTypeIDAsUndefined(unsigned ID) { 443 ExtendedType *TopLevelParser::getDummyUndefinedExtendedType() {
300 std::string Buffer; 444 ExtendedType *Ty = &DummyUndefinedExtendedType;
301 raw_string_ostream StrBuf(Buffer); 445 // Note: Reset to make sure we wipe out any changes (accidentally)
Jim Stichnoth 2014/10/06 22:48:52 As we discussed in person, try to get rid of const
Karl 2014/10/07 20:15:59 Done.
302 StrBuf << "Can't find type for type id: " << ID; 446 // made to it.
303 Error(StrBuf.str()); 447 Ty->resetToUndefined();
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; 448 return Ty;
310 } 449 }
311 450
312 void TopLevelParser::reportBadSetTypeID(unsigned ID, Type *Ty) { 451 void TopLevelParser::reportBadTypeIDAs(unsigned ID, const ExtendedType *Ty,
452 ExtendedType::TypeKind WantedType) {
313 std::string Buffer; 453 std::string Buffer;
314 raw_string_ostream StrBuf(Buffer); 454 raw_string_ostream StrBuf(Buffer);
315 if (ID >= TypeIDValues.size()) { 455 if (Ty == nullptr) {
316 StrBuf << "Type index " << ID << " out of range: can't install."; 456 StrBuf << "Can't find extend type for type id: " << ID;
317 } else { 457 } else {
318 // Must be case that index already defined. 458 StrBuf << "Type id " << ID << " not " << WantedType << ". Found: " << *Ty;
319 StrBuf << "Type index " << ID << " defined as " << *TypeIDValues[ID]
320 << " and " << *Ty << ".";
321 } 459 }
322 Error(StrBuf.str()); 460 Error(StrBuf.str());
323 } 461 }
324 462
325 Ice::Type TopLevelParser::convertToIceTypeError(Type *LLVMTy) { 463 Ice::Type TopLevelParser::convertToIceTypeError(Type *LLVMTy) {
326 std::string Buffer; 464 std::string Buffer;
327 raw_string_ostream StrBuf(Buffer); 465 raw_string_ostream StrBuf(Buffer);
328 StrBuf << "Invalid LLVM type: " << *LLVMTy; 466 StrBuf << "Invalid LLVM type: " << *LLVMTy;
329 Error(StrBuf.str()); 467 Error(StrBuf.str());
330 return Ice::IceType_void; 468 return Ice::IceType_void;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 // Default implementation. Reports that the record is not 511 // Default implementation. Reports that the record is not
374 // understood. 512 // understood.
375 void ProcessRecord() override; 513 void ProcessRecord() override;
376 514
377 // Checks if the size of the record is Size. Return true if valid. 515 // Checks if the size of the record is Size. Return true if valid.
378 // Otherwise generates an error and returns false. 516 // Otherwise generates an error and returns false.
379 bool isValidRecordSize(unsigned Size, const char *RecordName) { 517 bool isValidRecordSize(unsigned Size, const char *RecordName) {
380 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); 518 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
381 if (Values.size() == Size) 519 if (Values.size() == Size)
382 return true; 520 return true;
383 ReportRecordSizeError(Size, RecordName, NULL); 521 ReportRecordSizeError(Size, RecordName, nullptr);
384 return false; 522 return false;
385 } 523 }
386 524
387 // Checks if the size of the record is at least as large as the 525 // Checks if the size of the record is at least as large as the
388 // LowerLimit. Returns true if valid. Otherwise generates an error 526 // LowerLimit. Returns true if valid. Otherwise generates an error
389 // and returns false. 527 // and returns false.
390 bool isValidRecordSizeAtLeast(unsigned LowerLimit, const char *RecordName) { 528 bool isValidRecordSizeAtLeast(unsigned LowerLimit, const char *RecordName) {
391 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); 529 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
392 if (Values.size() >= LowerLimit) 530 if (Values.size() >= LowerLimit)
393 return true; 531 return true;
(...skipping 17 matching lines...) Expand all
411 // valid. Otherwise generates an error and returns false. 549 // valid. Otherwise generates an error and returns false.
412 bool isValidRecordSizeInRange(unsigned LowerLimit, unsigned UpperLimit, 550 bool isValidRecordSizeInRange(unsigned LowerLimit, unsigned UpperLimit,
413 const char *RecordName) { 551 const char *RecordName) {
414 return isValidRecordSizeAtLeast(LowerLimit, RecordName) || 552 return isValidRecordSizeAtLeast(LowerLimit, RecordName) ||
415 isValidRecordSizeAtMost(UpperLimit, RecordName); 553 isValidRecordSizeAtMost(UpperLimit, RecordName);
416 } 554 }
417 555
418 private: 556 private:
419 /// Generates a record size error. ExpectedSize is the number 557 /// Generates a record size error. ExpectedSize is the number
420 /// of elements expected. RecordName is the name of the kind of 558 /// of elements expected. RecordName is the name of the kind of
421 /// record that has incorrect size. ContextMessage (if not NULL) 559 /// record that has incorrect size. ContextMessage (if not nullptr)
422 /// is appended to "record expects" to describe how ExpectedSize 560 /// is appended to "record expects" to describe how ExpectedSize
423 /// should be interpreted. 561 /// should be interpreted.
424 void ReportRecordSizeError(unsigned ExpectedSize, const char *RecordName, 562 void ReportRecordSizeError(unsigned ExpectedSize, const char *RecordName,
425 const char *ContextMessage); 563 const char *ContextMessage);
426 }; 564 };
427 565
428 void BlockParserBaseClass::ReportRecordSizeError(unsigned ExpectedSize, 566 void BlockParserBaseClass::ReportRecordSizeError(unsigned ExpectedSize,
429 const char *RecordName, 567 const char *RecordName,
430 const char *ContextMessage) { 568 const char *ContextMessage) {
431 std::string Buffer; 569 std::string Buffer;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 : BlockParserBaseClass(BlockID, EnclosingParser), NextTypeId(0) {} 605 : BlockParserBaseClass(BlockID, EnclosingParser), NextTypeId(0) {}
468 606
469 ~TypesParser() override {} 607 ~TypesParser() override {}
470 608
471 private: 609 private:
472 // The type ID that will be associated with the next type defining 610 // The type ID that will be associated with the next type defining
473 // record in the types block. 611 // record in the types block.
474 unsigned NextTypeId; 612 unsigned NextTypeId;
475 613
476 void ProcessRecord() override; 614 void ProcessRecord() override;
615
616 void setNextTypeIDAsSimpleType(Ice::Type Ty) {
617 Context->getUndefinedTypeByID(NextTypeId++)->setAsSimpleType(Ty);
618 }
477 }; 619 };
478 620
479 void TypesParser::ProcessRecord() { 621 void TypesParser::ProcessRecord() {
480 Type *Ty = NULL;
481 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); 622 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
482 switch (Record.GetCode()) { 623 switch (Record.GetCode()) {
483 case naclbitc::TYPE_CODE_NUMENTRY: 624 case naclbitc::TYPE_CODE_NUMENTRY:
484 // NUMENTRY: [numentries] 625 // NUMENTRY: [numentries]
485 if (!isValidRecordSize(1, "Type count")) 626 if (!isValidRecordSize(1, "Type count"))
486 return; 627 return;
487 Context->resizeTypeIDValues(Values[0]); 628 Context->resizeTypeIDValues(Values[0]);
488 return; 629 return;
489 case naclbitc::TYPE_CODE_VOID: 630 case naclbitc::TYPE_CODE_VOID:
490 // VOID 631 // VOID
491 if (!isValidRecordSize(0, "Type void")) 632 if (!isValidRecordSize(0, "Type void"))
492 return; 633 return;
493 Ty = Context->convertToLLVMType(Ice::IceType_void); 634 setNextTypeIDAsSimpleType(Ice::IceType_void);
494 break; 635 return;
495 case naclbitc::TYPE_CODE_FLOAT: 636 case naclbitc::TYPE_CODE_FLOAT:
496 // FLOAT 637 // FLOAT
497 if (!isValidRecordSize(0, "Type float")) 638 if (!isValidRecordSize(0, "Type float"))
498 return; 639 return;
499 Ty = Context->convertToLLVMType(Ice::IceType_f32); 640 setNextTypeIDAsSimpleType(Ice::IceType_f32);
500 break; 641 return;
501 case naclbitc::TYPE_CODE_DOUBLE: 642 case naclbitc::TYPE_CODE_DOUBLE:
502 // DOUBLE 643 // DOUBLE
503 if (!isValidRecordSize(0, "Type double")) 644 if (!isValidRecordSize(0, "Type double"))
504 return; 645 return;
505 Ty = Context->convertToLLVMType(Ice::IceType_f64); 646 setNextTypeIDAsSimpleType(Ice::IceType_f64);
506 break; 647 return;
507 case naclbitc::TYPE_CODE_INTEGER: 648 case naclbitc::TYPE_CODE_INTEGER:
508 // INTEGER: [width] 649 // INTEGER: [width]
509 if (!isValidRecordSize(1, "Type integer")) 650 if (!isValidRecordSize(1, "Type integer"))
510 return; 651 return;
511 Ty = Context->getLLVMIntegerType(Values[0]); 652 switch (Values[0]) {
512 if (Ty == NULL) { 653 case 1:
654 setNextTypeIDAsSimpleType(Ice::IceType_i1);
655 return;
656 case 8:
657 setNextTypeIDAsSimpleType(Ice::IceType_i8);
658 return;
659 case 16:
660 setNextTypeIDAsSimpleType(Ice::IceType_i16);
661 return;
662 case 32:
663 setNextTypeIDAsSimpleType(Ice::IceType_i32);
664 return;
665 case 64:
666 setNextTypeIDAsSimpleType(Ice::IceType_i64);
667 return;
668 default:
669 break;
670 }
671 {
513 std::string Buffer; 672 std::string Buffer;
514 raw_string_ostream StrBuf(Buffer); 673 raw_string_ostream StrBuf(Buffer);
515 StrBuf << "Type integer record with invalid bitsize: " << Values[0]; 674 StrBuf << "Type integer record with invalid bitsize: " << Values[0];
516 Error(StrBuf.str()); 675 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 } 676 }
521 break; 677 return;
522 case naclbitc::TYPE_CODE_VECTOR: { 678 case naclbitc::TYPE_CODE_VECTOR: {
523 // VECTOR: [numelts, eltty] 679 // VECTOR: [numelts, eltty]
524 if (!isValidRecordSize(2, "Type vector")) 680 if (!isValidRecordSize(2, "Type vector"))
525 return; 681 return;
526 Type *BaseTy = Context->getTypeByID(Values[1]); 682 Ice::Type BaseTy = Context->getSimpleTypeByID(Values[1]);
527 Ty = Context->getLLVMVectorType(Values[0], 683 Ice::SizeT Size = Values[0];
528 Context->convertToIceType(BaseTy)); 684 switch (BaseTy) {
529 if (Ty == NULL) { 685 case Ice::IceType_i1:
686 switch (Size) {
687 case 4:
688 setNextTypeIDAsSimpleType(Ice::IceType_v4i1);
689 return;
690 case 8:
691 setNextTypeIDAsSimpleType(Ice::IceType_v8i1);
692 return;
693 case 16:
694 setNextTypeIDAsSimpleType(Ice::IceType_v16i1);
695 return;
696 default:
697 break;
698 }
699 break;
700 case Ice::IceType_i8:
701 if (Size == 16) {
702 setNextTypeIDAsSimpleType(Ice::IceType_v16i8);
703 return;
704 }
705 break;
706 case Ice::IceType_i16:
707 if (Size == 8) {
708 setNextTypeIDAsSimpleType(Ice::IceType_v8i16);
709 return;
710 }
711 break;
712 case Ice::IceType_i32:
713 if (Size == 4) {
714 setNextTypeIDAsSimpleType(Ice::IceType_v4i32);
715 return;
716 }
717 break;
718 case Ice::IceType_f32:
719 if (Size == 4) {
720 setNextTypeIDAsSimpleType(Ice::IceType_v4f32);
721 return;
722 }
723 break;
724 default:
725 break;
726 }
727 {
530 std::string Buffer; 728 std::string Buffer;
531 raw_string_ostream StrBuf(Buffer); 729 raw_string_ostream StrBuf(Buffer);
532 StrBuf << "Invalid type vector record: <" << Values[0] << " x " << *BaseTy 730 StrBuf << "Invalid type vector record: <" << Values[0] << " x " << BaseTy
533 << ">"; 731 << ">";
534 Error(StrBuf.str()); 732 Error(StrBuf.str());
535 Ty = Context->convertToLLVMType(Ice::IceType_void);
536 } 733 }
537 break; 734 return;
538 } 735 }
539 case naclbitc::TYPE_CODE_FUNCTION: { 736 case naclbitc::TYPE_CODE_FUNCTION: {
540 // FUNCTION: [vararg, retty, paramty x N] 737 // FUNCTION: [vararg, retty, paramty x N]
541 if (!isValidRecordSizeAtLeast(2, "Type signature")) 738 if (!isValidRecordSizeAtLeast(2, "Type signature"))
542 return; 739 return;
543 SmallVector<Type *, 8> ArgTys; 740 if (Values[0])
741 Error("Function type can't define varargs");
742 ExtendedType *Ty = Context->getUndefinedTypeByID(NextTypeId++);
743 Ty->setAsFunctionType();
744 FuncSigExtendedType *FcnTy = cast<FuncSigExtendedType>(Ty);
745 FcnTy->setReturnType(Context->getSimpleTypeByID(Values[1]));
544 for (unsigned i = 2, e = Values.size(); i != e; ++i) { 746 for (unsigned i = 2, e = Values.size(); i != e; ++i) {
545 ArgTys.push_back(Context->getTypeByID(Values[i])); 747 // Check that type void not used as argument type.
748 // Note: PNaCl restrictions can't be checked until we
749 // know the name, because we have to check for intrinsic signatures.
750 Ice::Type ArgTy = Context->getSimpleTypeByID(Values[i]);
751 if (ArgTy == Ice::IceType_void) {
752 std::string Buffer;
753 raw_string_ostream StrBuf(Buffer);
754 StrBuf << "Type for parameter " << (i - 1)
755 << " not valid. Found: " << ArgTy;
756 // TODO(kschimpf) Remove error recovery once implementation complete.
757 ArgTy = Ice::IceType_i32;
758 }
759 FcnTy->appendArgType(ArgTy);
546 } 760 }
547 Ty = FunctionType::get(Context->getTypeByID(Values[1]), ArgTys, Values[0]); 761 return;
548 break;
549 } 762 }
550 default: 763 default:
551 BlockParserBaseClass::ProcessRecord(); 764 BlockParserBaseClass::ProcessRecord();
552 return; 765 return;
553 } 766 }
554 // If Ty not defined, assume error. Use void as filler. 767 // We shoudn't reach here!
555 if (Ty == NULL) 768 assert(false);
556 Ty = Context->convertToLLVMType(Ice::IceType_void);
557 Context->setTypeID(NextTypeId++, Ty);
558 } 769 }
559 770
560 /// Parses the globals block (i.e. global variables). 771 /// Parses the globals block (i.e. global variables).
561 class GlobalsParser : public BlockParserBaseClass { 772 class GlobalsParser : public BlockParserBaseClass {
562 public: 773 public:
563 GlobalsParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser) 774 GlobalsParser(unsigned BlockID, BlockParserBaseClass *EnclosingParser)
564 : BlockParserBaseClass(BlockID, EnclosingParser), InitializersNeeded(0), 775 : BlockParserBaseClass(BlockID, EnclosingParser), InitializersNeeded(0),
565 Alignment(1), IsConstant(false) { 776 Alignment(1), IsConstant(false) {
566 NextGlobalID = Context->getNumFunctionIDs(); 777 NextGlobalID = Context->getNumFunctionIDs();
567 } 778 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 if (InitializersNeeded <= Initializers.size()) { 840 if (InitializersNeeded <= Initializers.size()) {
630 Error(std::string(RecordName) + 841 Error(std::string(RecordName) +
631 " record: Too many initializers, ignoring."); 842 " record: Too many initializers, ignoring.");
632 } 843 }
633 } 844 }
634 845
635 // Takes the initializers (and other parser state values) and 846 // Takes the initializers (and other parser state values) and
636 // installs a global variable (with the initializers) into the list 847 // installs a global variable (with the initializers) into the list
637 // of ValueIDs. 848 // of ValueIDs.
638 void installGlobalVar() { 849 void installGlobalVar() {
639 Constant *Init = NULL; 850 Constant *Init = nullptr;
640 switch (Initializers.size()) { 851 switch (Initializers.size()) {
641 case 0: 852 case 0:
642 Error("No initializer for global variable in global vars block"); 853 Error("No initializer for global variable in global vars block");
643 return; 854 return;
644 case 1: 855 case 1:
645 Init = Initializers[0]; 856 Init = Initializers[0];
646 break; 857 break;
647 default: 858 default:
648 Init = ConstantStruct::getAnon(Context->getLLVMContext(), Initializers, 859 Init = ConstantStruct::getAnon(Context->getLLVMContext(), Initializers,
649 true); 860 true);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 Constant *Init = ConstantDataArray::get( 944 Constant *Init = ConstantDataArray::get(
734 Context->getLLVMContext(), ArrayRef<uint8_t>(Buf.data(), Buf.size())); 945 Context->getLLVMContext(), ArrayRef<uint8_t>(Buf.data(), Buf.size()));
735 Initializers.push_back(Init); 946 Initializers.push_back(Init);
736 break; 947 break;
737 } 948 }
738 case naclbitc::GLOBALVAR_RELOC: { 949 case naclbitc::GLOBALVAR_RELOC: {
739 // RELOC: [val, [addend]] 950 // RELOC: [val, [addend]]
740 if (!isValidRecordSizeInRange(1, 2, "Globals reloc")) 951 if (!isValidRecordSizeInRange(1, 2, "Globals reloc"))
741 return; 952 return;
742 Constant *BaseVal = Context->getOrCreateGlobalVarRef(Values[0]); 953 Constant *BaseVal = Context->getOrCreateGlobalVarRef(Values[0]);
743 if (BaseVal == NULL) { 954 if (BaseVal == nullptr) {
744 std::string Buffer; 955 std::string Buffer;
745 raw_string_ostream StrBuf(Buffer); 956 raw_string_ostream StrBuf(Buffer);
746 StrBuf << "Can't find global relocation value: " << Values[0]; 957 StrBuf << "Can't find global relocation value: " << Values[0];
747 Error(StrBuf.str()); 958 Error(StrBuf.str());
748 return; 959 return;
749 } 960 }
750 Type *IntPtrType = Context->convertToLLVMType(Context->getIcePointerType()); 961 Type *IntPtrType = Context->convertToLLVMType(Context->getIcePointerType());
751 Constant *Val = ConstantExpr::getPtrToInt(BaseVal, IntPtrType); 962 Constant *Val = ConstantExpr::getPtrToInt(BaseVal, IntPtrType);
752 if (Values.size() == 2) { 963 if (Values.size() == 2) {
753 Val = ConstantExpr::getAdd(Val, ConstantInt::get(IntPtrType, Values[1])); 964 Val = ConstantExpr::getAdd(Val, ConstantInt::get(IntPtrType, Values[1]));
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 return Func->makeVariable(Ty); 1160 return Func->makeVariable(Ty);
950 } 1161 }
951 1162
952 // Generates the next available local variable using the given type. 1163 // Generates the next available local variable using the given type.
953 Ice::Variable *getNextInstVar(Ice::Type Ty) { 1164 Ice::Variable *getNextInstVar(Ice::Type Ty) {
954 assert(NextLocalInstIndex >= CachedNumGlobalValueIDs); 1165 assert(NextLocalInstIndex >= CachedNumGlobalValueIDs);
955 // Before creating one, see if a forwardtyperef has already defined it. 1166 // Before creating one, see if a forwardtyperef has already defined it.
956 uint32_t LocalIndex = NextLocalInstIndex - CachedNumGlobalValueIDs; 1167 uint32_t LocalIndex = NextLocalInstIndex - CachedNumGlobalValueIDs;
957 if (LocalIndex < LocalOperands.size()) { 1168 if (LocalIndex < LocalOperands.size()) {
958 Ice::Operand *Op = LocalOperands[LocalIndex]; 1169 Ice::Operand *Op = LocalOperands[LocalIndex];
959 if (Op != NULL) { 1170 if (Op != nullptr) {
960 if (Ice::Variable *Var = dyn_cast<Ice::Variable>(Op)) { 1171 if (Ice::Variable *Var = dyn_cast<Ice::Variable>(Op)) {
961 if (Var->getType() == Ty) { 1172 if (Var->getType() == Ty) {
962 ++NextLocalInstIndex; 1173 ++NextLocalInstIndex;
963 return Var; 1174 return Var;
964 } 1175 }
965 } 1176 }
966 std::string Buffer; 1177 std::string Buffer;
967 raw_string_ostream StrBuf(Buffer); 1178 raw_string_ostream StrBuf(Buffer);
968 StrBuf << "Illegal forward referenced instruction (" 1179 StrBuf << "Illegal forward referenced instruction ("
969 << NextLocalInstIndex << "): " << *Op; 1180 << NextLocalInstIndex << "): " << *Op;
(...skipping 30 matching lines...) Expand all
1000 } 1211 }
1001 uint32_t LocalIndex = Index - CachedNumGlobalValueIDs; 1212 uint32_t LocalIndex = Index - CachedNumGlobalValueIDs;
1002 if (LocalIndex >= LocalOperands.size()) { 1213 if (LocalIndex >= LocalOperands.size()) {
1003 std::string Buffer; 1214 std::string Buffer;
1004 raw_string_ostream StrBuf(Buffer); 1215 raw_string_ostream StrBuf(Buffer);
1005 StrBuf << "Value index " << Index << " not defined!"; 1216 StrBuf << "Value index " << Index << " not defined!";
1006 Error(StrBuf.str()); 1217 Error(StrBuf.str());
1007 report_fatal_error("Unable to continue"); 1218 report_fatal_error("Unable to continue");
1008 } 1219 }
1009 Ice::Operand *Op = LocalOperands[LocalIndex]; 1220 Ice::Operand *Op = LocalOperands[LocalIndex];
1010 if (Op == NULL) { 1221 if (Op == nullptr) {
1011 std::string Buffer; 1222 std::string Buffer;
1012 raw_string_ostream StrBuf(Buffer); 1223 raw_string_ostream StrBuf(Buffer);
1013 StrBuf << "Value index " << Index << " not defined!"; 1224 StrBuf << "Value index " << Index << " not defined!";
1014 Error(StrBuf.str()); 1225 Error(StrBuf.str());
1015 report_fatal_error("Unable to continue"); 1226 report_fatal_error("Unable to continue");
1016 } 1227 }
1017 return Op; 1228 return Op;
1018 } 1229 }
1019 1230
1020 // Sets element Index (in the local operands list) to Op. 1231 // Sets element Index (in the local operands list) to Op.
1021 void setOperand(uint32_t Index, Ice::Operand *Op) { 1232 void setOperand(uint32_t Index, Ice::Operand *Op) {
1022 assert(Op); 1233 assert(Op);
1023 // Check if simple push works. 1234 // Check if simple push works.
1024 uint32_t LocalIndex = Index - CachedNumGlobalValueIDs; 1235 uint32_t LocalIndex = Index - CachedNumGlobalValueIDs;
1025 if (LocalIndex == LocalOperands.size()) { 1236 if (LocalIndex == LocalOperands.size()) {
1026 LocalOperands.push_back(Op); 1237 LocalOperands.push_back(Op);
1027 return; 1238 return;
1028 } 1239 }
1029 1240
1030 // Must be forward reference, expand vector to accommodate. 1241 // Must be forward reference, expand vector to accommodate.
1031 if (LocalIndex >= LocalOperands.size()) 1242 if (LocalIndex >= LocalOperands.size())
1032 LocalOperands.resize(LocalIndex + 1); 1243 LocalOperands.resize(LocalIndex + 1);
1033 1244
1034 // If element not defined, set it. 1245 // If element not defined, set it.
1035 Ice::Operand *OldOp = LocalOperands[LocalIndex]; 1246 Ice::Operand *OldOp = LocalOperands[LocalIndex];
1036 if (OldOp == NULL) { 1247 if (OldOp == nullptr) {
1037 LocalOperands[LocalIndex] = Op; 1248 LocalOperands[LocalIndex] = Op;
1038 return; 1249 return;
1039 } 1250 }
1040 1251
1041 // See if forward reference matches. 1252 // See if forward reference matches.
1042 if (OldOp == Op) 1253 if (OldOp == Op)
1043 return; 1254 return;
1044 1255
1045 // Error has occurred. 1256 // Error has occurred.
1046 std::string Buffer; 1257 std::string Buffer;
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
1466 return; 1677 return;
1467 CurrentNode->appendInst(Ice::InstArithmetic::create( 1678 CurrentNode->appendInst(Ice::InstArithmetic::create(
1468 Func, Opcode, getNextInstVar(Type1), Op1, Op2)); 1679 Func, Opcode, getNextInstVar(Type1), Op1, Op2));
1469 break; 1680 break;
1470 } 1681 }
1471 case naclbitc::FUNC_CODE_INST_CAST: { 1682 case naclbitc::FUNC_CODE_INST_CAST: {
1472 // CAST: [opval, destty, castopc] 1683 // CAST: [opval, destty, castopc]
1473 if (!isValidRecordSize(3, "function block cast")) 1684 if (!isValidRecordSize(3, "function block cast"))
1474 return; 1685 return;
1475 Ice::Operand *Src = getRelativeOperand(Values[0], BaseIndex); 1686 Ice::Operand *Src = getRelativeOperand(Values[0], BaseIndex);
1476 Type *CastType = Context->getTypeByID(Values[1]); 1687 Ice::Type CastType = Context->getSimpleTypeByID(Values[1]);
1477 Instruction::CastOps LLVMCastOp; 1688 Instruction::CastOps LLVMCastOp;
1478 Ice::InstCast::OpKind CastKind; 1689 Ice::InstCast::OpKind CastKind;
1479 if (!naclbitc::DecodeCastOpcode(Values[2], LLVMCastOp) || 1690 if (!naclbitc::DecodeCastOpcode(Values[2], LLVMCastOp) ||
1480 !convertLLVMCastOpToIceOp(LLVMCastOp, CastKind)) { 1691 !convertLLVMCastOpToIceOp(LLVMCastOp, CastKind)) {
1481 std::string Buffer; 1692 std::string Buffer;
1482 raw_string_ostream StrBuf(Buffer); 1693 raw_string_ostream StrBuf(Buffer);
1483 StrBuf << "Cast opcode not understood: " << Values[2]; 1694 StrBuf << "Cast opcode not understood: " << Values[2];
1484 Error(StrBuf.str()); 1695 Error(StrBuf.str());
1485 return; 1696 return;
1486 } 1697 }
1487 Type *SrcType = Context->convertToLLVMType(Src->getType()); 1698 Ice::Type SrcType = Src->getType();
1488 if (!CastInst::castIsValid(LLVMCastOp, SrcType, CastType)) { 1699 if (!CastInst::castIsValid(LLVMCastOp, Context->convertToLLVMType(SrcType),
1700 Context->convertToLLVMType(CastType))) {
1489 std::string Buffer; 1701 std::string Buffer;
1490 raw_string_ostream StrBuf(Buffer); 1702 raw_string_ostream StrBuf(Buffer);
1491 StrBuf << "Illegal cast: " << Instruction::getOpcodeName(LLVMCastOp) 1703 StrBuf << "Illegal cast: " << Instruction::getOpcodeName(LLVMCastOp)
1492 << " " << *SrcType << " to " << *CastType; 1704 << " " << SrcType << " to " << CastType;
1493 Error(StrBuf.str()); 1705 Error(StrBuf.str());
1494 return; 1706 return;
1495 } 1707 }
1496 CurrentNode->appendInst(Ice::InstCast::create( 1708 CurrentNode->appendInst(
1497 Func, CastKind, getNextInstVar(Context->convertToIceType(CastType)), 1709 Ice::InstCast::create(Func, CastKind, getNextInstVar(CastType), Src));
1498 Src));
1499 break; 1710 break;
1500 } 1711 }
1501 case naclbitc::FUNC_CODE_INST_VSELECT: { 1712 case naclbitc::FUNC_CODE_INST_VSELECT: {
1502 // VSELECT: [opval, opval, pred] 1713 // VSELECT: [opval, opval, pred]
1503 Ice::Operand *ThenVal = getRelativeOperand(Values[0], BaseIndex); 1714 Ice::Operand *ThenVal = getRelativeOperand(Values[0], BaseIndex);
1504 Ice::Type ThenType = ThenVal->getType(); 1715 Ice::Type ThenType = ThenVal->getType();
1505 Ice::Operand *ElseVal = getRelativeOperand(Values[1], BaseIndex); 1716 Ice::Operand *ElseVal = getRelativeOperand(Values[1], BaseIndex);
1506 Ice::Type ElseType = ElseVal->getType(); 1717 Ice::Type ElseType = ElseVal->getType();
1507 if (ThenType != ElseType) { 1718 if (ThenType != ElseType) {
1508 std::string Buffer; 1719 std::string Buffer;
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1671 CurrentNode->appendInst( 1882 CurrentNode->appendInst(
1672 Ice::InstRet::create(Func, getRelativeOperand(Values[0], BaseIndex))); 1883 Ice::InstRet::create(Func, getRelativeOperand(Values[0], BaseIndex)));
1673 } 1884 }
1674 InstIsTerminating = true; 1885 InstIsTerminating = true;
1675 break; 1886 break;
1676 } 1887 }
1677 case naclbitc::FUNC_CODE_INST_BR: { 1888 case naclbitc::FUNC_CODE_INST_BR: {
1678 if (Values.size() == 1) { 1889 if (Values.size() == 1) {
1679 // BR: [bb#] 1890 // BR: [bb#]
1680 Ice::CfgNode *Block = getBranchBasicBlock(Values[0]); 1891 Ice::CfgNode *Block = getBranchBasicBlock(Values[0]);
1681 if (Block == NULL) 1892 if (Block == nullptr)
1682 return; 1893 return;
1683 CurrentNode->appendInst(Ice::InstBr::create(Func, Block)); 1894 CurrentNode->appendInst(Ice::InstBr::create(Func, Block));
1684 } else { 1895 } else {
1685 // BR: [bb#, bb#, opval] 1896 // BR: [bb#, bb#, opval]
1686 if (!isValidRecordSize(3, "function block branch")) 1897 if (!isValidRecordSize(3, "function block branch"))
1687 return; 1898 return;
1688 Ice::Operand *Cond = getRelativeOperand(Values[2], BaseIndex); 1899 Ice::Operand *Cond = getRelativeOperand(Values[2], BaseIndex);
1689 if (Cond->getType() != Ice::IceType_i1) { 1900 if (Cond->getType() != Ice::IceType_i1) {
1690 std::string Buffer; 1901 std::string Buffer;
1691 raw_string_ostream StrBuf(Buffer); 1902 raw_string_ostream StrBuf(Buffer);
1692 StrBuf << "Branch condition " << *Cond << " not i1. Found: " 1903 StrBuf << "Branch condition " << *Cond << " not i1. Found: "
1693 << Cond->getType(); 1904 << Cond->getType();
1694 Error(StrBuf.str()); 1905 Error(StrBuf.str());
1695 return; 1906 return;
1696 } 1907 }
1697 Ice::CfgNode *ThenBlock = getBranchBasicBlock(Values[0]); 1908 Ice::CfgNode *ThenBlock = getBranchBasicBlock(Values[0]);
1698 Ice::CfgNode *ElseBlock = getBranchBasicBlock(Values[1]); 1909 Ice::CfgNode *ElseBlock = getBranchBasicBlock(Values[1]);
1699 if (ThenBlock == NULL || ElseBlock == NULL) 1910 if (ThenBlock == nullptr || ElseBlock == nullptr)
1700 return; 1911 return;
1701 CurrentNode->appendInst( 1912 CurrentNode->appendInst(
1702 Ice::InstBr::create(Func, Cond, ThenBlock, ElseBlock)); 1913 Ice::InstBr::create(Func, Cond, ThenBlock, ElseBlock));
1703 } 1914 }
1704 InstIsTerminating = true; 1915 InstIsTerminating = true;
1705 break; 1916 break;
1706 } 1917 }
1707 case naclbitc::FUNC_CODE_INST_SWITCH: { 1918 case naclbitc::FUNC_CODE_INST_SWITCH: {
1708 // SWITCH: [Condty, Cond, BbIndex, NumCases Case ...] 1919 // SWITCH: [Condty, Cond, BbIndex, NumCases Case ...]
1709 // where Case = [1, 1, Value, BbIndex]. 1920 // where Case = [1, 1, Value, BbIndex].
1710 // 1921 //
1711 // Note: Unlike most instructions, we don't infer the type of 1922 // Note: Unlike most instructions, we don't infer the type of
1712 // Cond, but provide it as a separate field. There are also 1923 // Cond, but provide it as a separate field. There are also
1713 // unnecesary data fields (i.e. constants 1). These were not 1924 // unnecesary data fields (i.e. constants 1). These were not
1714 // cleaned up in PNaCl bitcode because the bitcode format was 1925 // cleaned up in PNaCl bitcode because the bitcode format was
1715 // already frozen when the problem was noticed. 1926 // already frozen when the problem was noticed.
1716 if (!isValidRecordSizeAtLeast(4, "function block switch")) 1927 if (!isValidRecordSizeAtLeast(4, "function block switch"))
1717 return; 1928 return;
1718 Ice::Type CondTy = 1929 Ice::Type CondTy = Context->getSimpleTypeByID(Values[0]);
1719 Context->convertToIceType(Context->getTypeByID(Values[0]));
1720 if (!Ice::isScalarIntegerType(CondTy)) { 1930 if (!Ice::isScalarIntegerType(CondTy)) {
1721 std::string Buffer; 1931 std::string Buffer;
1722 raw_string_ostream StrBuf(Buffer); 1932 raw_string_ostream StrBuf(Buffer);
1723 StrBuf << "Case condition must be non-wide integer. Found: " << CondTy; 1933 StrBuf << "Case condition must be non-wide integer. Found: " << CondTy;
1724 Error(StrBuf.str()); 1934 Error(StrBuf.str());
1725 return; 1935 return;
1726 } 1936 }
1727 Ice::SizeT BitWidth = Ice::getScalarIntBitWidth(CondTy); 1937 Ice::SizeT BitWidth = Ice::getScalarIntBitWidth(CondTy);
1728 Ice::Operand *Cond = getRelativeOperand(Values[1], BaseIndex); 1938 Ice::Operand *Cond = getRelativeOperand(Values[1], BaseIndex);
1729 if (CondTy != Cond->getType()) { 1939 if (CondTy != Cond->getType()) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1777 if (!isValidRecordSizeAtLeast(3, "function block phi")) 1987 if (!isValidRecordSizeAtLeast(3, "function block phi"))
1778 return; 1988 return;
1779 if ((Values.size() & 0x1) == 0) { 1989 if ((Values.size() & 0x1) == 0) {
1780 // Not an odd number of values. 1990 // Not an odd number of values.
1781 std::string Buffer; 1991 std::string Buffer;
1782 raw_string_ostream StrBuf(Buffer); 1992 raw_string_ostream StrBuf(Buffer);
1783 StrBuf << "function block phi record size not valid: " << Values.size(); 1993 StrBuf << "function block phi record size not valid: " << Values.size();
1784 Error(StrBuf.str()); 1994 Error(StrBuf.str());
1785 return; 1995 return;
1786 } 1996 }
1787 Ice::Type Ty = Context->convertToIceType(Context->getTypeByID(Values[0])); 1997 Ice::Type Ty = Context->getSimpleTypeByID(Values[0]);
1788 if (Ty == Ice::IceType_void) { 1998 if (Ty == Ice::IceType_void) {
1789 Error("Phi record using type void not allowed"); 1999 Error("Phi record using type void not allowed");
1790 return; 2000 return;
1791 } 2001 }
1792 Ice::Variable *Dest = getNextInstVar(Ty); 2002 Ice::Variable *Dest = getNextInstVar(Ty);
1793 Ice::InstPhi *Phi = Ice::InstPhi::create(Func, Values.size() >> 1, Dest); 2003 Ice::InstPhi *Phi = Ice::InstPhi::create(Func, Values.size() >> 1, Dest);
1794 for (unsigned i = 1; i < Values.size(); i += 2) { 2004 for (unsigned i = 1; i < Values.size(); i += 2) {
1795 Ice::Operand *Op = 2005 Ice::Operand *Op =
1796 getRelativeOperand(NaClDecodeSignRotatedValue(Values[i]), BaseIndex); 2006 getRelativeOperand(NaClDecodeSignRotatedValue(Values[i]), BaseIndex);
1797 if (Op->getType() != Ty) { 2007 if (Op->getType() != Ty) {
(...skipping 30 matching lines...) Expand all
1828 } 2038 }
1829 case naclbitc::FUNC_CODE_INST_LOAD: { 2039 case naclbitc::FUNC_CODE_INST_LOAD: {
1830 // LOAD: [address, align, ty] 2040 // LOAD: [address, align, ty]
1831 if (!isValidRecordSize(3, "function block load")) 2041 if (!isValidRecordSize(3, "function block load"))
1832 return; 2042 return;
1833 Ice::Operand *Address = getRelativeOperand(Values[0], BaseIndex); 2043 Ice::Operand *Address = getRelativeOperand(Values[0], BaseIndex);
1834 if (!isValidPointerType(Address, "Load")) 2044 if (!isValidPointerType(Address, "Load"))
1835 return; 2045 return;
1836 unsigned Alignment; 2046 unsigned Alignment;
1837 extractAlignment("Load", Values[1], Alignment); 2047 extractAlignment("Load", Values[1], Alignment);
1838 Ice::Type Ty = Context->convertToIceType(Context->getTypeByID(Values[2])); 2048 Ice::Type Ty = Context->getSimpleTypeByID(Values[2]);
1839 if (!isValidLoadStoreAlignment(Alignment, Ty, "Load")) 2049 if (!isValidLoadStoreAlignment(Alignment, Ty, "Load"))
1840 return; 2050 return;
1841 CurrentNode->appendInst( 2051 CurrentNode->appendInst(
1842 Ice::InstLoad::create(Func, getNextInstVar(Ty), Address, Alignment)); 2052 Ice::InstLoad::create(Func, getNextInstVar(Ty), Address, Alignment));
1843 break; 2053 break;
1844 } 2054 }
1845 case naclbitc::FUNC_CODE_INST_STORE: { 2055 case naclbitc::FUNC_CODE_INST_STORE: {
1846 // STORE: [address, value, align] 2056 // STORE: [address, value, align]
1847 if (!isValidRecordSize(3, "function block store")) 2057 if (!isValidRecordSize(3, "function block store"))
1848 return; 2058 return;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1890 << " not understood."; 2100 << " not understood.";
1891 Error(StrBuf.str()); 2101 Error(StrBuf.str());
1892 return; 2102 return;
1893 } 2103 }
1894 bool IsTailCall = static_cast<bool>(CCInfo & 1); 2104 bool IsTailCall = static_cast<bool>(CCInfo & 1);
1895 2105
1896 // Extract out the called function and its return type. 2106 // Extract out the called function and its return type.
1897 uint32_t CalleeIndex = convertRelativeToAbsIndex(Values[1], BaseIndex); 2107 uint32_t CalleeIndex = convertRelativeToAbsIndex(Values[1], BaseIndex);
1898 Ice::Operand *Callee = getOperand(CalleeIndex); 2108 Ice::Operand *Callee = getOperand(CalleeIndex);
1899 Ice::Type ReturnType = Ice::IceType_void; 2109 Ice::Type ReturnType = Ice::IceType_void;
1900 const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = NULL; 2110 const Ice::Intrinsics::FullIntrinsicInfo *IntrinsicInfo = nullptr;
1901 if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) { 2111 if (Record.GetCode() == naclbitc::FUNC_CODE_INST_CALL) {
1902 Function *Fcn = 2112 Function *Fcn =
1903 dyn_cast<Function>(Context->getGlobalValueByID(CalleeIndex)); 2113 dyn_cast<Function>(Context->getGlobalValueByID(CalleeIndex));
1904 if (Fcn == NULL) { 2114 if (Fcn == nullptr) {
1905 std::string Buffer; 2115 std::string Buffer;
1906 raw_string_ostream StrBuf(Buffer); 2116 raw_string_ostream StrBuf(Buffer);
1907 StrBuf << "Function call to non-function: " << *Callee; 2117 StrBuf << "Function call to non-function: " << *Callee;
1908 Error(StrBuf.str()); 2118 Error(StrBuf.str());
1909 return; 2119 return;
1910 } 2120 }
1911 2121
1912 FunctionType *FcnTy = Fcn->getFunctionType(); 2122 FunctionType *FcnTy = Fcn->getFunctionType();
1913 ReturnType = Context->convertToIceType(FcnTy->getReturnType()); 2123 ReturnType = Context->convertToIceType(FcnTy->getReturnType());
1914 2124
1915 // Check if this direct call is to an Intrinsic (starts with "llvm.") 2125 // Check if this direct call is to an Intrinsic (starts with "llvm.")
1916 static Ice::IceString LLVMPrefix("llvm."); 2126 static Ice::IceString LLVMPrefix("llvm.");
1917 Ice::IceString Name = Fcn->getName(); 2127 Ice::IceString Name = Fcn->getName();
1918 if (isStringPrefix(Name, LLVMPrefix)) { 2128 if (isStringPrefix(Name, LLVMPrefix)) {
1919 Ice::IceString Suffix = Name.substr(LLVMPrefix.size()); 2129 Ice::IceString Suffix = Name.substr(LLVMPrefix.size());
1920 IntrinsicInfo = 2130 IntrinsicInfo =
1921 getTranslator().getContext()->getIntrinsicsInfo().find(Suffix); 2131 getTranslator().getContext()->getIntrinsicsInfo().find(Suffix);
1922 if (!IntrinsicInfo) { 2132 if (!IntrinsicInfo) {
1923 std::string Buffer; 2133 std::string Buffer;
1924 raw_string_ostream StrBuf(Buffer); 2134 raw_string_ostream StrBuf(Buffer);
1925 StrBuf << "Invalid PNaCl intrinsic call to " << Name; 2135 StrBuf << "Invalid PNaCl intrinsic call to " << Name;
1926 Error(StrBuf.str()); 2136 Error(StrBuf.str());
1927 return; 2137 return;
1928 } 2138 }
1929 } 2139 }
1930 } else { 2140 } else {
1931 ReturnType = Context->convertToIceType(Context->getTypeByID(Values[2])); 2141 ReturnType = Context->getSimpleTypeByID(Values[2]);
1932 } 2142 }
1933 2143
1934 // Create the call instruction. 2144 // Create the call instruction.
1935 Ice::Variable *Dest = 2145 Ice::Variable *Dest = (ReturnType == Ice::IceType_void)
1936 (ReturnType == Ice::IceType_void) ? NULL : getNextInstVar(ReturnType); 2146 ? nullptr
2147 : getNextInstVar(ReturnType);
1937 Ice::SizeT NumParams = Values.size() - ParamsStartIndex; 2148 Ice::SizeT NumParams = Values.size() - ParamsStartIndex;
1938 Ice::InstCall *Inst = NULL; 2149 Ice::InstCall *Inst = nullptr;
1939 if (IntrinsicInfo) { 2150 if (IntrinsicInfo) {
1940 Inst = 2151 Inst =
1941 Ice::InstIntrinsicCall::create(Func, NumParams, Dest, Callee, 2152 Ice::InstIntrinsicCall::create(Func, NumParams, Dest, Callee,
1942 IntrinsicInfo->Info); 2153 IntrinsicInfo->Info);
1943 } else { 2154 } else {
1944 Inst = Ice::InstCall::create(Func, NumParams, Dest, Callee, IsTailCall); 2155 Inst = Ice::InstCall::create(Func, NumParams, Dest, Callee, IsTailCall);
1945 } 2156 }
1946 2157
1947 // Add parameters. 2158 // Add parameters.
1948 for (Ice::SizeT ParamIndex = 0; ParamIndex < NumParams; ++ParamIndex) { 2159 for (Ice::SizeT ParamIndex = 0; ParamIndex < NumParams; ++ParamIndex) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1992 } 2203 }
1993 } 2204 }
1994 2205
1995 CurrentNode->appendInst(Inst); 2206 CurrentNode->appendInst(Inst);
1996 return; 2207 return;
1997 } 2208 }
1998 case naclbitc::FUNC_CODE_INST_FORWARDTYPEREF: { 2209 case naclbitc::FUNC_CODE_INST_FORWARDTYPEREF: {
1999 // FORWARDTYPEREF: [opval, ty] 2210 // FORWARDTYPEREF: [opval, ty]
2000 if (!isValidRecordSize(2, "function block forward type ref")) 2211 if (!isValidRecordSize(2, "function block forward type ref"))
2001 return; 2212 return;
2002 setOperand(Values[0], createInstVar(Context->convertToIceType( 2213 setOperand(Values[0], createInstVar(Context->getSimpleTypeByID(Values[1])));
2003 Context->getTypeByID(Values[1]))));
2004 break; 2214 break;
2005 } 2215 }
2006 default: 2216 default:
2007 // Generate error message! 2217 // Generate error message!
2008 BlockParserBaseClass::ProcessRecord(); 2218 BlockParserBaseClass::ProcessRecord();
2009 break; 2219 break;
2010 } 2220 }
2011 } 2221 }
2012 2222
2013 /// Parses constants within a function block. 2223 /// Parses constants within a function block.
(...skipping 28 matching lines...) Expand all
2042 } 2252 }
2043 }; 2253 };
2044 2254
2045 void ConstantsParser::ProcessRecord() { 2255 void ConstantsParser::ProcessRecord() {
2046 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues(); 2256 const NaClBitcodeRecord::RecordVector &Values = Record.GetValues();
2047 switch (Record.GetCode()) { 2257 switch (Record.GetCode()) {
2048 case naclbitc::CST_CODE_SETTYPE: { 2258 case naclbitc::CST_CODE_SETTYPE: {
2049 // SETTYPE: [typeid] 2259 // SETTYPE: [typeid]
2050 if (!isValidRecordSize(1, "constants block set type")) 2260 if (!isValidRecordSize(1, "constants block set type"))
2051 return; 2261 return;
2052 NextConstantType = 2262 NextConstantType = Context->getSimpleTypeByID(Values[0]);
2053 Context->convertToIceType(Context->getTypeByID(Values[0]));
2054 if (NextConstantType == Ice::IceType_void) 2263 if (NextConstantType == Ice::IceType_void)
2055 Error("constants block set type not allowed for void type"); 2264 Error("constants block set type not allowed for void type");
2056 return; 2265 return;
2057 } 2266 }
2058 case naclbitc::CST_CODE_UNDEF: { 2267 case naclbitc::CST_CODE_UNDEF: {
2059 // UNDEF 2268 // UNDEF
2060 if (!isValidRecordSize(0, "constants block undef")) 2269 if (!isValidRecordSize(0, "constants block undef"))
2061 return; 2270 return;
2062 if (!isValidNextConstantType()) 2271 if (!isValidNextConstantType())
2063 return; 2272 return;
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
2248 2457
2249 ~ModuleValuesymtabParser() override {} 2458 ~ModuleValuesymtabParser() override {}
2250 2459
2251 private: 2460 private:
2252 void setValueName(uint64_t Index, StringType &Name) override; 2461 void setValueName(uint64_t Index, StringType &Name) override;
2253 void setBbName(uint64_t Index, StringType &Name) override; 2462 void setBbName(uint64_t Index, StringType &Name) override;
2254 }; 2463 };
2255 2464
2256 void ModuleValuesymtabParser::setValueName(uint64_t Index, StringType &Name) { 2465 void ModuleValuesymtabParser::setValueName(uint64_t Index, StringType &Name) {
2257 Value *V = Context->getGlobalValueByID(Index); 2466 Value *V = Context->getGlobalValueByID(Index);
2258 if (V == NULL) { 2467 if (V == nullptr) {
2259 std::string Buffer; 2468 std::string Buffer;
2260 raw_string_ostream StrBuf(Buffer); 2469 raw_string_ostream StrBuf(Buffer);
2261 StrBuf << "Invalid global address ID in valuesymtab: " << Index; 2470 StrBuf << "Invalid global address ID in valuesymtab: " << Index;
2262 Error(StrBuf.str()); 2471 Error(StrBuf.str());
2263 return; 2472 return;
2264 } 2473 }
2265 V->setName(StringRef(Name.data(), Name.size())); 2474 V->setName(StringRef(Name.data(), Name.size()));
2266 } 2475 }
2267 2476
2268 void ModuleValuesymtabParser::setBbName(uint64_t Index, StringType &Name) { 2477 void ModuleValuesymtabParser::setBbName(uint64_t Index, StringType &Name) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2312 raw_string_ostream StrBuf(Buffer); 2521 raw_string_ostream StrBuf(Buffer);
2313 StrBuf << "Unknown bitstream version: " << Version; 2522 StrBuf << "Unknown bitstream version: " << Version;
2314 Error(StrBuf.str()); 2523 Error(StrBuf.str());
2315 } 2524 }
2316 return; 2525 return;
2317 } 2526 }
2318 case naclbitc::MODULE_CODE_FUNCTION: { 2527 case naclbitc::MODULE_CODE_FUNCTION: {
2319 // FUNCTION: [type, callingconv, isproto, linkage] 2528 // FUNCTION: [type, callingconv, isproto, linkage]
2320 if (!isValidRecordSize(4, "Function heading")) 2529 if (!isValidRecordSize(4, "Function heading"))
2321 return; 2530 return;
2322 Type *Ty = Context->getTypeByID(Values[0]); 2531 const Ice::FuncSigType &Ty = Context->getFuncSigTypeByID(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; 2532 CallingConv::ID CallingConv;
2332 if (!naclbitc::DecodeCallingConv(Values[1], CallingConv)) { 2533 if (!naclbitc::DecodeCallingConv(Values[1], CallingConv)) {
2333 std::string Buffer; 2534 std::string Buffer;
2334 raw_string_ostream StrBuf(Buffer); 2535 raw_string_ostream StrBuf(Buffer);
2335 StrBuf << "Function heading has unknown calling convention: " 2536 StrBuf << "Function heading has unknown calling convention: "
2336 << Values[1]; 2537 << Values[1];
2337 Error(StrBuf.str()); 2538 Error(StrBuf.str());
2338 return; 2539 return;
2339 } 2540 }
2340 GlobalValue::LinkageTypes Linkage; 2541 GlobalValue::LinkageTypes Linkage;
2341 if (!naclbitc::DecodeLinkage(Values[3], Linkage)) { 2542 if (!naclbitc::DecodeLinkage(Values[3], Linkage)) {
2342 std::string Buffer; 2543 std::string Buffer;
2343 raw_string_ostream StrBuf(Buffer); 2544 raw_string_ostream StrBuf(Buffer);
2344 StrBuf << "Function heading has unknown linkage. Found " << Values[3]; 2545 StrBuf << "Function heading has unknown linkage. Found " << Values[3];
2345 Error(StrBuf.str()); 2546 Error(StrBuf.str());
2346 return; 2547 return;
2347 } 2548 }
2348 Function *Func = Function::Create(FTy, Linkage, "", Context->getModule()); 2549 SmallVector<Type *, 8> ArgTys;
2550 for (Ice::Type ArgType : Ty.getArgList()) {
2551 ArgTys.push_back(Context->convertToLLVMType(ArgType));
2552 }
2553 Function *Func = Function::Create(
2554 FunctionType::get(Context->convertToLLVMType(Ty.getReturnType()),
2555 ArgTys, false),
2556 Linkage, "", Context->getModule());
2349 Func->setCallingConv(CallingConv); 2557 Func->setCallingConv(CallingConv);
2350 if (Values[2] == 0) 2558 if (Values[2] == 0)
2351 Context->setNextValueIDAsImplementedFunction(); 2559 Context->setNextValueIDAsImplementedFunction();
2352 Context->setNextFunctionID(Func); 2560 Context->setNextFunctionID(Func);
2353 // TODO(kschimpf) verify if Func matches PNaCl ABI. 2561 // TODO(kschimpf) verify if Func matches PNaCl ABI.
2354 return; 2562 return;
2355 } 2563 }
2356 default: 2564 default:
2357 BlockParserBaseClass::ProcessRecord(); 2565 BlockParserBaseClass::ProcessRecord();
2358 return; 2566 return;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
2417 2625
2418 if (TopLevelBlocks != 1) { 2626 if (TopLevelBlocks != 1) {
2419 errs() << IRFilename 2627 errs() << IRFilename
2420 << ": Contains more than one module. Found: " << TopLevelBlocks 2628 << ": Contains more than one module. Found: " << TopLevelBlocks
2421 << "\n"; 2629 << "\n";
2422 ErrorStatus = true; 2630 ErrorStatus = true;
2423 } 2631 }
2424 } 2632 }
2425 2633
2426 } // end of namespace Ice 2634 } // end of namespace Ice
OLDNEW
« src/IceTypes.h ('K') | « src/IceTypes.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698