blob: 72198079bfba2020466cd579d98164cfc5b0866a [file] [log] [blame] [edit]
//===-- NaClBitcodeBlockDist.cpp ---------------------------------------===//
// implements distribution maps for blocks within PNaCl bitcode.
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/Bitcode/NaCl/NaClBitcodeBlockDist.h"
#include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h"
using namespace llvm;
/// GetBlockName - Return a symbolic block name if known, otherwise return
/// null.
static const char *GetBlockName(unsigned BlockID) {
// Standard blocks for all bitcode files.
if (BlockID < naclbitc::FIRST_APPLICATION_BLOCKID) {
if (BlockID == naclbitc::BLOCKINFO_BLOCK_ID)
return "BLOCKINFO_BLOCK";
return 0;
}
switch (BlockID) {
default: return 0;
case naclbitc::MODULE_BLOCK_ID: return "MODULE_BLOCK";
case naclbitc::PARAMATTR_BLOCK_ID: return "PARAMATTR_BLOCK";
case naclbitc::PARAMATTR_GROUP_BLOCK_ID: return "PARAMATTR_GROUP_BLOCK_ID";
case naclbitc::TYPE_BLOCK_ID_NEW: return "TYPE_BLOCK_ID";
case naclbitc::CONSTANTS_BLOCK_ID: return "CONSTANTS_BLOCK";
case naclbitc::FUNCTION_BLOCK_ID: return "FUNCTION_BLOCK";
case naclbitc::VALUE_SYMTAB_BLOCK_ID: return "VALUE_SYMTAB";
case naclbitc::METADATA_BLOCK_ID: return "METADATA_BLOCK";
case naclbitc::METADATA_ATTACHMENT_ID: return "METADATA_ATTACHMENT_BLOCK";
case naclbitc::USELIST_BLOCK_ID: return "USELIST_BLOCK_ID";
case naclbitc::GLOBALVAR_BLOCK_ID: return "GLOBALVAR_BLOCK";
}
}
NaClBitcodeBlockDistElement NaClBitcodeBlockDist::DefaultSentinal;
NaClBitcodeBlockDistElement::~NaClBitcodeBlockDistElement() {}
NaClBitcodeDistElement *NaClBitcodeBlockDistElement::
CreateElement(NaClBitcodeDistValue Value) const {
return new NaClBitcodeBlockDistElement();
}
double NaClBitcodeBlockDistElement::
GetImportance(NaClBitcodeDistValue Value) const {
return static_cast<double>(GetTotalBits());
}
const char *NaClBitcodeBlockDistElement::GetTitle() const {
return "Block Histogram";
}
const char *NaClBitcodeBlockDistElement::GetValueHeader() const {
return "Block";
}
void NaClBitcodeBlockDistElement::PrintStatsHeader(raw_ostream &Stream) const {
Stream << " %File";
NaClBitcodeBitsDistElement::PrintStatsHeader(Stream);
}
void NaClBitcodeBlockDistElement::
PrintRowStats(raw_ostream &Stream, const NaClBitcodeDist *Distribution) const {
const NaClBitcodeBlockDist *BlockDist =
cast<NaClBitcodeBlockDist>(Distribution);
Stream << format(" %6.2f",
(double) GetTotalBits()/BlockDist->GetTotalBits()*100.00);
NaClBitcodeBitsDistElement::PrintRowStats(Stream, Distribution);
}
void NaClBitcodeBlockDistElement::
PrintRowValue(raw_ostream &Stream, NaClBitcodeDistValue Value,
const NaClBitcodeDist *Distribution) const {
Stream << NaClBitcodeBlockDist::GetName(Value);
}
NaClBitcodeBlockDist::~NaClBitcodeBlockDist() {}
uint64_t NaClBitcodeBlockDist::GetTotalBits() const {
uint64_t Total = 0;
for (NaClBitcodeDist::const_iterator Iter = begin(), IterEnd = end();
Iter != IterEnd; ++Iter) {
const NaClBitcodeBlockDistElement *Element =
cast<NaClBitcodeBlockDistElement>(Iter->second);
Total += Element->GetTotalBits();
}
return Total;
}
std::string NaClBitcodeBlockDist::GetName(unsigned BlockID) {
if (const char *BlockName = GetBlockName(BlockID)) {
return BlockName;
}
std::string Str;
raw_string_ostream StrStrm(Str);
StrStrm << "UnknownBlock" << BlockID;
return StrStrm.str();
}