llvm-6502/lib/Bytecode/Reader/Analyzer.cpp

340 lines
7.2 KiB
C++
Raw Normal View History

//===-- BytecodeHandler.cpp - Parsing Handler -------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by Reid Spencer and is distributed under the
// University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This header file defines the BytecodeHandler class that gets called by the
// AbstractBytecodeParser when parsing events occur.
//
//===----------------------------------------------------------------------===//
#include "AnalyzerInternals.h"
#include <iostream>
using namespace llvm;
namespace {
class AnalyzerHandler : public BytecodeHandler {
BytecodeAnalysis& bca;
public:
AnalyzerHandler(BytecodeAnalysis& TheBca)
: bca(TheBca)
{
}
bool handleError(const std::string& str )
{
return false;
}
void handleStart()
{
bca.ModuleId.clear();
bca.numBlocks = 0;
bca.numTypes = 0;
bca.numValues = 0;
bca.numFunctions = 0;
bca.numConstants = 0;
bca.numGlobalVars = 0;
bca.numInstructions = 0;
bca.numBasicBlocks = 0;
bca.numOperands = 0;
bca.numCmpctnTables = 0;
bca.numSymTab = 0;
bca.maxTypeSlot = 0;
bca.maxValueSlot = 0;
bca.numAlignment = 0;
bca.fileDensity = 0.0;
bca.globalsDensity = 0.0;
bca.functionDensity = 0.0;
bca.vbrCount32 = 0;
bca.vbrCount64 = 0;
bca.vbrCompBytes = 0;
bca.vbrExpdBytes = 0;
bca.FunctionInfo.clear();
bca.BytecodeDump.clear();
bca.BlockSizes[BytecodeFormat::Module] = 0;
bca.BlockSizes[BytecodeFormat::Function] = 0;
bca.BlockSizes[BytecodeFormat::ConstantPool] = 0;
bca.BlockSizes[BytecodeFormat::SymbolTable] = 0;
bca.BlockSizes[BytecodeFormat::ModuleGlobalInfo] = 0;
bca.BlockSizes[BytecodeFormat::GlobalTypePlane] = 0;
bca.BlockSizes[BytecodeFormat::BasicBlock] = 0;
bca.BlockSizes[BytecodeFormat::InstructionList] = 0;
bca.BlockSizes[BytecodeFormat::CompactionTable] = 0;
}
void handleFinish()
{
bca.fileDensity = double(bca.byteSize) / double( bca.numTypes + bca.numValues );
double globalSize = 0.0;
globalSize += double(bca.BlockSizes[BytecodeFormat::ConstantPool]);
globalSize += double(bca.BlockSizes[BytecodeFormat::ModuleGlobalInfo]);
globalSize += double(bca.BlockSizes[BytecodeFormat::GlobalTypePlane]);
bca.globalsDensity = globalSize / double( bca.numTypes + bca.numConstants +
bca.numGlobalVars );
bca.functionDensity = double(bca.BlockSizes[BytecodeFormat::Function]) /
double(bca.numFunctions);
}
void handleModuleBegin(const std::string& id)
{
bca.ModuleId = id;
}
void handleModuleEnd(const std::string& id)
{
}
void handleVersionInfo(
unsigned char RevisionNum, ///< Byte code revision number
Module::Endianness Endianness, ///< Endianness indicator
Module::PointerSize PointerSize ///< PointerSize indicator
)
{
}
void handleModuleGlobalsBegin(unsigned size)
{
// bca.globalBytesize += size;
}
void handleGlobalVariable(
const Type* ElemType, ///< The type of the global variable
bool isConstant, ///< Whether the GV is constant or not
GlobalValue::LinkageTypes ///< The linkage type of the GV
)
{
bca.numGlobalVars++;
bca.numValues++;
}
void handleInitializedGV(
const Type* ElemType, ///< The type of the global variable
bool isConstant, ///< Whether the GV is constant or not
GlobalValue::LinkageTypes,///< The linkage type of the GV
unsigned initSlot ///< Slot number of GV's initializer
)
{
bca.numGlobalVars++;
bca.numValues++;
}
virtual void handleType( const Type* Ty )
{
bca.numTypes++;
}
void handleFunctionDeclaration(
const Type* FuncType ///< The type of the function
)
{
bca.numFunctions++;
bca.numValues++;
}
void handleModuleGlobalsEnd()
{
}
void handleCompactionTableBegin()
{
}
void handleCompactionTablePlane(
unsigned Ty,
unsigned NumEntries
)
{
bca.numCmpctnTables++;
}
void handleCompactionTableType(
unsigned i,
unsigned TypSlot,
const Type*
)
{
}
void handleCompactionTableValue(
unsigned i,
unsigned ValSlot,
const Type*
)
{
}
void handleCompactionTableEnd()
{
}
void handleSymbolTableBegin()
{
bca.numSymTab++;
}
void handleSymbolTablePlane(
unsigned Ty,
unsigned NumEntries,
const Type* Typ
)
{
}
void handleSymbolTableType(
unsigned i,
unsigned slot,
const std::string& name
)
{
}
void handleSymbolTableValue(
unsigned i,
unsigned slot,
const std::string& name
)
{
}
void handleSymbolTableEnd()
{
}
void handleFunctionBegin(
const Type* FType,
GlobalValue::LinkageTypes linkage
)
{
}
void handleFunctionEnd(
const Type* FType
)
{
}
void handleBasicBlockBegin(
unsigned blocknum
)
{
bca.numBasicBlocks++;
bca.numValues++;
}
bool handleInstruction(
unsigned Opcode,
const Type* iType,
std::vector<unsigned>& Operands,
unsigned Size
)
{
bca.numInstructions++;
bca.numValues++;
bca.numOperands += Operands.size();
return Instruction::isTerminator(Opcode);
}
void handleBasicBlockEnd(unsigned blocknum)
{
}
void handleGlobalConstantsBegin()
{
}
void handleConstantExpression(
unsigned Opcode,
const Type* Typ,
std::vector<std::pair<const Type*,unsigned> > ArgVec
)
{
bca.numConstants++;
bca.numValues++;
}
void handleConstantValue( Constant * c )
{
bca.numConstants++;
bca.numValues++;
}
void handleConstantArray(
const ArrayType* AT,
std::vector<unsigned>& Elements )
{
bca.numConstants++;
bca.numValues++;
}
void handleConstantStruct(
const StructType* ST,
std::vector<unsigned>& ElementSlots)
{
bca.numConstants++;
bca.numValues++;
}
void handleConstantPointer(
const PointerType* PT, unsigned Slot)
{
bca.numConstants++;
bca.numValues++;
}
void handleConstantString( const ConstantArray* CA )
{
bca.numConstants++;
bca.numValues++;
}
void handleGlobalConstantsEnd() { }
void handleAlignment(unsigned numBytes) {
bca.numAlignment += numBytes;
}
void handleBlock(
unsigned BType, const unsigned char* StartPtr, unsigned Size) {
bca.numBlocks++;
bca.BlockSizes[llvm::BytecodeFormat::FileBlockIDs(BType)] += Size;
}
virtual void handleVBR32(unsigned Size ) {
bca.vbrCount32++;
bca.vbrCompBytes += Size;
bca.vbrExpdBytes += sizeof(uint32_t);
}
virtual void handleVBR64(unsigned Size ) {
bca.vbrCount64++;
bca.vbrCompBytes += Size;
bca.vbrExpdBytes += sizeof(uint64_t);
}
};
}
void llvm::BytecodeAnalyzer::AnalyzeBytecode(
const unsigned char *Buf,
unsigned Length,
BytecodeAnalysis& bca,
const std::string &ModuleID
)
{
bca.byteSize = Length;
AnalyzerHandler TheHandler(bca);
AbstractBytecodeParser TheParser(&TheHandler, true, true, true);
TheParser.ParseBytecode( Buf, Length, ModuleID );
TheParser.ParseAllFunctionBodies();
}
// vim: sw=2