diff options
-rw-r--r-- | llvm/lib/Bytecode/Reader/Analyzer.cpp | 35 | ||||
-rw-r--r-- | llvm/lib/Bytecode/Reader/Reader.cpp | 19 | ||||
-rw-r--r-- | llvm/lib/Bytecode/Reader/Reader.h | 7 | ||||
-rw-r--r-- | llvm/lib/Bytecode/Reader/ReaderWrappers.cpp | 6 |
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 ); } //===----------------------------------------------------------------------===// |