2004-06-07 17:53:43 +00:00
|
|
|
//===-- 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"
|
2004-06-09 06:16:43 +00:00
|
|
|
#include <iostream>
|
2004-06-07 17:53:43 +00:00
|
|
|
|
|
|
|
using namespace llvm;
|
|
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
class AnalyzerHandler : public BytecodeHandler {
|
2004-06-09 06:16:43 +00:00
|
|
|
BytecodeAnalysis& bca;
|
2004-06-07 17:53:43 +00:00
|
|
|
public:
|
2004-06-09 06:16:43 +00:00
|
|
|
AnalyzerHandler(BytecodeAnalysis& TheBca)
|
|
|
|
: bca(TheBca)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2004-06-07 17:53:43 +00:00
|
|
|
bool handleError(const std::string& str )
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleStart()
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.ModuleId.clear();
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numBlocks = 0;
|
2004-06-09 06:16:43 +00:00
|
|
|
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;
|
2004-06-10 08:09:13 +00:00
|
|
|
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;
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.FunctionInfo.clear();
|
|
|
|
bca.BytecodeDump.clear();
|
2004-06-10 08:09:13 +00:00
|
|
|
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;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleFinish()
|
|
|
|
{
|
2004-06-10 08:09:13 +00:00
|
|
|
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);
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleModuleBegin(const std::string& id)
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.ModuleId = id;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2004-06-10 08:09:13 +00:00
|
|
|
void handleModuleGlobalsBegin(unsigned size)
|
2004-06-07 17:53:43 +00:00
|
|
|
{
|
2004-06-10 08:09:13 +00:00
|
|
|
// bca.globalBytesize += size;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
)
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numGlobalVars++;
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numValues++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
)
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numGlobalVars++;
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numValues++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
virtual void handleType( const Type* Ty )
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numTypes++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleFunctionDeclaration(
|
|
|
|
const Type* FuncType ///< The type of the function
|
|
|
|
)
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numFunctions++;
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numValues++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleModuleGlobalsEnd()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleCompactionTableBegin()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleCompactionTablePlane(
|
|
|
|
unsigned Ty,
|
|
|
|
unsigned NumEntries
|
|
|
|
)
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numCmpctnTables++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleCompactionTableType(
|
|
|
|
unsigned i,
|
|
|
|
unsigned TypSlot,
|
|
|
|
const Type*
|
|
|
|
)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleCompactionTableValue(
|
|
|
|
unsigned i,
|
|
|
|
unsigned ValSlot,
|
|
|
|
const Type*
|
|
|
|
)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleCompactionTableEnd()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleSymbolTableBegin()
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numSymTab++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
)
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numBasicBlocks++;
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numValues++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool handleInstruction(
|
|
|
|
unsigned Opcode,
|
|
|
|
const Type* iType,
|
2004-06-10 08:09:13 +00:00
|
|
|
std::vector<unsigned>& Operands,
|
|
|
|
unsigned Size
|
2004-06-07 17:53:43 +00:00
|
|
|
)
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numInstructions++;
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numValues++;
|
|
|
|
bca.numOperands += Operands.size();
|
2004-06-09 06:16:43 +00:00
|
|
|
return Instruction::isTerminator(Opcode);
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleBasicBlockEnd(unsigned blocknum)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleGlobalConstantsBegin()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleConstantExpression(
|
|
|
|
unsigned Opcode,
|
|
|
|
const Type* Typ,
|
|
|
|
std::vector<std::pair<const Type*,unsigned> > ArgVec
|
|
|
|
)
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numConstants++;
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numValues++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleConstantValue( Constant * c )
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numConstants++;
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numValues++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleConstantArray(
|
2004-06-10 08:09:13 +00:00
|
|
|
const ArrayType* AT,
|
|
|
|
std::vector<unsigned>& Elements )
|
2004-06-07 17:53:43 +00:00
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numConstants++;
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numValues++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleConstantStruct(
|
2004-06-10 08:09:13 +00:00
|
|
|
const StructType* ST,
|
|
|
|
std::vector<unsigned>& ElementSlots)
|
2004-06-07 17:53:43 +00:00
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numConstants++;
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numValues++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleConstantPointer(
|
2004-06-10 08:09:13 +00:00
|
|
|
const PointerType* PT, unsigned Slot)
|
2004-06-07 17:53:43 +00:00
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numConstants++;
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numValues++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleConstantString( const ConstantArray* CA )
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.numConstants++;
|
2004-06-10 08:09:13 +00:00
|
|
|
bca.numValues++;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-06-10 08:09:13 +00:00
|
|
|
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;
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
2004-06-10 08:09:13 +00:00
|
|
|
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);
|
|
|
|
}
|
2004-06-07 17:53:43 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void llvm::BytecodeAnalyzer::AnalyzeBytecode(
|
|
|
|
const unsigned char *Buf,
|
|
|
|
unsigned Length,
|
|
|
|
BytecodeAnalysis& bca,
|
|
|
|
const std::string &ModuleID
|
|
|
|
)
|
|
|
|
{
|
2004-06-09 06:16:43 +00:00
|
|
|
bca.byteSize = Length;
|
|
|
|
AnalyzerHandler TheHandler(bca);
|
2004-06-10 08:09:13 +00:00
|
|
|
AbstractBytecodeParser TheParser(&TheHandler, true, true, true);
|
2004-06-07 17:53:43 +00:00
|
|
|
TheParser.ParseBytecode( Buf, Length, ModuleID );
|
2004-06-10 08:09:13 +00:00
|
|
|
TheParser.ParseAllFunctionBodies();
|
2004-06-07 17:53:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// vim: sw=2
|