Implement some rudimentary analysis.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14090 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reid Spencer 2004-06-09 06:16:43 +00:00
parent 0545b3e673
commit 649ee57b1d
2 changed files with 94 additions and 6 deletions

View File

@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "AnalyzerInternals.h" #include "AnalyzerInternals.h"
#include <iostream>
using namespace llvm; using namespace llvm;
@ -20,22 +21,49 @@ using namespace llvm;
namespace { namespace {
class AnalyzerHandler : public BytecodeHandler { class AnalyzerHandler : public BytecodeHandler {
BytecodeAnalysis& bca;
public: public:
AnalyzerHandler(BytecodeAnalysis& TheBca)
: bca(TheBca)
{
}
bool handleError(const std::string& str ) bool handleError(const std::string& str )
{ {
std::cerr << "Analysis Error: " << str;
return false; return false;
} }
void handleStart() void handleStart()
{ {
bca.ModuleId.clear();
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.density = 0.0;
bca.FunctionInfo.clear();
bca.BytecodeDump.clear();
} }
void handleFinish() void handleFinish()
{ {
bca.density = bca.numTypes + bca.numFunctions + bca.numConstants +
bca.numGlobalVars + bca.numInstructions;
bca.density /= bca.byteSize;
} }
void handleModuleBegin(const std::string& id) void handleModuleBegin(const std::string& id)
{ {
bca.ModuleId = id;
} }
void handleModuleEnd(const std::string& id) void handleModuleEnd(const std::string& id)
@ -60,6 +88,7 @@ public:
GlobalValue::LinkageTypes ///< The linkage type of the GV GlobalValue::LinkageTypes ///< The linkage type of the GV
) )
{ {
bca.numGlobalVars++;
} }
void handleInitializedGV( void handleInitializedGV(
@ -69,16 +98,19 @@ public:
unsigned initSlot ///< Slot number of GV's initializer unsigned initSlot ///< Slot number of GV's initializer
) )
{ {
bca.numGlobalVars++;
} }
virtual void handleType( const Type* Ty ) virtual void handleType( const Type* Ty )
{ {
bca.numTypes++;
} }
void handleFunctionDeclaration( void handleFunctionDeclaration(
const Type* FuncType ///< The type of the function const Type* FuncType ///< The type of the function
) )
{ {
bca.numFunctions++;
} }
void handleModuleGlobalsEnd() void handleModuleGlobalsEnd()
@ -94,6 +126,7 @@ public:
unsigned NumEntries unsigned NumEntries
) )
{ {
bca.numCmpctnTables++;
} }
void handleCompactionTableType( void handleCompactionTableType(
@ -118,6 +151,7 @@ public:
void handleSymbolTableBegin() void handleSymbolTableBegin()
{ {
bca.numSymTab++;
} }
void handleSymbolTablePlane( void handleSymbolTablePlane(
@ -165,6 +199,7 @@ public:
unsigned blocknum unsigned blocknum
) )
{ {
bca.numBasicBlocks++;
} }
bool handleInstruction( bool handleInstruction(
@ -173,7 +208,8 @@ public:
std::vector<unsigned>& Operands std::vector<unsigned>& Operands
) )
{ {
return false; bca.numInstructions++;
return Instruction::isTerminator(Opcode);
} }
void handleBasicBlockEnd(unsigned blocknum) void handleBasicBlockEnd(unsigned blocknum)
@ -190,31 +226,37 @@ public:
std::vector<std::pair<const Type*,unsigned> > ArgVec std::vector<std::pair<const Type*,unsigned> > ArgVec
) )
{ {
bca.numConstants++;
} }
void handleConstantValue( Constant * c ) void handleConstantValue( Constant * c )
{ {
bca.numConstants++;
} }
void handleConstantArray( void handleConstantArray(
const ArrayType* AT, const ArrayType* AT,
std::vector<unsigned>& Elements ) std::vector<unsigned>& Elements )
{ {
bca.numConstants++;
} }
void handleConstantStruct( void handleConstantStruct(
const StructType* ST, const StructType* ST,
std::vector<unsigned>& ElementSlots) std::vector<unsigned>& ElementSlots)
{ {
bca.numConstants++;
} }
void handleConstantPointer( void handleConstantPointer(
const PointerType* PT, unsigned Slot) const PointerType* PT, unsigned Slot)
{ {
bca.numConstants++;
} }
void handleConstantString( const ConstantArray* CA ) void handleConstantString( const ConstantArray* CA )
{ {
bca.numConstants++;
} }
@ -233,10 +275,12 @@ void llvm::BytecodeAnalyzer::AnalyzeBytecode(
const std::string &ModuleID const std::string &ModuleID
) )
{ {
AnalyzerHandler TheHandler; bca.byteSize = Length;
AnalyzerHandler TheHandler(bca);
AbstractBytecodeParser TheParser(&TheHandler); AbstractBytecodeParser TheParser(&TheHandler);
TheParser.ParseBytecode( Buf, Length, ModuleID ); TheParser.ParseBytecode( Buf, Length, ModuleID );
TheParser.ParseAllFunctionBodies(); if ( bca.detailedResults )
TheParser.ParseAllFunctionBodies();
} }
// vim: sw=2 // vim: sw=2

