}
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";
}
}
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";
}
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) {
}
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];
}
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);
}
virtual void handleBasicBlockBegin( unsigned blocknum) {
- dump << " BLOCK: BasicBlock #" << blocknum << "{\n";
+ dump << " BLOCK: BasicBlock #" << blocknum << "{\n";
bca.numBasicBlocks++;
bca.numValues++;
if ( currFunc ) currFunc->numBasicBlocks++;
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++;
}
virtual void handleBasicBlockEnd(unsigned blocknum) {
- dump << " } END BLOCK: BasicBlock #" << blocknum << "{\n";
+ dump << " } END BLOCK: BasicBlock #" << blocknum << "{\n";
}
virtual void handleGlobalConstantsBegin() {
BB = ParsedBasicBlocks[BlockNo] = new BasicBlock();
else
BB = ParsedBasicBlocks[BlockNo];
- if (Handler) Handler->handleBasicBlockEnd( BlockNo );
++BlockNo;
F->getBasicBlockList().push_back(BB);
if (!BB->getTerminator())
throw std::string("Non-terminated basic block found!");
+
+ if (Handler) Handler->handleBasicBlockEnd( BlockNo-1 );
}
return BlockNo;
/// 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;
// 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 ) {
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
try {
// Parse the bytecode we mmapped in
- ParseBytecode(Buffer, Length, Filename);
+ ParseBytecode(Buffer, Length, Filename, H != 0);
} catch (...) {
UnmapFileFromAddressSpace(Buffer, Length);
throw;
MustDelete = false;
}
try {
- ParseBytecode(ParseBegin, Length, ModuleID);
+ ParseBytecode(ParseBegin, Length, ModuleID, H != 0);
} catch (...) {
if (MustDelete) delete [] Buffer;
throw;
throw std::string("Standard Input empty!");
FileBuf = &FileData[0];
- ParseBytecode(FileBuf, FileData.size(), "<stdin>");
+ ParseBytecode(FileBuf, FileData.size(), "<stdin>", H != 0 );
}
//===----------------------------------------------------------------------===//