OLD | NEW |
1 //===- subzero/src/PNaClTranslator.cpp - ICE from bitcode -----------------===// | 1 //===- subzero/src/PNaClTranslator.cpp - ICE from bitcode -----------------===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This file implements the PNaCl bitcode file to Ice, to machine code | 10 // This file implements the PNaCl bitcode file to Ice, to machine code |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 TopLevelParser(const TopLevelParser &) = delete; | 156 TopLevelParser(const TopLevelParser &) = delete; |
157 TopLevelParser &operator=(const TopLevelParser &) = delete; | 157 TopLevelParser &operator=(const TopLevelParser &) = delete; |
158 | 158 |
159 public: | 159 public: |
160 typedef std::vector<Ice::FunctionDeclaration *> FunctionDeclarationListType; | 160 typedef std::vector<Ice::FunctionDeclaration *> FunctionDeclarationListType; |
161 | 161 |
162 TopLevelParser(Ice::Translator &Translator, NaClBitcodeHeader &Header, | 162 TopLevelParser(Ice::Translator &Translator, NaClBitcodeHeader &Header, |
163 NaClBitstreamCursor &Cursor, Ice::ErrorCode &ErrorStatus) | 163 NaClBitstreamCursor &Cursor, Ice::ErrorCode &ErrorStatus) |
164 : NaClBitcodeParser(Cursor), Translator(Translator), Header(Header), | 164 : NaClBitcodeParser(Cursor), Translator(Translator), Header(Header), |
165 ErrorStatus(ErrorStatus), NumErrors(0), NextDefiningFunctionID(0), | 165 ErrorStatus(ErrorStatus), NumErrors(0), NextDefiningFunctionID(0), |
| 166 VariableDeclarations(new Ice::VariableDeclarationList), |
166 BlockParser(nullptr), StubbedConstCallValue(nullptr) {} | 167 BlockParser(nullptr), StubbedConstCallValue(nullptr) {} |
167 | 168 |
168 ~TopLevelParser() override {} | 169 ~TopLevelParser() override {} |
169 | 170 |
170 Ice::Translator &getTranslator() { return Translator; } | 171 Ice::Translator &getTranslator() { return Translator; } |
171 | 172 |
172 void setBlockParser(BlockParserBaseClass *NewBlockParser) { | 173 void setBlockParser(BlockParserBaseClass *NewBlockParser) { |
173 BlockParser = NewBlockParser; | 174 BlockParser = NewBlockParser; |
174 } | 175 } |
175 | 176 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 } | 259 } |
259 | 260 |
260 /// Returns the corresponding constant associated with a global declaration. | 261 /// Returns the corresponding constant associated with a global declaration. |
261 /// (i.e. relocatable). | 262 /// (i.e. relocatable). |
262 Ice::Constant *getOrCreateGlobalConstantByID(unsigned ID) { | 263 Ice::Constant *getOrCreateGlobalConstantByID(unsigned ID) { |
263 // TODO(kschimpf): Can this be built when creating global initializers? | 264 // TODO(kschimpf): Can this be built when creating global initializers? |
264 Ice::Constant *C; | 265 Ice::Constant *C; |
265 if (ID >= ValueIDConstants.size()) { | 266 if (ID >= ValueIDConstants.size()) { |
266 C = nullptr; | 267 C = nullptr; |
267 unsigned ExpectedSize = | 268 unsigned ExpectedSize = |
268 FunctionDeclarationList.size() + VariableDeclarations.size(); | 269 FunctionDeclarationList.size() + VariableDeclarations->size(); |
269 if (ID >= ExpectedSize) | 270 if (ID >= ExpectedSize) |
270 ExpectedSize = ID; | 271 ExpectedSize = ID; |
271 ValueIDConstants.resize(ExpectedSize); | 272 ValueIDConstants.resize(ExpectedSize); |
272 } else { | 273 } else { |
273 C = ValueIDConstants[ID]; | 274 C = ValueIDConstants[ID]; |
274 } | 275 } |
275 if (C != nullptr) | 276 if (C != nullptr) |
276 return C; | 277 return C; |
277 | 278 |
278 if (isIRGenerationDisabled()) { | 279 if (isIRGenerationDisabled()) { |
279 ValueIDConstants[ID] = nullptr; | 280 ValueIDConstants[ID] = nullptr; |
280 return nullptr; | 281 return nullptr; |
281 } | 282 } |
282 | 283 |
283 // If reached, no such constant exists, create one. | 284 // If reached, no such constant exists, create one. |
284 // TODO(kschimpf) Don't get addresses of intrinsic function declarations. | 285 // TODO(kschimpf) Don't get addresses of intrinsic function declarations. |
285 Ice::GlobalDeclaration *Decl = nullptr; | 286 Ice::GlobalDeclaration *Decl = nullptr; |
286 unsigned FcnIDSize = FunctionDeclarationList.size(); | 287 unsigned FcnIDSize = FunctionDeclarationList.size(); |
287 bool IsUndefined = false; | 288 bool IsUndefined = false; |
288 if (ID < FcnIDSize) { | 289 if (ID < FcnIDSize) { |
289 Decl = FunctionDeclarationList[ID]; | 290 Decl = FunctionDeclarationList[ID]; |
290 const auto Func = llvm::cast<Ice::FunctionDeclaration>(Decl); | 291 const auto Func = llvm::cast<Ice::FunctionDeclaration>(Decl); |
291 IsUndefined = Func->isProto(); | 292 IsUndefined = Func->isProto(); |
292 } else if ((ID - FcnIDSize) < VariableDeclarations.size()) { | 293 } else if ((ID - FcnIDSize) < VariableDeclarations->size()) { |
293 Decl = VariableDeclarations[ID - FcnIDSize]; | 294 Decl = VariableDeclarations->at(ID - FcnIDSize); |
294 const auto Var = llvm::cast<Ice::VariableDeclaration>(Decl); | 295 const auto Var = llvm::cast<Ice::VariableDeclaration>(Decl); |
295 IsUndefined = !Var->hasInitializer(); | 296 IsUndefined = !Var->hasInitializer(); |
296 } | 297 } |
297 Ice::IceString Name; | 298 Ice::IceString Name; |
298 bool SuppressMangling; | 299 bool SuppressMangling; |
299 if (Decl) { | 300 if (Decl) { |
300 Name = Decl->getName(); | 301 Name = Decl->getName(); |
301 SuppressMangling = Decl->getSuppressMangling(); | 302 SuppressMangling = Decl->getSuppressMangling(); |
302 } else { | 303 } else { |
303 std::string Buffer; | 304 std::string Buffer; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 Error("Unable to find function definition to stub constant calls with"); | 337 Error("Unable to find function definition to stub constant calls with"); |
337 return CallValue; | 338 return CallValue; |
338 } | 339 } |
339 | 340 |
340 /// Returns the number of function declarations in the bitcode file. | 341 /// Returns the number of function declarations in the bitcode file. |
341 unsigned getNumFunctionIDs() const { return FunctionDeclarationList.size(); } | 342 unsigned getNumFunctionIDs() const { return FunctionDeclarationList.size(); } |
342 | 343 |
343 /// Returns the number of global declarations (i.e. IDs) defined in | 344 /// Returns the number of global declarations (i.e. IDs) defined in |
344 /// the bitcode file. | 345 /// the bitcode file. |
345 unsigned getNumGlobalIDs() const { | 346 unsigned getNumGlobalIDs() const { |
346 return FunctionDeclarationList.size() + VariableDeclarations.size(); | 347 return FunctionDeclarationList.size() + VariableDeclarations->size(); |
347 } | 348 } |
348 | 349 |
349 /// Creates Count global variable declarations. | 350 /// Creates Count global variable declarations. |
350 void CreateGlobalVariables(size_t Count) { | 351 void CreateGlobalVariables(size_t Count) { |
351 assert(VariableDeclarations.empty()); | 352 assert(VariableDeclarations->empty()); |
352 for (size_t i = 0; i < Count; ++i) { | 353 for (size_t i = 0; i < Count; ++i) { |
353 VariableDeclarations.push_back(Ice::VariableDeclaration::create()); | 354 VariableDeclarations->push_back(Ice::VariableDeclaration::create()); |
354 } | 355 } |
355 } | 356 } |
356 | 357 |
357 /// Returns the number of global variable declarations in the | 358 /// Returns the number of global variable declarations in the |
358 /// bitcode file. | 359 /// bitcode file. |
359 Ice::SizeT getNumGlobalVariables() const { | 360 Ice::SizeT getNumGlobalVariables() const { |
360 return VariableDeclarations.size(); | 361 return VariableDeclarations->size(); |
361 } | 362 } |
362 | 363 |
363 /// Returns the global variable declaration with the given index. | 364 /// Returns the global variable declaration with the given index. |
364 Ice::VariableDeclaration *getGlobalVariableByID(unsigned Index) { | 365 Ice::VariableDeclaration *getGlobalVariableByID(unsigned Index) { |
365 if (Index < VariableDeclarations.size()) | 366 if (Index < VariableDeclarations->size()) |
366 return VariableDeclarations[Index]; | 367 return VariableDeclarations->at(Index); |
367 return reportGetGlobalVariableByIDError(Index); | 368 return reportGetGlobalVariableByIDError(Index); |
368 } | 369 } |
369 | 370 |
370 /// Returns the global declaration (variable or function) with the | 371 /// Returns the global declaration (variable or function) with the |
371 /// given Index. | 372 /// given Index. |
372 Ice::GlobalDeclaration *getGlobalDeclarationByID(size_t Index) { | 373 Ice::GlobalDeclaration *getGlobalDeclarationByID(size_t Index) { |
373 size_t NumFunctionIds = FunctionDeclarationList.size(); | 374 size_t NumFunctionIds = FunctionDeclarationList.size(); |
374 if (Index < NumFunctionIds) | 375 if (Index < NumFunctionIds) |
375 return getFunctionByID(Index); | 376 return getFunctionByID(Index); |
376 else | 377 else |
377 return getGlobalVariableByID(Index - NumFunctionIds); | 378 return getGlobalVariableByID(Index - NumFunctionIds); |
378 } | 379 } |
379 | 380 |
380 /// Returns the list of parsed global variable declarations. | 381 /// Returns the list of parsed global variable declarations. |
381 const Ice::VariableDeclarationList &getGlobalVariables() { | 382 Ice::VariableDeclarationList *getGlobalVariables() { |
382 return VariableDeclarations; | 383 return VariableDeclarations; |
383 } | 384 } |
384 | 385 |
385 private: | 386 private: |
386 // The translator associated with the parser. | 387 // The translator associated with the parser. |
387 Ice::Translator &Translator; | 388 Ice::Translator &Translator; |
388 // The bitcode header. | 389 // The bitcode header. |
389 NaClBitcodeHeader &Header; | 390 NaClBitcodeHeader &Header; |
390 // The exit status that should be set to true if an error occurs. | 391 // The exit status that should be set to true if an error occurs. |
391 Ice::ErrorCode &ErrorStatus; | 392 Ice::ErrorCode &ErrorStatus; |
392 // The number of errors reported. | 393 // The number of errors reported. |
393 unsigned NumErrors; | 394 unsigned NumErrors; |
394 // The types associated with each type ID. | 395 // The types associated with each type ID. |
395 std::vector<ExtendedType> TypeIDValues; | 396 std::vector<ExtendedType> TypeIDValues; |
396 // The set of functions (prototype and defined). | 397 // The set of functions (prototype and defined). |
397 FunctionDeclarationListType FunctionDeclarationList; | 398 FunctionDeclarationListType FunctionDeclarationList; |
398 // The ID of the next possible defined function ID in | 399 // The ID of the next possible defined function ID in |
399 // FunctionDeclarationList. FunctionDeclarationList is filled | 400 // FunctionDeclarationList. FunctionDeclarationList is filled |
400 // first. It's the set of functions (either defined or isproto). Then | 401 // first. It's the set of functions (either defined or isproto). Then |
401 // function definitions are encountered/parsed and | 402 // function definitions are encountered/parsed and |
402 // NextDefiningFunctionID is incremented to track the next | 403 // NextDefiningFunctionID is incremented to track the next |
403 // actually-defined function. | 404 // actually-defined function. |
404 size_t NextDefiningFunctionID; | 405 size_t NextDefiningFunctionID; |
405 // The set of global variables. | 406 // The set of global variables. |
406 Ice::VariableDeclarationList VariableDeclarations; | 407 Ice::VariableDeclarationList *VariableDeclarations; |
407 // Relocatable constants associated with global declarations. | 408 // Relocatable constants associated with global declarations. |
408 std::vector<Ice::Constant *> ValueIDConstants; | 409 std::vector<Ice::Constant *> ValueIDConstants; |
409 // Error recovery value to use when getFuncSigTypeByID fails. | 410 // Error recovery value to use when getFuncSigTypeByID fails. |
410 Ice::FuncSigType UndefinedFuncSigType; | 411 Ice::FuncSigType UndefinedFuncSigType; |
411 // The block parser currently being applied. Used for error | 412 // The block parser currently being applied. Used for error |
412 // reporting. | 413 // reporting. |
413 BlockParserBaseClass *BlockParser; | 414 BlockParserBaseClass *BlockParser; |
414 // Value to use to stub constant calls. | 415 // Value to use to stub constant calls. |
415 Ice::Operand *StubbedConstCallValue; | 416 Ice::Operand *StubbedConstCallValue; |
416 | 417 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 return FunctionDeclarationList[0]; | 489 return FunctionDeclarationList[0]; |
489 report_fatal_error("Unable to continue"); | 490 report_fatal_error("Unable to continue"); |
490 } | 491 } |
491 | 492 |
492 Ice::VariableDeclaration * | 493 Ice::VariableDeclaration * |
493 TopLevelParser::reportGetGlobalVariableByIDError(unsigned Index) { | 494 TopLevelParser::reportGetGlobalVariableByIDError(unsigned Index) { |
494 std::string Buffer; | 495 std::string Buffer; |
495 raw_string_ostream StrBuf(Buffer); | 496 raw_string_ostream StrBuf(Buffer); |
496 StrBuf << "Global index " << Index | 497 StrBuf << "Global index " << Index |
497 << " not allowed. Out of range. Must be less than " | 498 << " not allowed. Out of range. Must be less than " |
498 << VariableDeclarations.size(); | 499 << VariableDeclarations->size(); |
499 BlockError(StrBuf.str()); | 500 BlockError(StrBuf.str()); |
500 // TODO(kschimpf) Remove error recovery once implementation complete. | 501 // TODO(kschimpf) Remove error recovery once implementation complete. |
501 if (!VariableDeclarations.empty()) | 502 if (!VariableDeclarations->empty()) |
502 return VariableDeclarations[0]; | 503 return VariableDeclarations->at(0); |
503 report_fatal_error("Unable to continue"); | 504 report_fatal_error("Unable to continue"); |
504 } | 505 } |
505 | 506 |
506 Ice::Type TopLevelParser::convertToIceTypeError(Type *LLVMTy) { | 507 Ice::Type TopLevelParser::convertToIceTypeError(Type *LLVMTy) { |
507 std::string Buffer; | 508 std::string Buffer; |
508 raw_string_ostream StrBuf(Buffer); | 509 raw_string_ostream StrBuf(Buffer); |
509 StrBuf << "Invalid LLVM type: " << *LLVMTy; | 510 StrBuf << "Invalid LLVM type: " << *LLVMTy; |
510 Error(StrBuf.str()); | 511 Error(StrBuf.str()); |
511 return Ice::IceType_void; | 512 return Ice::IceType_void; |
512 } | 513 } |
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1092 const Ice::TimerStackIdT StackID = Ice::GlobalContext::TSK_Funcs; | 1093 const Ice::TimerStackIdT StackID = Ice::GlobalContext::TSK_Funcs; |
1093 Ice::TimerIdT TimerID = 0; | 1094 Ice::TimerIdT TimerID = 0; |
1094 const bool TimeThisFunction = ALLOW_DUMP && getFlags().TimeEachFunction; | 1095 const bool TimeThisFunction = ALLOW_DUMP && getFlags().TimeEachFunction; |
1095 if (TimeThisFunction) { | 1096 if (TimeThisFunction) { |
1096 TimerID = getTranslator().getContext()->getTimerID(StackID, | 1097 TimerID = getTranslator().getContext()->getTimerID(StackID, |
1097 FuncDecl->getName()); | 1098 FuncDecl->getName()); |
1098 getTranslator().getContext()->pushTimer(TimerID, StackID); | 1099 getTranslator().getContext()->pushTimer(TimerID, StackID); |
1099 } | 1100 } |
1100 | 1101 |
1101 if (!isIRGenerationDisabled()) | 1102 if (!isIRGenerationDisabled()) |
1102 Func = Ice::Cfg::create(getTranslator().getContext()); | 1103 Func = Ice::Cfg::create(getTranslator().getContext(), |
| 1104 getTranslator().getNextSequenceNumber()); |
1103 Ice::Cfg::setCurrentCfg(Func.get()); | 1105 Ice::Cfg::setCurrentCfg(Func.get()); |
1104 | 1106 |
1105 // TODO(kschimpf) Clean up API to add a function signature to | 1107 // TODO(kschimpf) Clean up API to add a function signature to |
1106 // a CFG. | 1108 // a CFG. |
1107 const Ice::FuncSigType &Signature = FuncDecl->getSignature(); | 1109 const Ice::FuncSigType &Signature = FuncDecl->getSignature(); |
1108 if (isIRGenerationDisabled()) { | 1110 if (isIRGenerationDisabled()) { |
1109 CurrentNode = nullptr; | 1111 CurrentNode = nullptr; |
1110 for (Ice::Type ArgType : Signature.getArgList()) { | 1112 for (Ice::Type ArgType : Signature.getArgList()) { |
1111 (void)ArgType; | 1113 (void)ArgType; |
1112 setNextLocalInstIndex(nullptr); | 1114 setNextLocalInstIndex(nullptr); |
(...skipping 14 matching lines...) Expand all Loading... |
1127 // the translator function. This is because translation may be | 1129 // the translator function. This is because translation may be |
1128 // done asynchronously in a separate thread. | 1130 // done asynchronously in a separate thread. |
1129 if (TimeThisFunction) | 1131 if (TimeThisFunction) |
1130 getTranslator().getContext()->popTimer(TimerID, StackID); | 1132 getTranslator().getContext()->popTimer(TimerID, StackID); |
1131 | 1133 |
1132 Ice::Cfg::setCurrentCfg(nullptr); | 1134 Ice::Cfg::setCurrentCfg(nullptr); |
1133 // Note: Once any errors have been found, we turn off all | 1135 // Note: Once any errors have been found, we turn off all |
1134 // translation of all remaining functions. This allows successive | 1136 // translation of all remaining functions. This allows successive |
1135 // parsing errors to be reported, without adding extra checks to | 1137 // parsing errors to be reported, without adding extra checks to |
1136 // the translator for such parsing errors. | 1138 // the translator for such parsing errors. |
1137 if (Context->getNumErrors() == 0) { | 1139 if (Context->getNumErrors() == 0 && Func) { |
1138 getTranslator().translateFcn(std::move(Func)); | 1140 getTranslator().translateFcn(std::move(Func)); |
1139 // The translator now has ownership of Func. | 1141 // The translator now has ownership of Func. |
1140 } else { | 1142 } else { |
1141 Func.reset(); | 1143 Func.reset(); |
1142 } | 1144 } |
1143 | 1145 |
1144 return ParserResult; | 1146 return ParserResult; |
1145 } | 1147 } |
1146 | 1148 |
1147 ~FunctionParser() final {} | 1149 ~FunctionParser() final {} |
(...skipping 1655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2803 // True if we have already installed names for unnamed global declarations, | 2805 // True if we have already installed names for unnamed global declarations, |
2804 // and have generated global constant initializers. | 2806 // and have generated global constant initializers. |
2805 bool GlobalDeclarationNamesAndInitializersInstalled; | 2807 bool GlobalDeclarationNamesAndInitializersInstalled; |
2806 | 2808 |
2807 // Generates names for unnamed global addresses (i.e. functions and | 2809 // Generates names for unnamed global addresses (i.e. functions and |
2808 // global variables). Then lowers global variable declaration | 2810 // global variables). Then lowers global variable declaration |
2809 // initializers to the target. May be called multiple times. Only | 2811 // initializers to the target. May be called multiple times. Only |
2810 // the first call will do the installation. | 2812 // the first call will do the installation. |
2811 void InstallGlobalNamesAndGlobalVarInitializers() { | 2813 void InstallGlobalNamesAndGlobalVarInitializers() { |
2812 if (!GlobalDeclarationNamesAndInitializersInstalled) { | 2814 if (!GlobalDeclarationNamesAndInitializersInstalled) { |
| 2815 Ice::VariableDeclarationList *VariableDeclarations = |
| 2816 Context->getGlobalVariables(); |
2813 Ice::Translator &Trans = getTranslator(); | 2817 Ice::Translator &Trans = getTranslator(); |
2814 const Ice::IceString &GlobalPrefix = getFlags().DefaultGlobalPrefix; | 2818 const Ice::IceString &GlobalPrefix = getFlags().DefaultGlobalPrefix; |
2815 if (!GlobalPrefix.empty()) { | 2819 if (!GlobalPrefix.empty()) { |
2816 uint32_t NameIndex = 0; | 2820 uint32_t NameIndex = 0; |
2817 for (Ice::VariableDeclaration *Var : Context->getGlobalVariables()) { | 2821 for (Ice::VariableDeclaration *Var : *VariableDeclarations) { |
2818 installDeclarationName(Trans, Var, GlobalPrefix, "global", NameIndex); | 2822 installDeclarationName(Trans, Var, GlobalPrefix, "global", NameIndex); |
2819 } | 2823 } |
2820 } | 2824 } |
2821 const Ice::IceString &FunctionPrefix = getFlags().DefaultFunctionPrefix; | 2825 const Ice::IceString &FunctionPrefix = getFlags().DefaultFunctionPrefix; |
2822 if (!FunctionPrefix.empty()) { | 2826 if (!FunctionPrefix.empty()) { |
2823 uint32_t NameIndex = 0; | 2827 uint32_t NameIndex = 0; |
2824 for (Ice::FunctionDeclaration *Func : | 2828 for (Ice::FunctionDeclaration *Func : |
2825 Context->getFunctionDeclarationList()) { | 2829 Context->getFunctionDeclarationList()) { |
2826 installDeclarationName(Trans, Func, FunctionPrefix, "function", | 2830 installDeclarationName(Trans, Func, FunctionPrefix, "function", |
2827 NameIndex); | 2831 NameIndex); |
2828 } | 2832 } |
2829 } | 2833 } |
2830 getTranslator().lowerGlobals(Context->getGlobalVariables()); | 2834 getTranslator().lowerGlobals(VariableDeclarations); |
2831 GlobalDeclarationNamesAndInitializersInstalled = true; | 2835 GlobalDeclarationNamesAndInitializersInstalled = true; |
2832 } | 2836 } |
2833 } | 2837 } |
2834 | 2838 |
2835 void installDeclarationName(Ice::Translator &Trans, | 2839 void installDeclarationName(Ice::Translator &Trans, |
2836 Ice::GlobalDeclaration *Decl, | 2840 Ice::GlobalDeclaration *Decl, |
2837 const Ice::IceString &Prefix, const char *Context, | 2841 const Ice::IceString &Prefix, const char *Context, |
2838 uint32_t &NameIndex) { | 2842 uint32_t &NameIndex) { |
2839 if (!Decl->hasName()) { | 2843 if (!Decl->hasName()) { |
2840 Decl->setName(Trans.createUnnamedName(Prefix, NameIndex)); | 2844 Decl->setName(Trans.createUnnamedName(Prefix, NameIndex)); |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3021 | 3025 |
3022 if (TopLevelBlocks != 1) { | 3026 if (TopLevelBlocks != 1) { |
3023 errs() << IRFilename | 3027 errs() << IRFilename |
3024 << ": Contains more than one module. Found: " << TopLevelBlocks | 3028 << ": Contains more than one module. Found: " << TopLevelBlocks |
3025 << "\n"; | 3029 << "\n"; |
3026 ErrorStatus.assign(EC_Bitcode); | 3030 ErrorStatus.assign(EC_Bitcode); |
3027 } | 3031 } |
3028 } | 3032 } |
3029 | 3033 |
3030 } // end of namespace Ice | 3034 } // end of namespace Ice |
OLD | NEW |