| 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;
|
| // 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;
|
| }
|
| }
|
|
|