aboutsummaryrefslogtreecommitdiff
path: root/lib/Bytecode/Reader/AnalyzerWrappers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Bytecode/Reader/AnalyzerWrappers.cpp')
-rw-r--r--lib/Bytecode/Reader/AnalyzerWrappers.cpp137
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