Index: lib/Bitcode/NaCl/Analysis/NaClBitcodeCodeDist.cpp |
diff --git a/lib/Bitcode/NaCl/Analysis/NaClBitcodeCodeDist.cpp b/lib/Bitcode/NaCl/Analysis/NaClBitcodeCodeDist.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aadea756b6e63a07c1555c212fef468d6f4e7231 |
--- /dev/null |
+++ b/lib/Bitcode/NaCl/Analysis/NaClBitcodeCodeDist.cpp |
@@ -0,0 +1,221 @@ |
+//===-- NaClBitcodeCodeDist.cpp -------------------------------------------===// |
+// Implements distribution maps for record codes within a PNaCl bitcode |
+// file. |
+// |
+// 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/NaClBitcodeCodeDist.h" |
+#include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" |
+#include "llvm/Support/raw_ostream.h" |
+ |
+using namespace llvm; |
+ |
+/// GetCodeName - Return a symbolic code name if known, otherwise return |
+/// null. |
+static const char *GetCodeName(unsigned CodeID, unsigned BlockID) { |
+ // Standard blocks for all bitcode files. |
+ if (BlockID < naclbitc::FIRST_APPLICATION_BLOCKID) { |
+ if (BlockID == naclbitc::BLOCKINFO_BLOCK_ID) { |
+ switch (CodeID) { |
+ default: return 0; |
+ case naclbitc::BLOCKINFO_CODE_SETBID: return "SETBID"; |
+ } |
+ } |
+ return 0; |
+ } |
+ |
+ switch (BlockID) { |
+ default: return 0; |
+ case naclbitc::MODULE_BLOCK_ID: |
+ switch (CodeID) { |
+ default: return 0; |
+ case naclbitc::MODULE_CODE_VERSION: return "VERSION"; |
+ case naclbitc::MODULE_CODE_TRIPLE: return "TRIPLE"; |
+ case naclbitc::MODULE_CODE_DATALAYOUT: return "DATALAYOUT"; |
+ case naclbitc::MODULE_CODE_ASM: return "ASM"; |
+ case naclbitc::MODULE_CODE_SECTIONNAME: return "SECTIONNAME"; |
+ case naclbitc::MODULE_CODE_DEPLIB: return "DEPLIB"; // FIXME: Remove in 4.0 |
+ case naclbitc::MODULE_CODE_GLOBALVAR: return "GLOBALVAR"; |
+ case naclbitc::MODULE_CODE_FUNCTION: return "FUNCTION"; |
+ case naclbitc::MODULE_CODE_ALIAS: return "ALIAS"; |
+ case naclbitc::MODULE_CODE_PURGEVALS: return "PURGEVALS"; |
+ case naclbitc::MODULE_CODE_GCNAME: return "GCNAME"; |
+ } |
+ case naclbitc::PARAMATTR_BLOCK_ID: |
+ switch (CodeID) { |
+ default: return 0; |
+ case naclbitc::PARAMATTR_CODE_ENTRY_OLD: return "ENTRY"; |
+ case naclbitc::PARAMATTR_CODE_ENTRY: return "ENTRY"; |
+ case naclbitc::PARAMATTR_GRP_CODE_ENTRY: return "ENTRY"; |
+ } |
+ case naclbitc::TYPE_BLOCK_ID_NEW: |
+ switch (CodeID) { |
+ default: return 0; |
+ case naclbitc::TYPE_CODE_NUMENTRY: return "NUMENTRY"; |
+ case naclbitc::TYPE_CODE_VOID: return "VOID"; |
+ case naclbitc::TYPE_CODE_FLOAT: return "FLOAT"; |
+ case naclbitc::TYPE_CODE_DOUBLE: return "DOUBLE"; |
+ case naclbitc::TYPE_CODE_LABEL: return "LABEL"; |
+ case naclbitc::TYPE_CODE_OPAQUE: return "OPAQUE"; |
+ case naclbitc::TYPE_CODE_INTEGER: return "INTEGER"; |
+ case naclbitc::TYPE_CODE_POINTER: return "POINTER"; |
+ case naclbitc::TYPE_CODE_ARRAY: return "ARRAY"; |
+ case naclbitc::TYPE_CODE_VECTOR: return "VECTOR"; |
+ case naclbitc::TYPE_CODE_X86_FP80: return "X86_FP80"; |
+ case naclbitc::TYPE_CODE_FP128: return "FP128"; |
+ case naclbitc::TYPE_CODE_PPC_FP128: return "PPC_FP128"; |
+ case naclbitc::TYPE_CODE_METADATA: return "METADATA"; |
+ case naclbitc::TYPE_CODE_STRUCT_ANON: return "STRUCT_ANON"; |
+ case naclbitc::TYPE_CODE_STRUCT_NAME: return "STRUCT_NAME"; |
+ case naclbitc::TYPE_CODE_STRUCT_NAMED: return "STRUCT_NAMED"; |
+ case naclbitc::TYPE_CODE_FUNCTION: return "FUNCTION"; |
+ } |
+ |
+ case naclbitc::CONSTANTS_BLOCK_ID: |
+ switch (CodeID) { |
+ default: return 0; |
+ case naclbitc::CST_CODE_SETTYPE: return "SETTYPE"; |
+ case naclbitc::CST_CODE_NULL: return "NULL"; |
+ case naclbitc::CST_CODE_UNDEF: return "UNDEF"; |
+ case naclbitc::CST_CODE_INTEGER: return "INTEGER"; |
+ case naclbitc::CST_CODE_WIDE_INTEGER: return "WIDE_INTEGER"; |
+ case naclbitc::CST_CODE_FLOAT: return "FLOAT"; |
+ case naclbitc::CST_CODE_AGGREGATE: return "AGGREGATE"; |
+ case naclbitc::CST_CODE_STRING: return "STRING"; |
+ case naclbitc::CST_CODE_CSTRING: return "CSTRING"; |
+ case naclbitc::CST_CODE_CE_BINOP: return "CE_BINOP"; |
+ case naclbitc::CST_CODE_CE_CAST: return "CE_CAST"; |
+ case naclbitc::CST_CODE_CE_GEP: return "CE_GEP"; |
+ case naclbitc::CST_CODE_CE_INBOUNDS_GEP: return "CE_INBOUNDS_GEP"; |
+ case naclbitc::CST_CODE_CE_SELECT: return "CE_SELECT"; |
+ case naclbitc::CST_CODE_CE_EXTRACTELT: return "CE_EXTRACTELT"; |
+ case naclbitc::CST_CODE_CE_INSERTELT: return "CE_INSERTELT"; |
+ case naclbitc::CST_CODE_CE_SHUFFLEVEC: return "CE_SHUFFLEVEC"; |
+ case naclbitc::CST_CODE_CE_CMP: return "CE_CMP"; |
+ case naclbitc::CST_CODE_INLINEASM: return "INLINEASM"; |
+ case naclbitc::CST_CODE_CE_SHUFVEC_EX: return "CE_SHUFVEC_EX"; |
+ case naclbitc::CST_CODE_BLOCKADDRESS: return "CST_CODE_BLOCKADDRESS"; |
+ case naclbitc::CST_CODE_DATA: return "DATA"; |
+ } |
+ case naclbitc::FUNCTION_BLOCK_ID: |
+ switch (CodeID) { |
+ default: return 0; |
+ case naclbitc::FUNC_CODE_DECLAREBLOCKS: return "DECLAREBLOCKS"; |
+ |
+ case naclbitc::FUNC_CODE_INST_BINOP: return "INST_BINOP"; |
+ case naclbitc::FUNC_CODE_INST_CAST: return "INST_CAST"; |
+ case naclbitc::FUNC_CODE_INST_GEP: return "INST_GEP"; |
+ case naclbitc::FUNC_CODE_INST_INBOUNDS_GEP: return "INST_INBOUNDS_GEP"; |
+ case naclbitc::FUNC_CODE_INST_SELECT: return "INST_SELECT"; |
+ case naclbitc::FUNC_CODE_INST_EXTRACTELT: return "INST_EXTRACTELT"; |
+ case naclbitc::FUNC_CODE_INST_INSERTELT: return "INST_INSERTELT"; |
+ case naclbitc::FUNC_CODE_INST_SHUFFLEVEC: return "INST_SHUFFLEVEC"; |
+ case naclbitc::FUNC_CODE_INST_CMP: return "INST_CMP"; |
+ |
+ case naclbitc::FUNC_CODE_INST_RET: return "INST_RET"; |
+ case naclbitc::FUNC_CODE_INST_BR: return "INST_BR"; |
+ case naclbitc::FUNC_CODE_INST_SWITCH: return "INST_SWITCH"; |
+ case naclbitc::FUNC_CODE_INST_INVOKE: return "INST_INVOKE"; |
+ case naclbitc::FUNC_CODE_INST_UNREACHABLE: return "INST_UNREACHABLE"; |
+ |
+ case naclbitc::FUNC_CODE_INST_PHI: return "INST_PHI"; |
+ case naclbitc::FUNC_CODE_INST_ALLOCA: return "INST_ALLOCA"; |
+ case naclbitc::FUNC_CODE_INST_LOAD: return "INST_LOAD"; |
+ case naclbitc::FUNC_CODE_INST_VAARG: return "INST_VAARG"; |
+ case naclbitc::FUNC_CODE_INST_STORE: return "INST_STORE"; |
+ case naclbitc::FUNC_CODE_INST_EXTRACTVAL: return "INST_EXTRACTVAL"; |
+ case naclbitc::FUNC_CODE_INST_INSERTVAL: return "INST_INSERTVAL"; |
+ case naclbitc::FUNC_CODE_INST_CMP2: return "INST_CMP2"; |
+ case naclbitc::FUNC_CODE_INST_VSELECT: return "INST_VSELECT"; |
+ case naclbitc::FUNC_CODE_DEBUG_LOC_AGAIN: return "DEBUG_LOC_AGAIN"; |
+ case naclbitc::FUNC_CODE_INST_CALL: return "INST_CALL"; |
+ case naclbitc::FUNC_CODE_INST_CALL_INDIRECT: return "INST_CALL_INDIRECT"; |
+ case naclbitc::FUNC_CODE_DEBUG_LOC: return "DEBUG_LOC"; |
+ case naclbitc::FUNC_CODE_INST_FORWARDTYPEREF: return "FORWARDTYPEREF"; |
+ } |
+ case naclbitc::VALUE_SYMTAB_BLOCK_ID: |
+ switch (CodeID) { |
+ default: return 0; |
+ case naclbitc::VST_CODE_ENTRY: return "ENTRY"; |
+ case naclbitc::VST_CODE_BBENTRY: return "BBENTRY"; |
+ } |
+ case naclbitc::METADATA_ATTACHMENT_ID: |
+ switch(CodeID) { |
+ default:return 0; |
+ case naclbitc::METADATA_ATTACHMENT: return "METADATA_ATTACHMENT"; |
+ } |
+ case naclbitc::METADATA_BLOCK_ID: |
+ switch(CodeID) { |
+ default:return 0; |
+ case naclbitc::METADATA_STRING: return "METADATA_STRING"; |
+ case naclbitc::METADATA_NAME: return "METADATA_NAME"; |
+ case naclbitc::METADATA_KIND: return "METADATA_KIND"; |
+ case naclbitc::METADATA_NODE: return "METADATA_NODE"; |
+ case naclbitc::METADATA_FN_NODE: return "METADATA_FN_NODE"; |
+ case naclbitc::METADATA_NAMED_NODE: return "METADATA_NAMED_NODE"; |
+ } |
+ case naclbitc::GLOBALVAR_BLOCK_ID: |
+ switch (CodeID) { |
+ default: return 0; |
+ case naclbitc::GLOBALVAR_VAR: return "VAR"; |
+ case naclbitc::GLOBALVAR_COMPOUND: return "COMPOUND"; |
+ case naclbitc::GLOBALVAR_ZEROFILL: return "ZEROFILL"; |
+ case naclbitc::GLOBALVAR_DATA: return "DATA"; |
+ case naclbitc::GLOBALVAR_RELOC: return "RELOC"; |
+ case naclbitc::GLOBALVAR_COUNT: return "COUNT"; |
+ } |
+ } |
+} |
+ |
+NaClBitcodeCodeDistElement::~NaClBitcodeCodeDistElement() {} |
+ |
+NaClBitcodeDistElement *NaClBitcodeCodeDistElement::CreateElement( |
+ NaClBitcodeDistValue Value) const { |
+ return new NaClBitcodeCodeDistElement(); |
+} |
+ |
+void NaClBitcodeCodeDistElement:: |
+GetValueList(const NaClBitcodeRecord &Record, |
+ ValueListType &ValueList) const { |
+ if (Record.GetEntryKind() == NaClBitstreamEntry::Record) { |
+ ValueList.push_back(Record.GetCode()); |
+ } |
+} |
+ |
+const char *NaClBitcodeCodeDistElement::GetTitle() const { |
+ return "Record Histogram:"; |
+} |
+ |
+const char *NaClBitcodeCodeDistElement::GetValueHeader() const { |
+ return "Record Kind"; |
+} |
+ |
+void NaClBitcodeCodeDistElement:: |
+PrintRowValue(raw_ostream &Stream, |
+ NaClBitcodeDistValue Value, |
+ const NaClBitcodeDist *Distribution) const { |
+ Stream << |
+ NaClBitcodeCodeDist:: |
+ GetCodeName(Value, |
+ cast<NaClBitcodeCodeDist>(Distribution)->GetBlockID()); |
+} |
+ |
+NaClBitcodeCodeDistElement NaClBitcodeCodeDist::DefaultSentinel; |
+ |
+NaClBitcodeCodeDist::~NaClBitcodeCodeDist() {} |
+ |
+std::string NaClBitcodeCodeDist::GetCodeName(unsigned CodeID, |
+ unsigned BlockID) { |
+ if (const char *CodeName = ::GetCodeName(CodeID, BlockID)) |
+ return CodeName; |
+ |
+ std::string Str; |
+ raw_string_ostream StrStrm(Str); |
+ StrStrm << "UnknownCode" << CodeID; |
+ return StrStrm.str(); |
+} |