View File

@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "AnalyzerInternals.h" #include "AnalyzerInternals.h"
#include <iostream>
using namespace llvm; using namespace llvm;
@ -20,22 +21,49 @@ using namespace llvm;
namespace { namespace {
class AnalyzerHandler : public BytecodeHandler { class AnalyzerHandler : public BytecodeHandler {
BytecodeAnalysis& bca;
public: public:
AnalyzerHandler(BytecodeAnalysis& TheBca)
: bca(TheBca)
{
}
bool handleError(const std::string& str ) bool handleError(const std::string& str )
{ {
std::cerr << "Analysis Error: " << str;
return false; return false;
} }
void handleStart() void handleStart()
{ {
bca.ModuleId.clear();
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.density = 0.0;
bca.FunctionInfo.clear();
bca.BytecodeDump.clear();
} }
void handleFinish() void handleFinish()
{ {
bca.density = bca.numTypes + bca.numFunctions + bca.numConstants +
bca.numGlobalVars + bca.numInstructions;
bca.density /= bca.byteSize;
} }
void handleModuleBegin(const std::string& id) void handleModuleBegin(const std::string& id)
{ {
bca.ModuleId = id;
} }
void handleModuleEnd(const std::string& id) void handleModuleEnd(const std::string& id)
@ -60,6 +88,7 @@ public:
GlobalValue::LinkageTypes ///< The linkage type of the GV GlobalValue::LinkageTypes ///< The linkage type of the GV
) )
{ {
bca.numGlobalVars++;
} }
void handleInitializedGV( void handleInitializedGV(
@ -69,16 +98,19 @@ public:
unsigned initSlot ///< Slot number of GV's initializer unsigned initSlot ///< Slot number of GV's initializer
) )
{ {
bca.numGlobalVars++;
} }
virtual void handleType( const Type* Ty ) virtual void handleType( const Type* Ty )
{ {
bca.numTypes++;
} }
void handleFunctionDeclaration( void handleFunctionDeclaration(
const Type* FuncType ///< The type of the function const Type* FuncType ///< The type of the function
) )
{ {
bca.numFunctions++;
} }
void handleModuleGlobalsEnd() void handleModuleGlobalsEnd()
@ -94,6 +126,7 @@ public:
unsigned NumEntries unsigned NumEntries
) )
{ {
bca.numCmpctnTables++;
} }
void handleCompactionTableType( void handleCompactionTableType(
@ -118,6 +151,7 @@ public:
void handleSymbolTableBegin() void handleSymbolTableBegin()
{ {
bca.numSymTab++;
} }
void handleSymbolTablePlane( void handleSymbolTablePlane(
@ -165,6 +199,7 @@ public:
unsigned blocknum unsigned blocknum
) )
{ {
bca.numBasicBlocks++;
} }
bool handleInstruction( bool handleInstruction(
@ -173,7 +208,8 @@ public:
std::vector<unsigned>& Operands std::vector<unsigned>& Operands
) )
{ {
return false; bca.numInstructions++;
return Instruction::isTerminator(Opcode);
} }
void handleBasicBlockEnd(unsigned blocknum) void handleBasicBlockEnd(unsigned blocknum)
@ -190,31 +226,37 @@ public:
std::vector<std::pair<const Type*,unsigned> > ArgVec std::vector<std::pair<const Type*,unsigned> > ArgVec
) )
{ {
bca.numConstants++;
} }
void handleConstantValue( Constant * c ) void handleConstantValue( Constant * c )
{ {
bca.numConstants++;
} }
void handleConstantArray( void handleConstantArray(
const ArrayType* AT, const ArrayType* AT,
std::vector<unsigned>& Elements ) std::vector<unsigned>& Elements )
{ {
bca.numConstants++;
} }
void handleConstantStruct( void handleConstantStruct(
const StructType* ST, const StructType* ST,
std::vector<unsigned>& ElementSlots) std::vector<unsigned>& ElementSlots)
{ {
bca.numConstants++;
} }
void handleConstantPointer( void handleConstantPointer(
const PointerType* PT, unsigned Slot) const PointerType* PT, unsigned Slot)
{ {
bca.numConstants++;
} }
void handleConstantString( const ConstantArray* CA ) void handleConstantString( const ConstantArray* CA )
{ {
bca.numConstants++;
} }
@ -233,10 +275,12 @@ void llvm::BytecodeAnalyzer::AnalyzeBytecode(
const std::string &ModuleID const std::string &ModuleID
) )
{ {
AnalyzerHandler TheHandler; bca.byteSize = Length;
AnalyzerHandler TheHandler(bca);
AbstractBytecodeParser TheParser(&TheHandler); AbstractBytecodeParser TheParser(&TheHandler);
TheParser.ParseBytecode( Buf, Length, ModuleID ); TheParser.ParseBytecode( Buf, Length, ModuleID );
TheParser.ParseAllFunctionBodies(); if ( bca.detailedResults )
TheParser.ParseAllFunctionBodies();
} }
// vim: sw=2 // vim: sw=2