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

Unified Diff: src/PNaClTranslator.cpp

Issue 883493002: Remove unnecessary fields in top-level parser of Subzero. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix issues in last patch. Created 5 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/PNaClTranslator.cpp
diff --git a/src/PNaClTranslator.cpp b/src/PNaClTranslator.cpp
index dfe93ff99957601bf4c5c5366dd14e335ba79d92..4eb0c7e235f1369f27d2f24ef1e69e6b91834619 100644
--- a/src/PNaClTranslator.cpp
+++ b/src/PNaClTranslator.cpp
@@ -161,8 +161,8 @@ public:
TopLevelParser(Ice::Translator &Translator, NaClBitcodeHeader &Header,
NaClBitstreamCursor &Cursor, bool &ErrorStatus)
: NaClBitcodeParser(Cursor), Translator(Translator), Header(Header),
- ErrorStatus(ErrorStatus), NumErrors(0), NumFunctionIds(0),
- NumFunctionBlocks(0), BlockParser(nullptr) {}
+ ErrorStatus(ErrorStatus), NumErrors(0), NextDefiningFunctionID(0),
+ BlockParser(nullptr) {}
~TopLevelParser() override {}
@@ -227,24 +227,21 @@ public:
/// Sets the next function ID to the given LLVM function.
void setNextFunctionID(Ice::FunctionDeclaration *Fcn) {
- ++NumFunctionIds;
FunctionDeclarationList.push_back(Fcn);
}
- /// Defines the next function ID as one that has an implementation
- /// (i.e a corresponding function block in the bitcode).
- void setNextValueIDAsImplementedFunction() {
- DefiningFunctionDeclarationsList.push_back(FunctionDeclarationList.size());
- }
-
/// Returns the value id that should be associated with the the
/// current function block. Increments internal counters during call
/// so that it will be in correct position for next function block.
- unsigned getNextFunctionBlockValueID() {
- if (NumFunctionBlocks >= DefiningFunctionDeclarationsList.size())
+ size_t getNextFunctionBlockValueID() {
+ size_t NumDeclaredFunctions = FunctionDeclarationList.size();
+ while (NextDefiningFunctionID < NumDeclaredFunctions &&
+ FunctionDeclarationList[NextDefiningFunctionID]->isProto())
+ ++NextDefiningFunctionID;
+ if (NextDefiningFunctionID >= NumDeclaredFunctions)
report_fatal_error(
"More function blocks than defined function addresses");
- return DefiningFunctionDeclarationsList[NumFunctionBlocks++];
+ return NextDefiningFunctionID++;
}
/// Returns the function associated with ID.
@@ -313,7 +310,7 @@ public:
}
/// Returns the number of function declarations in the bitcode file.
- unsigned getNumFunctionIDs() const { return NumFunctionIds; }
+ unsigned getNumFunctionIDs() const { return FunctionDeclarationList.size(); }
/// Returns the number of global declarations (i.e. IDs) defined in
/// the bitcode file.
@@ -345,6 +342,7 @@ public:
/// Returns the global declaration (variable or function) with the
/// given Index.
Ice::GlobalDeclaration *getGlobalDeclarationByID(size_t Index) {
+ size_t NumFunctionIds = FunctionDeclarationList.size();
if (Index < NumFunctionIds)
return getFunctionByID(Index);
else
@@ -367,21 +365,19 @@ private:
unsigned NumErrors;
// The types associated with each type ID.
std::vector<ExtendedType> TypeIDValues;
- // The set of functions.
+ // The set of functions (prototype and defined).
FunctionDeclarationListType FunctionDeclarationList;
+ // The ID of the next possible defined function ID in
+ // FunctionDeclarationList. FunctionDeclarationList is filled
+ // first. It's the set of functions (either defined or isproto). Then
+ // function definitions are encountered/parsed and
+ // NextDefiningFunctionID is incremented to track the next
+ // actually-defined function.
+ size_t NextDefiningFunctionID;
// The set of global variables.
Ice::Translator::VariableDeclarationListType VariableDeclarations;
// Relocatable constants associated with global declarations.
std::vector<Ice::Constant *> ValueIDConstants;
- // The number of function declarations (i.e. IDs).
- unsigned NumFunctionIds;
- // The number of function blocks (processed so far).
- unsigned NumFunctionBlocks;
- // The list of function declaration IDs (in the order found) that
- // aren't just proto declarations.
- // TODO(kschimpf): Instead of using this list, just use
- // FunctionDeclarationList, and the isProto member function.
- std::vector<unsigned> DefiningFunctionDeclarationsList;
// Error recovery value to use when getFuncSigTypeByID fails.
Ice::FuncSigType UndefinedFuncSigType;
// The block parser currently being applied. Used for error
@@ -2913,10 +2909,9 @@ void ModuleParser::ProcessRecord() {
Error(StrBuf.str());
return;
}
+ bool IsProto = Values[2] == 1;
Ice::FunctionDeclaration *Func = Ice::FunctionDeclaration::create(
- Signature, CallingConv, Linkage, Values[2] == 0);
- if (Values[2] == 0)
- Context->setNextValueIDAsImplementedFunction();
+ Signature, CallingConv, Linkage, IsProto);
Context->setNextFunctionID(Func);
return;
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698