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

Side by Side Diff: src/PNaClTranslator.cpp

Issue 1293343003: Change to use arena allocation for function-local data in parser. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nits. Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceDefs.h ('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 /// \file 10 /// \file
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 159
160 class BlockParserBaseClass; 160 class BlockParserBaseClass;
161 161
162 // Top-level class to read PNaCl bitcode files, and translate to ICE. 162 // Top-level class to read PNaCl bitcode files, and translate to ICE.
163 class TopLevelParser : public NaClBitcodeParser { 163 class TopLevelParser : public NaClBitcodeParser {
164 TopLevelParser() = delete; 164 TopLevelParser() = delete;
165 TopLevelParser(const TopLevelParser &) = delete; 165 TopLevelParser(const TopLevelParser &) = delete;
166 TopLevelParser &operator=(const TopLevelParser &) = delete; 166 TopLevelParser &operator=(const TopLevelParser &) = delete;
167 167
168 public: 168 public:
169 typedef std::vector<Ice::FunctionDeclaration *> FunctionDeclarationListType;
170
171 TopLevelParser(Ice::Translator &Translator, NaClBitstreamCursor &Cursor, 169 TopLevelParser(Ice::Translator &Translator, NaClBitstreamCursor &Cursor,
172 Ice::ErrorCode &ErrorStatus) 170 Ice::ErrorCode &ErrorStatus)
173 : NaClBitcodeParser(Cursor), Translator(Translator), 171 : NaClBitcodeParser(Cursor), Translator(Translator),
174 ErrorStatus(ErrorStatus), 172 ErrorStatus(ErrorStatus),
175 VariableDeclarations(new Ice::VariableDeclarationList()) {} 173 VariableDeclarations(new Ice::VariableDeclarationList()) {}
176 174
177 ~TopLevelParser() override = default; 175 ~TopLevelParser() override = default;
178 176
179 Ice::Translator &getTranslator() const { return Translator; } 177 Ice::Translator &getTranslator() const { return Translator; }
180 178
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 const Ice::FuncSigType &getFuncSigTypeByID(NaClBcIndexSize_t ID) { 238 const Ice::FuncSigType &getFuncSigTypeByID(NaClBcIndexSize_t ID) {
241 const ExtendedType *Ty = getTypeByIDAsKind(ID, ExtendedType::FuncSig); 239 const ExtendedType *Ty = getTypeByIDAsKind(ID, ExtendedType::FuncSig);
242 if (Ty == nullptr) 240 if (Ty == nullptr)
243 // Return error recovery value. 241 // Return error recovery value.
244 return UndefinedFuncSigType; 242 return UndefinedFuncSigType;
245 return cast<FuncSigExtendedType>(Ty)->getSignature(); 243 return cast<FuncSigExtendedType>(Ty)->getSignature();
246 } 244 }
247 245
248 /// Sets the next function ID to the given LLVM function. 246 /// Sets the next function ID to the given LLVM function.
249 void setNextFunctionID(Ice::FunctionDeclaration *Fcn) { 247 void setNextFunctionID(Ice::FunctionDeclaration *Fcn) {
250 FunctionDeclarationList.push_back(Fcn); 248 FunctionDeclarations.push_back(Fcn);
251 } 249 }
252 250
253 /// Returns the value id that should be associated with the the 251 /// Returns the value id that should be associated with the the
254 /// current function block. Increments internal counters during call 252 /// current function block. Increments internal counters during call
255 /// so that it will be in correct position for next function block. 253 /// so that it will be in correct position for next function block.
256 NaClBcIndexSize_t getNextFunctionBlockValueID() { 254 NaClBcIndexSize_t getNextFunctionBlockValueID() {
257 size_t NumDeclaredFunctions = FunctionDeclarationList.size(); 255 size_t NumDeclaredFunctions = FunctionDeclarations.size();
258 while (NextDefiningFunctionID < NumDeclaredFunctions && 256 while (NextDefiningFunctionID < NumDeclaredFunctions &&
259 FunctionDeclarationList[NextDefiningFunctionID]->isProto()) 257 FunctionDeclarations[NextDefiningFunctionID]->isProto())
260 ++NextDefiningFunctionID; 258 ++NextDefiningFunctionID;
261 if (NextDefiningFunctionID >= NumDeclaredFunctions) 259 if (NextDefiningFunctionID >= NumDeclaredFunctions)
262 Fatal("More function blocks than defined function addresses"); 260 Fatal("More function blocks than defined function addresses");
263 return NextDefiningFunctionID++; 261 return NextDefiningFunctionID++;
264 } 262 }
265 263
266 /// Returns the function associated with ID. 264 /// Returns the function associated with ID.
267 Ice::FunctionDeclaration *getFunctionByID(NaClBcIndexSize_t ID) { 265 Ice::FunctionDeclaration *getFunctionByID(NaClBcIndexSize_t ID) {
268 if (ID < FunctionDeclarationList.size()) 266 if (ID < FunctionDeclarations.size())
269 return FunctionDeclarationList[ID]; 267 return FunctionDeclarations[ID];
270 return reportGetFunctionByIDError(ID); 268 return reportGetFunctionByIDError(ID);
271 } 269 }
272 270
273 /// Returns the constant associated with the given global value ID. 271 /// Returns the constant associated with the given global value ID.
274 Ice::Constant *getGlobalConstantByID(NaClBcIndexSize_t ID) { 272 Ice::Constant *getGlobalConstantByID(NaClBcIndexSize_t ID) {
275 assert(ID < ValueIDConstants.size()); 273 assert(ID < ValueIDConstants.size());
276 return ValueIDConstants[ID]; 274 return ValueIDConstants[ID];
277 } 275 }
278 276
279 /// Install names for all global values without names. Called after 277 /// Install names for all global values without names. Called after
280 /// the global value symbol table is processed, but before any 278 /// the global value symbol table is processed, but before any
281 /// function blocks are processed. 279 /// function blocks are processed.
282 void installGlobalNames() { 280 void installGlobalNames() {
283 assert(VariableDeclarations); 281 assert(VariableDeclarations);
284 installGlobalVarNames(); 282 installGlobalVarNames();
285 installFunctionNames(); 283 installFunctionNames();
286 } 284 }
287 285
288 void createValueIDs() { 286 void createValueIDs() {
289 assert(VariableDeclarations); 287 assert(VariableDeclarations);
290 ValueIDConstants.reserve(VariableDeclarations->size() + 288 ValueIDConstants.reserve(VariableDeclarations->size() +
291 FunctionDeclarationList.size()); 289 FunctionDeclarations.size());
292 createValueIDsForFunctions(); 290 createValueIDsForFunctions();
293 createValueIDsForGlobalVars(); 291 createValueIDsForGlobalVars();
294 } 292 }
295 293
296 /// Returns the number of function declarations in the bitcode file. 294 /// Returns the number of function declarations in the bitcode file.
297 size_t getNumFunctionIDs() const { return FunctionDeclarationList.size(); } 295 size_t getNumFunctionIDs() const { return FunctionDeclarations.size(); }
298 296
299 /// Returns the number of global declarations (i.e. IDs) defined in 297 /// Returns the number of global declarations (i.e. IDs) defined in
300 /// the bitcode file. 298 /// the bitcode file.
301 size_t getNumGlobalIDs() const { 299 size_t getNumGlobalIDs() const {
302 if (VariableDeclarations) { 300 if (VariableDeclarations) {
303 return FunctionDeclarationList.size() + VariableDeclarations->size(); 301 return FunctionDeclarations.size() + VariableDeclarations->size();
304 } else { 302 } else {
305 return ValueIDConstants.size(); 303 return ValueIDConstants.size();
306 } 304 }
307 } 305 }
308 306
309 /// Adds the given global declaration to the end of the list of global 307 /// Adds the given global declaration to the end of the list of global
310 /// declarations. 308 /// declarations.
311 void addGlobalDeclaration(Ice::VariableDeclaration *Decl) { 309 void addGlobalDeclaration(Ice::VariableDeclaration *Decl) {
312 assert(VariableDeclarations); 310 assert(VariableDeclarations);
313 VariableDeclarations->push_back(Decl); 311 VariableDeclarations->push_back(Decl);
314 } 312 }
315 313
316 /// Returns the global variable declaration with the given index. 314 /// Returns the global variable declaration with the given index.
317 Ice::VariableDeclaration *getGlobalVariableByID(NaClBcIndexSize_t Index) { 315 Ice::VariableDeclaration *getGlobalVariableByID(NaClBcIndexSize_t Index) {
318 assert(VariableDeclarations); 316 assert(VariableDeclarations);
319 if (Index < VariableDeclarations->size()) 317 if (Index < VariableDeclarations->size())
320 return VariableDeclarations->at(Index); 318 return VariableDeclarations->at(Index);
321 return reportGetGlobalVariableByIDError(Index); 319 return reportGetGlobalVariableByIDError(Index);
322 } 320 }
323 321
324 /// Returns the global declaration (variable or function) with the 322 /// Returns the global declaration (variable or function) with the
325 /// given Index. 323 /// given Index.
326 Ice::GlobalDeclaration *getGlobalDeclarationByID(NaClBcIndexSize_t Index) { 324 Ice::GlobalDeclaration *getGlobalDeclarationByID(NaClBcIndexSize_t Index) {
327 size_t NumFunctionIds = FunctionDeclarationList.size(); 325 size_t NumFunctionIds = FunctionDeclarations.size();
328 if (Index < NumFunctionIds) 326 if (Index < NumFunctionIds)
329 return getFunctionByID(Index); 327 return getFunctionByID(Index);
330 else 328 else
331 return getGlobalVariableByID(Index - NumFunctionIds); 329 return getGlobalVariableByID(Index - NumFunctionIds);
332 } 330 }
333 331
334 /// Returns the list of parsed global variable 332 /// Returns the list of parsed global variable
335 /// declarations. Releases ownership of the current list of global 333 /// declarations. Releases ownership of the current list of global
336 /// variables. Note: only returns non-null pointer on first 334 /// variables. Note: only returns non-null pointer on first
337 /// call. All successive calls return a null pointer. 335 /// call. All successive calls return a null pointer.
338 std::unique_ptr<Ice::VariableDeclarationList> getGlobalVariables() { 336 std::unique_ptr<Ice::VariableDeclarationList> getGlobalVariables() {
339 // Before returning, check that ValidIDConstants has already been 337 // Before returning, check that ValidIDConstants has already been
340 // built. 338 // built.
341 assert(!VariableDeclarations || 339 assert(!VariableDeclarations ||
342 VariableDeclarations->size() <= ValueIDConstants.size()); 340 VariableDeclarations->size() <= ValueIDConstants.size());
343 return std::move(VariableDeclarations); 341 return std::move(VariableDeclarations);
344 } 342 }
345 343
346 private: 344 private:
347 // The translator associated with the parser. 345 // The translator associated with the parser.
348 Ice::Translator &Translator; 346 Ice::Translator &Translator;
349 // The exit status that should be set to true if an error occurs. 347 // The exit status that should be set to true if an error occurs.
350 Ice::ErrorCode &ErrorStatus; 348 Ice::ErrorCode &ErrorStatus;
351 // The number of errors reported. 349 // The number of errors reported.
352 unsigned NumErrors = 0; 350 unsigned NumErrors = 0;
353 // The types associated with each type ID. 351 // The types associated with each type ID.
354 std::vector<ExtendedType> TypeIDValues; 352 std::vector<ExtendedType> TypeIDValues;
355 // The set of functions (prototype and defined). 353 // The set of functions (prototype and defined).
356 FunctionDeclarationListType FunctionDeclarationList; 354 Ice::FunctionDeclarationList FunctionDeclarations;
357 // The ID of the next possible defined function ID in 355 // The ID of the next possible defined function ID in FunctionDeclarations.
358 // FunctionDeclarationList. FunctionDeclarationList is filled 356 // FunctionDeclarations is filled first. It's the set of functions (either
359 // first. It's the set of functions (either defined or isproto). Then 357 // defined or isproto). Then function definitions are encountered/parsed and
360 // function definitions are encountered/parsed and 358 // NextDefiningFunctionID is incremented to track the next actually-defined
361 // NextDefiningFunctionID is incremented to track the next 359 // function.
362 // actually-defined function.
363 size_t NextDefiningFunctionID = 0; 360 size_t NextDefiningFunctionID = 0;
364 // The set of global variables. 361 // The set of global variables.
365 std::unique_ptr<Ice::VariableDeclarationList> VariableDeclarations; 362 std::unique_ptr<Ice::VariableDeclarationList> VariableDeclarations;
366 // Relocatable constants associated with global declarations. 363 // Relocatable constants associated with global declarations.
367 std::vector<Ice::Constant *> ValueIDConstants; 364 Ice::ConstantList ValueIDConstants;
368 // Error recovery value to use when getFuncSigTypeByID fails. 365 // Error recovery value to use when getFuncSigTypeByID fails.
369 Ice::FuncSigType UndefinedFuncSigType; 366 Ice::FuncSigType UndefinedFuncSigType;
370 // The block parser currently being applied. Used for error 367 // The block parser currently being applied. Used for error
371 // reporting. 368 // reporting.
372 BlockParserBaseClass *BlockParser = nullptr; 369 BlockParserBaseClass *BlockParser = nullptr;
373 370
374 bool ParseBlock(unsigned BlockID) override; 371 bool ParseBlock(unsigned BlockID) override;
375 372
376 // Gets extended type associated with the given index, assuming the 373 // Gets extended type associated with the given index, assuming the
377 // extended type is of the WantedKind. Generates error message if 374 // extended type is of the WantedKind. Generates error message if
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 } 417 }
421 } 418 }
422 } 419 }
423 420
424 // Installs names for functions without names. 421 // Installs names for functions without names.
425 void installFunctionNames() { 422 void installFunctionNames() {
426 const Ice::IceString &FunctionPrefix = 423 const Ice::IceString &FunctionPrefix =
427 getTranslator().getFlags().getDefaultFunctionPrefix(); 424 getTranslator().getFlags().getDefaultFunctionPrefix();
428 if (!FunctionPrefix.empty()) { 425 if (!FunctionPrefix.empty()) {
429 NaClBcIndexSize_t NameIndex = 0; 426 NaClBcIndexSize_t NameIndex = 0;
430 for (Ice::FunctionDeclaration *Func : FunctionDeclarationList) { 427 for (Ice::FunctionDeclaration *Func : FunctionDeclarations) {
431 installDeclarationName(Func, FunctionPrefix, "function", NameIndex); 428 installDeclarationName(Func, FunctionPrefix, "function", NameIndex);
432 } 429 }
433 } 430 }
434 } 431 }
435 432
436 // Builds a constant symbol named Name, suppressing name mangling if 433 // Builds a constant symbol named Name, suppressing name mangling if
437 // SuppressMangling. IsExternal is true iff the symbol is external. 434 // SuppressMangling. IsExternal is true iff the symbol is external.
438 Ice::Constant *getConstantSym(const Ice::IceString &Name, 435 Ice::Constant *getConstantSym(const Ice::IceString &Name,
439 bool SuppressMangling, bool IsExternal) const { 436 bool SuppressMangling, bool IsExternal) const {
440 if (IsExternal) { 437 if (IsExternal) {
441 return getTranslator().getContext()->getConstantExternSym(Name); 438 return getTranslator().getContext()->getConstantExternSym(Name);
442 } else { 439 } else {
443 const Ice::RelocOffsetT Offset = 0; 440 const Ice::RelocOffsetT Offset = 0;
444 return getTranslator().getContext()->getConstantSym(Offset, Name, 441 return getTranslator().getContext()->getConstantSym(Offset, Name,
445 SuppressMangling); 442 SuppressMangling);
446 } 443 }
447 } 444 }
448 445
449 // Converts function declarations into constant value IDs. 446 // Converts function declarations into constant value IDs.
450 void createValueIDsForFunctions() { 447 void createValueIDsForFunctions() {
451 for (const Ice::FunctionDeclaration *Func : FunctionDeclarationList) { 448 for (const Ice::FunctionDeclaration *Func : FunctionDeclarations) {
452 Ice::Constant *C = nullptr; 449 Ice::Constant *C = nullptr;
453 if (!isIRGenerationDisabled()) { 450 if (!isIRGenerationDisabled()) {
454 C = getConstantSym(Func->getName(), Func->getSuppressMangling(), 451 C = getConstantSym(Func->getName(), Func->getSuppressMangling(),
455 Func->isProto()); 452 Func->isProto());
456 } 453 }
457 ValueIDConstants.push_back(C); 454 ValueIDConstants.push_back(C);
458 } 455 }
459 } 456 }
460 457
461 // Converts global variable declarations into constant value IDs. 458 // Converts global variable declarations into constant value IDs.
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 } 514 }
518 blockError(StrBuf.str()); 515 blockError(StrBuf.str());
519 } 516 }
520 517
521 Ice::FunctionDeclaration * 518 Ice::FunctionDeclaration *
522 TopLevelParser::reportGetFunctionByIDError(NaClBcIndexSize_t ID) { 519 TopLevelParser::reportGetFunctionByIDError(NaClBcIndexSize_t ID) {
523 std::string Buffer; 520 std::string Buffer;
524 raw_string_ostream StrBuf(Buffer); 521 raw_string_ostream StrBuf(Buffer);
525 StrBuf << "Function index " << ID 522 StrBuf << "Function index " << ID
526 << " not allowed. Out of range. Must be less than " 523 << " not allowed. Out of range. Must be less than "
527 << FunctionDeclarationList.size(); 524 << FunctionDeclarations.size();
528 blockError(StrBuf.str()); 525 blockError(StrBuf.str());
529 if (!FunctionDeclarationList.empty()) 526 if (!FunctionDeclarations.empty())
530 return FunctionDeclarationList[0]; 527 return FunctionDeclarations[0];
531 Fatal(); 528 Fatal();
532 } 529 }
533 530
534 Ice::VariableDeclaration * 531 Ice::VariableDeclaration *
535 TopLevelParser::reportGetGlobalVariableByIDError(NaClBcIndexSize_t Index) { 532 TopLevelParser::reportGetGlobalVariableByIDError(NaClBcIndexSize_t Index) {
536 std::string Buffer; 533 std::string Buffer;
537 raw_string_ostream StrBuf(Buffer); 534 raw_string_ostream StrBuf(Buffer);
538 StrBuf << "Global index " << Index 535 StrBuf << "Global index " << Index
539 << " not allowed. Out of range. Must be less than " 536 << " not allowed. Out of range. Must be less than "
540 << VariableDeclarations->size(); 537 << VariableDeclarations->size();
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 bool convertFunction() { 1223 bool convertFunction() {
1227 const Ice::TimerStackIdT StackID = Ice::GlobalContext::TSK_Funcs; 1224 const Ice::TimerStackIdT StackID = Ice::GlobalContext::TSK_Funcs;
1228 Ice::TimerIdT TimerID = 0; 1225 Ice::TimerIdT TimerID = 0;
1229 const bool TimeThisFunction = getFlags().getTimeEachFunction(); 1226 const bool TimeThisFunction = getFlags().getTimeEachFunction();
1230 if (TimeThisFunction) { 1227 if (TimeThisFunction) {
1231 TimerID = getTranslator().getContext()->getTimerID(StackID, 1228 TimerID = getTranslator().getContext()->getTimerID(StackID,
1232 FuncDecl->getName()); 1229 FuncDecl->getName());
1233 getTranslator().getContext()->pushTimer(TimerID, StackID); 1230 getTranslator().getContext()->pushTimer(TimerID, StackID);
1234 } 1231 }
1235 1232
1236 if (!isIRGenerationDisabled()) 1233 // Note: The Cfg is created, even when IR generation is disabled. This
1237 Func = Ice::Cfg::create(getTranslator().getContext(), 1234 // is done to install a CfgLocalAllocator for various internal containers.
1238 getTranslator().getNextSequenceNumber()); 1235 Func = Ice::Cfg::create(getTranslator().getContext(),
1236 getTranslator().getNextSequenceNumber());
1239 Ice::Cfg::setCurrentCfg(Func.get()); 1237 Ice::Cfg::setCurrentCfg(Func.get());
1240 1238
1241 // TODO(kschimpf) Clean up API to add a function signature to 1239 // TODO(kschimpf) Clean up API to add a function signature to
1242 // a CFG. 1240 // a CFG.
1243 const Ice::FuncSigType &Signature = FuncDecl->getSignature(); 1241 const Ice::FuncSigType &Signature = FuncDecl->getSignature();
1244 if (isIRGenerationDisabled()) { 1242 if (isIRGenerationDisabled()) {
1245 CurrentNode = nullptr; 1243 CurrentNode = nullptr;
1246 for (Ice::Type ArgType : Signature.getArgList()) { 1244 for (Ice::Type ArgType : Signature.getArgList()) {
1247 (void)ArgType; 1245 (void)ArgType;
1248 setNextLocalInstIndex(nullptr); 1246 setNextLocalInstIndex(nullptr);
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1329 // The basic block being built. 1327 // The basic block being built.
1330 Ice::CfgNode *CurrentNode = nullptr; 1328 Ice::CfgNode *CurrentNode = nullptr;
1331 // The ID for the function. 1329 // The ID for the function.
1332 NaClBcIndexSize_t FcnId; 1330 NaClBcIndexSize_t FcnId;
1333 // The corresponding function declaration. 1331 // The corresponding function declaration.
1334 Ice::FunctionDeclaration *FuncDecl; 1332 Ice::FunctionDeclaration *FuncDecl;
1335 // Holds the dividing point between local and global absolute value indices. 1333 // Holds the dividing point between local and global absolute value indices.
1336 size_t CachedNumGlobalValueIDs; 1334 size_t CachedNumGlobalValueIDs;
1337 // Holds operands local to the function block, based on indices 1335 // Holds operands local to the function block, based on indices
1338 // defined in the bitcode file. 1336 // defined in the bitcode file.
1339 std::vector<Ice::Operand *> LocalOperands; 1337 Ice::OperandList LocalOperands;
1340 // Holds the index within LocalOperands corresponding to the next 1338 // Holds the index within LocalOperands corresponding to the next
1341 // instruction that generates a value. 1339 // instruction that generates a value.
1342 NaClBcIndexSize_t NextLocalInstIndex; 1340 NaClBcIndexSize_t NextLocalInstIndex;
1343 // True if the last processed instruction was a terminating 1341 // True if the last processed instruction was a terminating
1344 // instruction. 1342 // instruction.
1345 bool InstIsTerminating = false; 1343 bool InstIsTerminating = false;
1346 // Upper limit of alignment power allowed by LLVM 1344 // Upper limit of alignment power allowed by LLVM
1347 static const uint32_t AlignPowerLimit = 29; 1345 static const uint32_t AlignPowerLimit = 29;
1348 1346
1349 // Extracts the corresponding Alignment to use, given the AlignPower 1347 // Extracts the corresponding Alignment to use, given the AlignPower
(...skipping 1819 matching lines...) Expand 10 before | Expand all | Expand 10 after
3169 } 3167 }
3170 if (InputStreamFile.getBitcodeBytes().getExtent() % 4 != 0) { 3168 if (InputStreamFile.getBitcodeBytes().getExtent() % 4 != 0) {
3171 ErrStream 3169 ErrStream
3172 << IRFilename 3170 << IRFilename
3173 << ": Bitcode stream should be a multiple of 4 bytes in length.\n"; 3171 << ": Bitcode stream should be a multiple of 4 bytes in length.\n";
3174 llvm::report_fatal_error("Bitcode stream should be a multiple of 4 bytes"); 3172 llvm::report_fatal_error("Bitcode stream should be a multiple of 4 bytes");
3175 } 3173 }
3176 } 3174 }
3177 3175
3178 } // end of namespace Ice 3176 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceDefs.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698