diff options
Diffstat (limited to 'lib/Bytecode/Reader/AnalyzerWrappers.cpp')
-rw-r--r-- | lib/Bytecode/Reader/AnalyzerWrappers.cpp | 137 |
1 files changed, 114 insertions, 23 deletions
diff --git a/lib/Bytecode/Reader/AnalyzerWrappers.cpp b/lib/Bytecode/Reader/AnalyzerWrappers.cpp index 2caf069eb4..fd23dc8086 100644 --- a/lib/Bytecode/Reader/AnalyzerWrappers.cpp +++ b/lib/Bytecode/Reader/AnalyzerWrappers.cpp @@ -18,6 +18,7 @@ #include "Support/StringExtras.h" #include "Config/unistd.h" #include <cerrno> +#include <iomanip> using namespace llvm; @@ -46,7 +47,7 @@ static std::string ErrnoMessage (int savedErrNum, std::string descr) { } BytecodeFileAnalyzer::BytecodeFileAnalyzer(const std::string &Filename, - BytecodeAnalysis& bca) { + BytecodeAnalysis& bca) { Buffer = (unsigned char*)ReadFileIntoAddressSpace(Filename, Length); if (Buffer == 0) throw "Error reading file '" + Filename + "'."; @@ -84,16 +85,16 @@ namespace { public: BytecodeBufferAnalyzer(const unsigned char *Buf, unsigned Length, - BytecodeAnalysis& bca, const std::string &ModuleID); + BytecodeAnalysis& bca, const std::string &ModuleID); ~BytecodeBufferAnalyzer(); }; } BytecodeBufferAnalyzer::BytecodeBufferAnalyzer(const unsigned char *Buf, - unsigned Length, - BytecodeAnalysis& bca, - const std::string &ModuleID) { + unsigned Length, + BytecodeAnalysis& bca, + const std::string &ModuleID) { // If not aligned, allocate a new buffer to hold the bytecode... const unsigned char *ParseBegin = 0; if ((intptr_t)Buf & 3) { @@ -200,28 +201,118 @@ void llvm::AnalyzeBytecodeBuffer( /// This function prints the contents of rhe BytecodeAnalysis structure in /// a human legible form. /// @brief Print BytecodeAnalysis structure to an ostream +namespace { +inline static void print(std::ostream& Out, const char*title, + unsigned val, bool nl = true ) { + Out << std::setw(30) << std::right << title + << std::setw(0) << ": " + << std::setw(9) << val << "\n"; +} + +inline static void print(std::ostream&Out, const char*title, + double val ) { + Out << std::setw(30) << std::right << title + << std::setw(0) << ": " + << std::setw(9) << std::setprecision(6) << val << "\n" ; +} + +inline static void print(std::ostream&Out, const char*title, + double top, double bot ) { + Out << std::setw(30) << std::right << title + << std::setw(0) << ": " + << std::setw(9) << std::setprecision(6) << top + << " (" << std::left << std::setw(0) << std::setprecision(4) + << (top/bot)*100.0 << "%)\n"; +} +inline static void print(std::ostream&Out, const char*title, + std::string val, bool nl = true) { + Out << std::setw(30) << std::right << title + << std::setw(0) << ": " + << std::left << val << (nl ? "\n" : ""); +} + +} + void llvm::PrintBytecodeAnalysis(BytecodeAnalysis& bca, std::ostream& Out ) { - Out << " Bytecode Analysis of: " << bca.ModuleId << "\n"; - Out << " File Size: " << bca.byteSize << "\n"; - Out << " Number Of Types: " << bca.numTypes << "\n"; - Out << " Number Of Constants: " << bca.numConstants << "\n"; - Out << " Number Of Global Variables: " << bca.numGlobalVars << "\n"; - Out << " Number Of Functions: " << bca.numFunctions << "\n"; - Out << " Number Of Basic Blocks: " << bca.numBasicBlocks << "\n"; - Out << " Number Of Instructions: " << bca.numInstructions << "\n"; - Out << " Number Of Operands: " << bca.numOperands << "\n"; - Out << "Number Of Compaction Tables: " << bca.numCmpctnTables << "\n"; - Out << " Number Of Symbol Tables: " << bca.numSymTab << "\n"; - Out << " Maximum Type Slot Number: " << bca.maxTypeSlot << "\n"; - Out << " Maximum Value Slot Number: " << bca.maxValueSlot << "\n"; - Out << " Bytecode Density: " << bca.density << "\n"; - - if ( bca.detailedResults ) - Out << "Detailed Results Not Implemented Yet.\n"; + print(Out, "Bytecode Analysis Of Module", bca.ModuleId); + print(Out, "File Size", bca.byteSize); + print(Out, "Bytecode Compression Index",std::string("TBD")); + print(Out, "Number Of Bytecode Blocks", bca.numBlocks); + print(Out, "Number Of Types", bca.numTypes); + print(Out, "Number Of Values", bca.numValues); + print(Out, "Number Of Constants", bca.numConstants); + print(Out, "Number Of Global Variables", bca.numGlobalVars); + print(Out, "Number Of Functions", bca.numFunctions); + print(Out, "Number Of Basic Blocks", bca.numBasicBlocks); + print(Out, "Number Of Instructions", bca.numInstructions); + print(Out, "Number Of Operands", bca.numOperands); + print(Out, "Number Of Compaction Tables", bca.numCmpctnTables); + print(Out, "Number Of Symbol Tables", bca.numSymTab); + print(Out, "Maximum Type Slot Number", bca.maxTypeSlot); + print(Out, "Maximum Value Slot Number", bca.maxValueSlot); + print(Out, "Bytes Thrown To Alignment", double(bca.numAlignment), + double(bca.byteSize)); + print(Out, "File Density (bytes/def)", bca.fileDensity); + print(Out, "Globals Density (bytes/def)", bca.globalsDensity); + print(Out, "Function Density (bytes/func)", bca.functionDensity); + print(Out, "Number of VBR 32-bit Integers", bca.vbrCount32); + print(Out, "Number of VBR 64-bit Integers", bca.vbrCount64); + print(Out, "Number of VBR Compressed Bytes", bca.vbrCompBytes); + print(Out, "Number of VBR Expanded Bytes", bca.vbrExpdBytes); + print(Out, "VBR Savings", + double(bca.vbrExpdBytes)-double(bca.vbrCompBytes), + double(bca.byteSize)); + + if ( bca.detailedResults ) { + print(Out, "Module Bytes", + double(bca.BlockSizes[BytecodeFormat::Module]), + double(bca.byteSize)); + print(Out, "Function Bytes", + double(bca.BlockSizes[BytecodeFormat::Function]), + double(bca.byteSize)); + print(Out, "Constant Pool Bytes", + double(bca.BlockSizes[BytecodeFormat::ConstantPool]), + double(bca.byteSize)); + print(Out, "Symbol Table Bytes", + double(bca.BlockSizes[BytecodeFormat::SymbolTable]), + double(bca.byteSize)); + print(Out, "Module Global Info Bytes", + double(bca.BlockSizes[BytecodeFormat::ModuleGlobalInfo]), + double(bca.byteSize)); + print(Out, "Global Type Plane Bytes", + double(bca.BlockSizes[BytecodeFormat::GlobalTypePlane]), + double(bca.byteSize)); + print(Out, "Basic Block Bytes", + double(bca.BlockSizes[BytecodeFormat::BasicBlock]), + double(bca.byteSize)); + print(Out, "Instruction List Bytes", + double(bca.BlockSizes[BytecodeFormat::InstructionList]), + double(bca.byteSize)); + print(Out, "Compaction Table Bytes", + double(bca.BlockSizes[BytecodeFormat::CompactionTable]), + double(bca.byteSize)); + + std::map<unsigned,BytecodeAnalysis::BytecodeFunctionInfo>::iterator I = + bca.FunctionInfo.begin(); + std::map<unsigned,BytecodeAnalysis::BytecodeFunctionInfo>::iterator E = + bca.FunctionInfo.end(); + + while ( I != E ) { + Out << std::left << std::setw(0); + Out << "Function: " << I->second.name << " Slot=" << I->first << "\n"; + print(Out,"Type:", I->second.description); + print(Out,"Byte Size", I->second.byteSize); + print(Out,"Instructions", I->second.numInstructions); + print(Out,"Basic Blocks", I->second.numBasicBlocks); + print(Out,"Operand", I->second.numOperands); + print(Out,"Function Density", I->second.density); + print(Out,"VBR Effectiveness", I->second.vbrEffectiveness); + ++I; + } + } if ( bca.dumpBytecode ) Out << bca.BytecodeDump; } - // vim: sw=2 |