Chromium Code Reviews| Index: src/PNaClTranslator.cpp |
| diff --git a/src/PNaClTranslator.cpp b/src/PNaClTranslator.cpp |
| index 552ee6009622d22f676c174af3c6f3f33d6bbf7b..f5820141a41c1051e6154d723ac5bb5202eb6ea5 100644 |
| --- a/src/PNaClTranslator.cpp |
| +++ b/src/PNaClTranslator.cpp |
| @@ -163,6 +163,7 @@ public: |
| NaClBitstreamCursor &Cursor, Ice::ErrorCode &ErrorStatus) |
| : NaClBitcodeParser(Cursor), Translator(Translator), Header(Header), |
| ErrorStatus(ErrorStatus), NumErrors(0), NextDefiningFunctionID(0), |
| + VariableDeclarations(new Ice::VariableDeclarationList), |
| BlockParser(nullptr), StubbedConstCallValue(nullptr) {} |
| ~TopLevelParser() override {} |
| @@ -265,7 +266,7 @@ public: |
| if (ID >= ValueIDConstants.size()) { |
| C = nullptr; |
| unsigned ExpectedSize = |
| - FunctionDeclarationList.size() + VariableDeclarations.size(); |
| + FunctionDeclarationList.size() + VariableDeclarations->size(); |
| if (ID >= ExpectedSize) |
| ExpectedSize = ID; |
| ValueIDConstants.resize(ExpectedSize); |
| @@ -289,8 +290,8 @@ public: |
| Decl = FunctionDeclarationList[ID]; |
| const auto Func = llvm::cast<Ice::FunctionDeclaration>(Decl); |
| IsUndefined = Func->isProto(); |
| - } else if ((ID - FcnIDSize) < VariableDeclarations.size()) { |
| - Decl = VariableDeclarations[ID - FcnIDSize]; |
| + } else if ((ID - FcnIDSize) < VariableDeclarations->size()) { |
| + Decl = VariableDeclarations->at(ID - FcnIDSize); |
| const auto Var = llvm::cast<Ice::VariableDeclaration>(Decl); |
| IsUndefined = !Var->hasInitializer(); |
| } |
| @@ -343,27 +344,27 @@ public: |
| /// Returns the number of global declarations (i.e. IDs) defined in |
| /// the bitcode file. |
| unsigned getNumGlobalIDs() const { |
| - return FunctionDeclarationList.size() + VariableDeclarations.size(); |
| + return FunctionDeclarationList.size() + VariableDeclarations->size(); |
| } |
| /// Creates Count global variable declarations. |
| void CreateGlobalVariables(size_t Count) { |
| - assert(VariableDeclarations.empty()); |
| + assert(VariableDeclarations->empty()); |
| for (size_t i = 0; i < Count; ++i) { |
| - VariableDeclarations.push_back(Ice::VariableDeclaration::create()); |
| + VariableDeclarations->push_back(Ice::VariableDeclaration::create()); |
| } |
| } |
| /// Returns the number of global variable declarations in the |
| /// bitcode file. |
| Ice::SizeT getNumGlobalVariables() const { |
| - return VariableDeclarations.size(); |
| + return VariableDeclarations->size(); |
| } |
| /// Returns the global variable declaration with the given index. |
| Ice::VariableDeclaration *getGlobalVariableByID(unsigned Index) { |
| - if (Index < VariableDeclarations.size()) |
| - return VariableDeclarations[Index]; |
| + if (Index < VariableDeclarations->size()) |
| + return VariableDeclarations->at(Index); |
| return reportGetGlobalVariableByIDError(Index); |
| } |
| @@ -378,7 +379,7 @@ public: |
| } |
| /// Returns the list of parsed global variable declarations. |
| - const Ice::VariableDeclarationList &getGlobalVariables() { |
| + Ice::VariableDeclarationList *getGlobalVariables() { |
| return VariableDeclarations; |
| } |
| @@ -403,7 +404,7 @@ private: |
| // actually-defined function. |
| size_t NextDefiningFunctionID; |
| // The set of global variables. |
| - Ice::VariableDeclarationList VariableDeclarations; |
| + Ice::VariableDeclarationList *VariableDeclarations; |
|
JF
2015/02/08 00:29:47
Why this change?
Also, unique_ptr.
Jim Stichnoth
2015/02/10 07:51:46
It was changed because this is the part that gets
|
| // Relocatable constants associated with global declarations. |
| std::vector<Ice::Constant *> ValueIDConstants; |
| // Error recovery value to use when getFuncSigTypeByID fails. |
| @@ -495,11 +496,11 @@ TopLevelParser::reportGetGlobalVariableByIDError(unsigned Index) { |
| raw_string_ostream StrBuf(Buffer); |
| StrBuf << "Global index " << Index |
| << " not allowed. Out of range. Must be less than " |
| - << VariableDeclarations.size(); |
| + << VariableDeclarations->size(); |
| BlockError(StrBuf.str()); |
| // TODO(kschimpf) Remove error recovery once implementation complete. |
| - if (!VariableDeclarations.empty()) |
| - return VariableDeclarations[0]; |
| + if (!VariableDeclarations->empty()) |
| + return VariableDeclarations->at(0); |
| report_fatal_error("Unable to continue"); |
| } |
| @@ -1099,7 +1100,8 @@ public: |
| } |
| if (!isIRGenerationDisabled()) |
| - Func = Ice::Cfg::create(getTranslator().getContext()); |
| + Func = Ice::Cfg::create(getTranslator().getContext(), |
| + getTranslator().getNextSequenceNumber()); |
| Ice::Cfg::setCurrentCfg(Func.get()); |
| // TODO(kschimpf) Clean up API to add a function signature to |
| @@ -1134,7 +1136,7 @@ public: |
| // translation of all remaining functions. This allows successive |
| // parsing errors to be reported, without adding extra checks to |
| // the translator for such parsing errors. |
| - if (Context->getNumErrors() == 0) { |
| + if (Context->getNumErrors() == 0 && Func) { |
| getTranslator().translateFcn(std::move(Func)); |
| // The translator now has ownership of Func. |
| } else { |
| @@ -2810,11 +2812,13 @@ private: |
| // the first call will do the installation. |
| void InstallGlobalNamesAndGlobalVarInitializers() { |
| if (!GlobalDeclarationNamesAndInitializersInstalled) { |
| + Ice::VariableDeclarationList *VariableDeclarations = |
| + Context->getGlobalVariables(); |
| Ice::Translator &Trans = getTranslator(); |
| const Ice::IceString &GlobalPrefix = getFlags().DefaultGlobalPrefix; |
| if (!GlobalPrefix.empty()) { |
| uint32_t NameIndex = 0; |
| - for (Ice::VariableDeclaration *Var : Context->getGlobalVariables()) { |
| + for (Ice::VariableDeclaration *Var : *VariableDeclarations) { |
| installDeclarationName(Trans, Var, GlobalPrefix, "global", NameIndex); |
| } |
| } |
| @@ -2827,7 +2831,7 @@ private: |
| NameIndex); |
| } |
| } |
| - getTranslator().lowerGlobals(Context->getGlobalVariables()); |
| + getTranslator().lowerGlobals(VariableDeclarations); |
| GlobalDeclarationNamesAndInitializersInstalled = true; |
| } |
| } |