summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Bytecode/Reader/Analyzer.cpp35
-rw-r--r--llvm/lib/Bytecode/Reader/Reader.cpp19
-rw-r--r--llvm/lib/Bytecode/Reader/Reader.h7
-rw-r--r--llvm/lib/Bytecode/Reader/ReaderWrappers.cpp6
4 files changed, 38 insertions, 29 deletions
diff --git a/llvm/lib/Bytecode/Reader/Analyzer.cpp b/llvm/lib/Bytecode/Reader/Analyzer.cpp
index 1f29b2242da..6defe27b010 100644
--- a/llvm/lib/Bytecode/Reader/Analyzer.cpp
+++ b/llvm/lib/Bytecode/Reader/Analyzer.cpp
@@ -185,9 +185,9 @@ public:
}
virtual void handleGlobalInitializer(GlobalVariable* GV, Constant* CV) {
- dump << " Initializer: GV=";
+ dump << " Initializer: GV=";
GV->print(dump);
- dump << " CV=";
+ dump << " CV=";
CV->print(dump);
dump << "\n";
}
@@ -204,17 +204,17 @@ public:
}
virtual void handleCompactionTableBegin() {
- dump << " BLOCK: CompactionTable {\n";
+ dump << " BLOCK: CompactionTable {\n";
}
virtual void handleCompactionTablePlane( unsigned Ty, unsigned NumEntries) {
bca.numCmpctnTables++;
- dump << " Plane: Ty=" << Ty << " Size=" << NumEntries << "\n";
+ dump << " Plane: Ty=" << Ty << " Size=" << NumEntries << "\n";
}
virtual void handleCompactionTableType( unsigned i, unsigned TypSlot,
const Type* Ty ) {
- dump << " Type: " << i << " Slot:" << TypSlot
+ dump << " Type: " << i << " Slot:" << TypSlot
<< " is " << Ty->getDescription() << "\n";
}
@@ -223,13 +223,13 @@ public:
unsigned TypSlot,
unsigned ValSlot,
const Type* Ty ) {
- dump << " Value: " << i << " TypSlot: " << TypSlot
+ dump << " Value: " << i << " TypSlot: " << TypSlot
<< " ValSlot:" << ValSlot << " is " << Ty->getDescription()
<< "\n";
}
virtual void handleCompactionTableEnd() {
- dump << " } END BLOCK: CompactionTable\n";
+ dump << " } END BLOCK: CompactionTable\n";
}
virtual void handleSymbolTableBegin(Function* CF, SymbolTable* ST) {
@@ -260,9 +260,9 @@ public:
}
virtual void handleFunctionBegin(Function* Func, unsigned Size) {
- dump << "BLOCK: Function {\n";
- dump << " Linkage: " << Func->getLinkage() << "\n";
- dump << " Type: " << Func->getType()->getDescription() << "\n";
+ dump << " BLOCK: Function {\n";
+ dump << " Linkage: " << Func->getLinkage() << "\n";
+ dump << " Type: " << Func->getType()->getDescription() << "\n";
const FunctionType* FType =
cast<FunctionType>(Func->getType()->getElementType());
currFunc = &bca.FunctionInfo[Func];
@@ -284,7 +284,7 @@ public:
}
virtual void handleFunctionEnd( Function* Func) {
- dump << "} END BLOCK: Function\n";
+ dump << " } END BLOCK: Function\n";
currFunc->density = double(currFunc->byteSize) /
double(currFunc->numInstructions+currFunc->numBasicBlocks);
@@ -298,7 +298,7 @@ public:
}
virtual void handleBasicBlockBegin( unsigned blocknum) {
- dump << " BLOCK: BasicBlock #" << blocknum << "{\n";
+ dump << " BLOCK: BasicBlock #" << blocknum << "{\n";
bca.numBasicBlocks++;
bca.numValues++;
if ( currFunc ) currFunc->numBasicBlocks++;
@@ -306,11 +306,12 @@ public:
virtual bool handleInstruction( unsigned Opcode, const Type* iType,
std::vector<unsigned>& Operands, unsigned Size){
- dump << " INST: OpCode="
- << Instruction::getOpcodeName(Opcode) << " Type="
- << iType->getDescription() << "\n";
+ dump << " INST: OpCode="
+ << Instruction::getOpcodeName(Opcode) << " Type=\""
+ << iType->getDescription() << "\"";
for ( unsigned i = 0; i < Operands.size(); ++i )
- dump << " Op#" << i << " Slot=" << Operands[i] << "\n";
+ dump << " Op(" << i << ")=Slot(" << Operands[i] << ")";
+ dump << "\n";
bca.numInstructions++;
bca.numValues++;
@@ -327,7 +328,7 @@ public:
}
virtual void handleBasicBlockEnd(unsigned blocknum) {
- dump << " } END BLOCK: BasicBlock #" << blocknum << "{\n";
+ dump << " } END BLOCK: BasicBlock #" << blocknum << "{\n";
}
virtual void handleGlobalConstantsBegin() {
diff --git a/llvm/lib/Bytecode/Reader/Reader.cpp b/llvm/lib/Bytecode/Reader/Reader.cpp
index 8d0df020ec3..14f6c9f7e27 100644
--- a/llvm/lib/Bytecode/Reader/Reader.cpp
+++ b/llvm/lib/Bytecode/Reader/Reader.cpp
@@ -894,7 +894,6 @@ unsigned BytecodeReader::ParseInstructionList(Function* F) {
BB = ParsedBasicBlocks[BlockNo] = new BasicBlock();
else
BB = ParsedBasicBlocks[BlockNo];
- if (Handler) Handler->handleBasicBlockEnd( BlockNo );
++BlockNo;
F->getBasicBlockList().push_back(BB);
@@ -904,6 +903,8 @@ unsigned BytecodeReader::ParseInstructionList(Function* F) {
if (!BB->getTerminator())
throw std::string("Non-terminated basic block found!");
+
+ if (Handler) Handler->handleBasicBlockEnd( BlockNo-1 );
}
return BlockNo;
@@ -1898,7 +1899,8 @@ void BytecodeReader::ParseModule() {
/// and \p Length parameters.
void BytecodeReader::ParseBytecode(
BufPtr Buf, unsigned Length,
- const std::string &ModuleID) {
+ const std::string &ModuleID,
+ bool processFunctions) {
try {
At = MemStart = BlockStart = Buf;
@@ -1934,14 +1936,19 @@ void BytecodeReader::ParseBytecode(
// Parse the module contents
this->ParseModule();
- // Tell the handler we're done
- if (Handler) Handler->handleModuleEnd(ModuleID);
-
// Check for missing functions
if ( hasFunctions() )
throw std::string("Function expected, but bytecode stream ended!");
- // Tell the handler we're
+ // Process all the function bodies now, if requested
+ if ( processFunctions )
+ ParseAllFunctionBodies();
+
+ // Tell the handler we're done with the module
+ if (Handler)
+ Handler->handleModuleEnd(ModuleID);
+
+ // Tell the handler we're finished the parse
if (Handler) Handler->handleFinish();
} catch (std::string& errstr ) {
diff --git a/llvm/lib/Bytecode/Reader/Reader.h b/llvm/lib/Bytecode/Reader/Reader.h
index 20801da94f6..4720e88a3cf 100644
--- a/llvm/lib/Bytecode/Reader/Reader.h
+++ b/llvm/lib/Bytecode/Reader/Reader.h
@@ -127,9 +127,10 @@ public:
public:
/// @brief Main interface to parsing a bytecode buffer.
void ParseBytecode(
- const unsigned char *Buf, ///< Beginning of the bytecode buffer
- unsigned Length, ///< Length of the bytecode buffer
- const std::string &ModuleID ///< An identifier for the module constructed.
+ const unsigned char *Buf, ///< Beginning of the bytecode buffer
+ unsigned Length, ///< Length of the bytecode buffer
+ const std::string &ModuleID, ///< An identifier for the module constructed.
+ bool processFunctions=false ///< Process all function bodies fully.
);
/// @brief Parse all function bodies
diff --git a/llvm/lib/Bytecode/Reader/ReaderWrappers.cpp b/llvm/lib/Bytecode/Reader/ReaderWrappers.cpp
index 42d2b0e2a18..f8f1101a018 100644
--- a/llvm/lib/Bytecode/Reader/ReaderWrappers.cpp
+++ b/llvm/lib/Bytecode/Reader/ReaderWrappers.cpp
@@ -58,7 +58,7 @@ BytecodeFileReader::BytecodeFileReader(const std::string &Filename,
try {
// Parse the bytecode we mmapped in
- ParseBytecode(Buffer, Length, Filename);
+ ParseBytecode(Buffer, Length, Filename, H != 0);
} catch (...) {
UnmapFileFromAddressSpace(Buffer, Length);
throw;
@@ -114,7 +114,7 @@ BytecodeBufferReader::BytecodeBufferReader(const unsigned char *Buf,
MustDelete = false;
}
try {
- ParseBytecode(ParseBegin, Length, ModuleID);
+ ParseBytecode(ParseBegin, Length, ModuleID, H != 0);
} catch (...) {
if (MustDelete) delete [] Buffer;
throw;
@@ -163,7 +163,7 @@ BytecodeStdinReader::BytecodeStdinReader( BytecodeHandler* H )
throw std::string("Standard Input empty!");
FileBuf = &FileData[0];
- ParseBytecode(FileBuf, FileData.size(), "<stdin>");
+ ParseBytecode(FileBuf, FileData.size(), "<stdin>", H != 0 );
}
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud