diff options
Diffstat (limited to 'lib/Bytecode')
-rw-r--r-- | lib/Bytecode/Analyzer/Analyzer.cpp | 297 | ||||
-rw-r--r-- | lib/Bytecode/Analyzer/AnalyzerInternals.h | 51 | ||||
-rw-r--r-- | lib/Bytecode/Analyzer/AnalyzerWrappers.cpp | 332 | ||||
-rw-r--r-- | lib/Bytecode/Analyzer/Dumper.cpp | 274 | ||||
-rw-r--r-- | lib/Bytecode/Analyzer/Makefile | 13 | ||||
-rw-r--r-- | lib/Bytecode/Analyzer/Parser.cpp | 1062 | ||||
-rw-r--r-- | lib/Bytecode/Analyzer/Parser.h | 544 |
7 files changed, 0 insertions, 2573 deletions
diff --git a/lib/Bytecode/Analyzer/Analyzer.cpp b/lib/Bytecode/Analyzer/Analyzer.cpp deleted file mode 100644 index 94680949cb..0000000000 --- a/lib/Bytecode/Analyzer/Analyzer.cpp +++ /dev/null @@ -1,297 +0,0 @@ -//===-- 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; - BytecodeAnalysis::BytecodeFunctionInfo* currFunc; -public: - AnalyzerHandler(BytecodeAnalysis& TheBca) - : bca(TheBca) - , currFunc(0) - { } - - virtual bool handleError(const std::string& str ) { - return false; - } - - virtual 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.instructionSize = 0; - bca.longInstructions = 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; - } - - virtual 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); - } - - virtual void handleModuleBegin(const std::string& id) { - bca.ModuleId = id; - } - - virtual void handleModuleEnd(const std::string& id) { } - - virtual void handleVersionInfo( - unsigned char RevisionNum, ///< Byte code revision number - Module::Endianness Endianness, ///< Endianness indicator - Module::PointerSize PointerSize ///< PointerSize indicator - ) { } - - virtual void handleModuleGlobalsBegin(unsigned size) { } - - virtual 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++; - } - - virtual 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++; } - - virtual void handleFunctionDeclaration( - Function* Func, ///< The function - const FunctionType* FuncType ///< The type of the function - ) { - bca.numFunctions++; - bca.numValues++; - } - - virtual void handleModuleGlobalsEnd() { } - - virtual void handleCompactionTableBegin() { } - - virtual void handleCompactionTablePlane( unsigned Ty, unsigned NumEntries) { - bca.numCmpctnTables++; - } - - virtual void handleCompactionTableType( unsigned i, unsigned TypSlot, - const Type* ) {} - - virtual void handleCompactionTableValue( - unsigned i, - unsigned ValSlot, - const Type* ) { } - - virtual void handleCompactionTableEnd() { } - - virtual void handleSymbolTableBegin() { bca.numSymTab++; } - - virtual void handleSymbolTablePlane( unsigned Ty, unsigned NumEntries, - const Type* Typ) { } - - virtual void handleSymbolTableType( unsigned i, unsigned slot, - const std::string& name ) { } - - virtual void handleSymbolTableValue( unsigned i, unsigned slot, - const std::string& name ) { } - - virtual void handleSymbolTableEnd() { } - - virtual void handleFunctionBegin( Function* Func, unsigned Size) { - const FunctionType* FType = - cast<FunctionType>(Func->getType()->getElementType()); - currFunc = &bca.FunctionInfo[Func]; - currFunc->description = FType->getDescription(); - currFunc->name = Func->getName(); - currFunc->byteSize = Size; - currFunc->numInstructions = 0; - currFunc->numBasicBlocks = 0; - currFunc->numPhis = 0; - currFunc->numOperands = 0; - currFunc->density = 0.0; - currFunc->instructionSize = 0; - currFunc->longInstructions = 0; - currFunc->vbrCount32 = 0; - currFunc->vbrCount64 = 0; - currFunc->vbrCompBytes = 0; - currFunc->vbrExpdBytes = 0; - } - - virtual void handleFunctionEnd( Function* Func) { - currFunc->density = double(currFunc->byteSize) / - double(currFunc->numInstructions+currFunc->numBasicBlocks); - } - - virtual void handleBasicBlockBegin( unsigned blocknum) { - bca.numBasicBlocks++; - bca.numValues++; - if ( currFunc ) currFunc->numBasicBlocks++; - } - - virtual bool handleInstruction( unsigned Opcode, const Type* iType, - std::vector<unsigned>& Operands, unsigned Size) { - bca.numInstructions++; - bca.numValues++; - bca.instructionSize += Size; - if (Size > 4 ) bca.longInstructions++; - bca.numOperands += Operands.size(); - if ( currFunc ) { - currFunc->numInstructions++; - currFunc->instructionSize += Size; - if (Size > 4 ) currFunc->longInstructions++; - if ( Opcode == Instruction::PHI ) currFunc->numPhis++; - } - return Instruction::isTerminator(Opcode); - } - - virtual void handleBasicBlockEnd(unsigned blocknum) { } - - virtual void handleGlobalConstantsBegin() { } - - virtual void handleConstantExpression( unsigned Opcode, const Type* Typ, - std::vector<std::pair<const Type*,unsigned> > ArgVec ) { - bca.numConstants++; - bca.numValues++; - } - - virtual void handleConstantValue( Constant * c ) { - bca.numConstants++; - bca.numValues++; - } - - virtual void handleConstantArray( const ArrayType* AT, - std::vector<unsigned>& Elements ) { - bca.numConstants++; - bca.numValues++; - } - - virtual void handleConstantStruct( - const StructType* ST, - std::vector<unsigned>& ElementSlots) - { - bca.numConstants++; - bca.numValues++; - } - - virtual void handleConstantPointer( const PointerType* PT, unsigned Slot) { - bca.numConstants++; - bca.numValues++; - } - - virtual void handleConstantString( const ConstantArray* CA ) { - bca.numConstants++; - bca.numValues++; - } - - virtual void handleGlobalConstantsEnd() { } - - virtual void handleAlignment(unsigned numBytes) { - bca.numAlignment += numBytes; - } - - virtual 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); - if (currFunc) { - currFunc->vbrCount32++; - currFunc->vbrCompBytes += Size; - currFunc->vbrExpdBytes += sizeof(uint32_t); - } - } - - virtual void handleVBR64(unsigned Size ) { - bca.vbrCount64++; - bca.vbrCompBytes += Size; - bca.vbrExpdBytes += sizeof(uint64_t); - if ( currFunc ) { - currFunc->vbrCount64++; - currFunc->vbrCompBytes += Size; - currFunc->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 diff --git a/lib/Bytecode/Analyzer/AnalyzerInternals.h b/lib/Bytecode/Analyzer/AnalyzerInternals.h deleted file mode 100644 index d7733c7176..0000000000 --- a/lib/Bytecode/Analyzer/AnalyzerInternals.h +++ /dev/null @@ -1,51 +0,0 @@ -//===-- ReaderInternals.h - Definitions internal to the reader --*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This header file defines various stuff that is used by the bytecode reader. -// -//===----------------------------------------------------------------------===// - -#ifndef ANALYZER_INTERNALS_H -#define ANALYZER_INTERNALS_H - -#include "Parser.h" -#include "llvm/Bytecode/Analyzer.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" - - -namespace llvm { - -class BytecodeAnalyzer { - BytecodeAnalyzer(const BytecodeAnalyzer &); // DO NOT IMPLEMENT - void operator=(const BytecodeAnalyzer &); // DO NOT IMPLEMENT -public: - BytecodeAnalyzer() { } - ~BytecodeAnalyzer() { } - - void AnalyzeBytecode( - const unsigned char *Buf, - unsigned Length, - BytecodeAnalysis& bca, - const std::string &ModuleID - ); - - void DumpBytecode( - const unsigned char *Buf, - unsigned Length, - BytecodeAnalysis& bca, - const std::string &ModuleID - ); -}; - -} // End llvm namespace - -#endif - -// vim: sw=2 diff --git a/lib/Bytecode/Analyzer/AnalyzerWrappers.cpp b/lib/Bytecode/Analyzer/AnalyzerWrappers.cpp deleted file mode 100644 index f8493170fa..0000000000 --- a/lib/Bytecode/Analyzer/AnalyzerWrappers.cpp +++ /dev/null @@ -1,332 +0,0 @@ -//===- AnalyzerWrappers.cpp - Analyze bytecode from file or buffer -------===// -// -// 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 file implements loading and analysis of a bytecode file and analyzing a -// bytecode buffer. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Bytecode/Analyzer.h" -#include "AnalyzerInternals.h" -#include "Support/FileUtilities.h" -#include "Support/StringExtras.h" -#include "Config/unistd.h" -#include <cerrno> -#include <iomanip> - -using namespace llvm; - -//===----------------------------------------------------------------------===// -// BytecodeFileAnalyzer - Analyze from an mmap'able file descriptor. -// - -namespace { - /// BytecodeFileAnalyzer - parses a bytecode file from a file - class BytecodeFileAnalyzer : public BytecodeAnalyzer { - private: - unsigned char *Buffer; - unsigned Length; - - BytecodeFileAnalyzer(const BytecodeFileAnalyzer&); // Do not implement - void operator=(const BytecodeFileAnalyzer &BFR); // Do not implement - - public: - BytecodeFileAnalyzer(const std::string &Filename, BytecodeAnalysis& bca); - ~BytecodeFileAnalyzer(); - }; -} - -static std::string ErrnoMessage (int savedErrNum, std::string descr) { - return ::strerror(savedErrNum) + std::string(", while trying to ") + descr; -} - -BytecodeFileAnalyzer::BytecodeFileAnalyzer(const std::string &Filename, - BytecodeAnalysis& bca) { - Buffer = (unsigned char*)ReadFileIntoAddressSpace(Filename, Length); - if (Buffer == 0) - throw "Error reading file '" + Filename + "'."; - - try { - // Parse the bytecode we mmapped in - if ( bca.dumpBytecode ) - DumpBytecode(Buffer, Length, bca, Filename); - AnalyzeBytecode(Buffer, Length, bca, Filename); - } catch (...) { - UnmapFileFromAddressSpace(Buffer, Length); - throw; - } -} - -BytecodeFileAnalyzer::~BytecodeFileAnalyzer() { - // Unmmap the bytecode... - UnmapFileFromAddressSpace(Buffer, Length); -} - -//===----------------------------------------------------------------------===// -// BytecodeBufferAnalyzer - Read from a memory buffer -// - -namespace { - /// BytecodeBufferAnalyzer - parses a bytecode file from a buffer - /// - class BytecodeBufferAnalyzer : public BytecodeAnalyzer { - private: - const unsigned char *Buffer; - bool MustDelete; - - BytecodeBufferAnalyzer(const BytecodeBufferAnalyzer&); // Do not implement - void operator=(const BytecodeBufferAnalyzer &BFR); // Do not implement - - public: - BytecodeBufferAnalyzer(const unsigned char *Buf, unsigned Length, - BytecodeAnalysis& bca, const std::string &ModuleID); - ~BytecodeBufferAnalyzer(); - - }; -} - -BytecodeBufferAnalyzer::BytecodeBufferAnalyzer(const unsigned char *Buf, - 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) { - Buffer = new unsigned char[Length+4]; - unsigned Offset = 4 - ((intptr_t)Buffer & 3); // Make sure it's aligned - ParseBegin = Buffer + Offset; - memcpy((unsigned char*)ParseBegin, Buf, Length); // Copy it over - MustDelete = true; - } else { - // If we don't need to copy it over, just use the caller's copy - ParseBegin = Buffer = Buf; - MustDelete = false; - } - try { - if ( bca.dumpBytecode ) - DumpBytecode(ParseBegin, Length, bca, ModuleID); - AnalyzeBytecode(ParseBegin, Length, bca, ModuleID); - } catch (...) { - if (MustDelete) delete [] Buffer; - throw; - } -} - -BytecodeBufferAnalyzer::~BytecodeBufferAnalyzer() { - if (MustDelete) delete [] Buffer; -} - -//===----------------------------------------------------------------------===// -// BytecodeStdinAnalyzer - Read bytecode from Standard Input -// - -namespace { - /// BytecodeStdinAnalyzer - parses a bytecode file from stdin - /// - class BytecodeStdinAnalyzer : public BytecodeAnalyzer { - private: - std::vector<unsigned char> FileData; - unsigned char *FileBuf; - - BytecodeStdinAnalyzer(const BytecodeStdinAnalyzer&); // Do not implement - void operator=(const BytecodeStdinAnalyzer &BFR); // Do not implement - - public: - BytecodeStdinAnalyzer(BytecodeAnalysis& bca); - }; -} - -BytecodeStdinAnalyzer::BytecodeStdinAnalyzer(BytecodeAnalysis& bca ) { - int BlockSize; - unsigned char Buffer[4096*4]; - - // Read in all of the data from stdin, we cannot mmap stdin... - while ((BlockSize = ::read(0 /*stdin*/, Buffer, 4096*4))) { - if (BlockSize == -1) - throw ErrnoMessage(errno, "read from standard input"); - - FileData.insert(FileData.end(), Buffer, Buffer+BlockSize); - } - - if (FileData.empty()) - throw std::string("Standard Input empty!"); - - FileBuf = &FileData[0]; - if (bca.dumpBytecode) - DumpBytecode(&FileData[0], FileData.size(), bca, "<stdin>"); - AnalyzeBytecode(FileBuf, FileData.size(), bca, "<stdin>"); -} - -//===----------------------------------------------------------------------===// -// Wrapper functions -//===----------------------------------------------------------------------===// - -// AnalyzeBytecodeFile - analyze one file -void llvm::AnalyzeBytecodeFile(const std::string &Filename, - BytecodeAnalysis& bca, - std::string *ErrorStr) -{ - try { - if ( Filename != "-" ) - BytecodeFileAnalyzer bfa(Filename,bca); - else - BytecodeStdinAnalyzer bsa(bca); - } catch (std::string &err) { - if (ErrorStr) *ErrorStr = err; - } -} - -// AnalyzeBytecodeBuffer - analyze a buffer -void llvm::AnalyzeBytecodeBuffer( - const unsigned char* Buffer, ///< Pointer to start of bytecode buffer - unsigned BufferSize, ///< Size of the bytecode buffer - BytecodeAnalysis& Results, ///< The results of the analysis - std::string* ErrorStr ///< Errors, if any. - ) -{ - try { - BytecodeBufferAnalyzer(Buffer, BufferSize, Results, "<buffer>" ); - } catch (std::string& err ) { - if ( ErrorStr) *ErrorStr = err; - } -} - - -/// 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 ) -{ - 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, "Long Instructions", bca.longInstructions); - print(Out, "Instruction Size", bca.instructionSize); - print(Out, "Average Instruction Size", - double(bca.instructionSize)/double(bca.numInstructions)); - 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<const Function*,BytecodeAnalysis::BytecodeFunctionInfo>::iterator I = - bca.FunctionInfo.begin(); - std::map<const Function*,BytecodeAnalysis::BytecodeFunctionInfo>::iterator E = - bca.FunctionInfo.end(); - - while ( I != E ) { - Out << std::left << std::setw(0); - Out << "Function: " << I->second.name << "\n"; - print(Out, "Type:", I->second.description); - print(Out, "Byte Size", I->second.byteSize); - print(Out, "Instructions", I->second.numInstructions); - print(Out, "Long Instructions", I->second.longInstructions); - print(Out, "Instruction Size", I->second.instructionSize); - print(Out, "Average Instruction Size", - double(I->second.instructionSize)/double(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, "Number of VBR 32-bit Integers", I->second.vbrCount32); - print(Out, "Number of VBR 64-bit Integers", I->second.vbrCount64); - print(Out, "Number of VBR Compressed Bytes", I->second.vbrCompBytes); - print(Out, "Number of VBR Expanded Bytes", I->second.vbrExpdBytes); - print(Out, "VBR Savings", - double(I->second.vbrExpdBytes)-double(I->second.vbrCompBytes), - double(I->second.byteSize)); - ++I; - } - } - - if ( bca.dumpBytecode ) - Out << bca.BytecodeDump; -} -// vim: sw=2 diff --git a/lib/Bytecode/Analyzer/Dumper.cpp b/lib/Bytecode/Analyzer/Dumper.cpp deleted file mode 100644 index 280a12ba73..0000000000 --- a/lib/Bytecode/Analyzer/Dumper.cpp +++ /dev/null @@ -1,274 +0,0 @@ -//===-- BytecodeDumper.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 BytecodeDumper class that gets called by the -// AbstractBytecodeParser when parsing events occur. It merely dumps the -// information presented to it from the parser. -// -//===----------------------------------------------------------------------===// - -#include "AnalyzerInternals.h" -#include "llvm/Constant.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Instruction.h" -#include "llvm/Type.h" - -using namespace llvm; - -namespace { - -class BytecodeDumper : public llvm::BytecodeHandler { -public: - - virtual bool handleError(const std::string& str ) - { - std::cout << "ERROR: " << str << "\n"; - return true; - } - - virtual void handleStart() - { - std::cout << "Bytecode {\n"; - } - - virtual void handleFinish() - { - std::cout << "} End Bytecode\n"; - } - - virtual void handleModuleBegin(const std::string& id) - { - std::cout << " Module " << id << " {\n"; - } - - virtual void handleModuleEnd(const std::string& id) - { - std::cout << " } End Module " << id << "\n"; - } - - virtual void handleVersionInfo( - unsigned char RevisionNum, ///< Byte code revision number - Module::Endianness Endianness, ///< Endianness indicator - Module::PointerSize PointerSize ///< PointerSize indicator - ) - { - std::cout << " RevisionNum: " << int(RevisionNum) - << " Endianness: " << Endianness - << " PointerSize: " << PointerSize << "\n"; - } - - virtual void handleModuleGlobalsBegin() - { - std::cout << " BLOCK: ModuleGlobalInfo {\n"; - } - - virtual void handleGlobalVariable( - const Type* ElemType, ///< The type of the global variable - bool isConstant, ///< Whether the GV is constant or not - GlobalValue::LinkageTypes Linkage ///< The linkage type of the GV - ) - { - std::cout << " GV: Uninitialized, " - << ( isConstant? "Constant, " : "Variable, ") - << " Linkage=" << Linkage << " Type=" - << ElemType->getDescription() << "\n"; - } - - virtual void handleInitializedGV( - const Type* ElemType, ///< The type of the global variable - bool isConstant, ///< Whether the GV is constant or not - GlobalValue::LinkageTypes Linkage,///< The linkage type of the GV - unsigned initSlot ///< Slot number of GV's initializer - ) - { - std::cout << " GV: Initialized, " - << ( isConstant? "Constant, " : "Variable, ") - << " Linkage=" << Linkage << " Type=" - << ElemType->getDescription() - << " InitializerSlot=" << initSlot << "\n"; - } - - virtual void handleType( const Type* Ty ) { - std::cout << " Type: " << Ty->getDescription() << "\n"; - } - - virtual void handleFunctionDeclaration( - Function* Func, - const FunctionType* FuncType) { - std::cout << " Function: " << FuncType->getDescription() << "\n"; - } - - virtual void handleModuleGlobalsEnd() { - std::cout << " } END BLOCK: ModuleGlobalInfo\n"; - } - - virtual void handleCompactionTableBegin() { - std::cout << " BLOCK: CompactionTable {\n"; - } - - virtual void handleCompactionTablePlane( unsigned Ty, unsigned NumEntries ) { - std::cout << " Plane: Ty=" << Ty << " Size=" << NumEntries << "\n"; - } - - virtual void handleCompactionTableType( - unsigned i, - unsigned TypSlot, - const Type* Ty) { - std::cout << " Type: " << i << " Slot:" << TypSlot - << " is " << Ty->getDescription() << "\n"; - } - - virtual void handleCompactionTableValue( - unsigned i, - unsigned ValSlot, - const Type* Ty ) { - std::cout << " Value: " << i << " Slot:" << ValSlot - << " is " << Ty->getDescription() << "\n"; - } - - virtual void handleCompactionTableEnd() { - std::cout << " } END BLOCK: CompactionTable\n"; - } - - virtual void handleSymbolTableBegin() { - std::cout << " BLOCK: SymbolTable {\n"; - } - - virtual void handleSymbolTablePlane( - unsigned Ty, - unsigned NumEntries, - const Type* Typ) { - std::cout << " Plane: Ty=" << Ty << " Size=" << NumEntries - << " Type: " << Typ->getDescription() << "\n"; - } - - virtual void handleSymbolTableType( - unsigned i, - unsigned slot, - const std::string& name ) { - std::cout << " Type " << i << " Slot=" << slot - << " Name: " << name << "\n"; - } - - virtual void handleSymbolTableValue( - unsigned i, - unsigned slot, - const std::string& name ) { - std::cout << " Value " << i << " Slot=" << slot - << " Name: " << name << "\n"; - } - - virtual void handleSymbolTableEnd() { - std::cout << " } END BLOCK: SymbolTable\n"; - } - - virtual void handleFunctionBegin( - const Type* FType, GlobalValue::LinkageTypes linkage ) { - std::cout << "BLOCK: Function {\n"; - std::cout << " Linkage: " << linkage << "\n"; - std::cout << " Type: " << FType->getDescription() << "\n"; - } - - virtual void handleFunctionEnd( const Type* FType) { - std::cout << "} END BLOCK: Function\n"; - } - - virtual void handleBasicBlockBegin( unsigned blocknum) { - std::cout << " BLOCK: BasicBlock #" << blocknum << "{\n"; - } - - virtual bool handleInstruction( - unsigned Opcode, - const Type* iType, - std::vector<unsigned>& Operands, - unsigned Size) { - std::cout << " INST: OpCode=" - << Instruction::getOpcodeName(Opcode) << " Type=" - << iType->getDescription() << "\n"; - for ( unsigned i = 0; i < Operands.size(); ++i ) - std::cout << " Op#" << i << " Slot=" << Operands[i] << "\n"; - - return Instruction::isTerminator(Opcode); - } - - virtual void handleBasicBlockEnd(unsigned blocknum) { - std::cout << " } END BLOCK: BasicBlock #" << blocknum << "{\n"; - } - - virtual void handleGlobalConstantsBegin() { - std::cout << " BLOCK: GlobalConstants {\n"; - } - - virtual void handleConstantExpression( - unsigned Opcode, - const Type* Typ, - std::vector<std::pair<const Type*,unsigned> > ArgVec - ) { - std::cout << " EXPR: " << Instruction::getOpcodeName(Opcode) - << " Type=" << Typ->getDescription() << "\n"; - for ( unsigned i = 0; i < ArgVec.size(); ++i ) - std::cout << " Arg#" << i << " Type=" - << ArgVec[i].first->getDescription() << " Slot=" - << ArgVec[i].second << "\n"; - } - - virtual void handleConstantValue( Constant * c ) { - std::cout << " VALUE: "; - c->print(std::cout); - std::cout << "\n"; - } - - virtual void handleConstantArray(const ArrayType* AT, - std::vector<unsigned>& Elements ) { - std::cout << " ARRAY: " << AT->getDescription() << "\n"; - for ( unsigned i = 0; i < Elements.size(); ++i ) - std::cout << " #" << i << " Slot=" << Elements[i] << "\n"; - } - - virtual void handleConstantStruct( const StructType* ST, - std::vector<unsigned>& Elements) { - std::cout << " STRUC: " << ST->getDescription() << "\n"; - for ( unsigned i = 0; i < Elements.size(); ++i ) - std::cout << " #" << i << " Slot=" << Elements[i] << "\n"; - } - - virtual void handleConstantPointer( - const PointerType* PT, unsigned Slot) - { - std::cout << " POINT: " << PT->getDescription() - << " Slot=" << Slot << "\n"; - } - - virtual void handleConstantString( const ConstantArray* CA ) { - std::cout << " STRNG: "; - CA->print(std::cout); - std::cout << "\n"; - } - - virtual void handleGlobalConstantsEnd() { - std::cout << " } END BLOCK: GlobalConstants\n"; - } -}; - -} - -void BytecodeAnalyzer::DumpBytecode( - const unsigned char *Buf, - unsigned Length, - BytecodeAnalysis& bca, - const std::string &ModuleID) { - BytecodeDumper TheHandler; - AbstractBytecodeParser TheParser(&TheHandler); - TheParser.ParseBytecode( Buf, Length, ModuleID ); - if ( bca.detailedResults ) - TheParser.ParseAllFunctionBodies(); -} - -// vim: sw=2 |