mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-23 14:25:07 +00:00
Implemented the bulk of the functionality. Cleaned up the code.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14113 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -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";
|
||||
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 )
|
||||
Out << "Detailed Results Not Implemented Yet.\n";
|
||||
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
|
||||
|
Reference in New Issue
Block a user