aboutsummaryrefslogtreecommitdiff
path: root/lib/Bytecode/Reader/Reader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Bytecode/Reader/Reader.cpp')
-rw-r--r--lib/Bytecode/Reader/Reader.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp
index 8d0df020ec..14f6c9f7e2 100644
--- a/lib/Bytecode/Reader/Reader.cpp
+++ b/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 ) {