OLD | NEW |
(Empty) | |
| 1 //===-- NaClBitcodeCodeDist.cpp -------------------------------------------===// |
| 2 // Implements distribution maps for record codes within a PNaCl bitcode |
| 3 // file. |
| 4 // |
| 5 // The LLVM Compiler Infrastructure |
| 6 // |
| 7 // This file is distributed under the University of Illinois Open Source |
| 8 // License. See LICENSE.TXT for details. |
| 9 // |
| 10 //===----------------------------------------------------------------------===// |
| 11 |
| 12 #include "llvm/Bitcode/NaCl/NaClBitcodeCodeDist.h" |
| 13 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" |
| 14 #include "llvm/Support/raw_ostream.h" |
| 15 |
| 16 using namespace llvm; |
| 17 |
| 18 /// GetCodeName - Return a symbolic code name if known, otherwise return |
| 19 /// null. |
| 20 static const char *GetCodeName(unsigned CodeID, unsigned BlockID) { |
| 21 // Standard blocks for all bitcode files. |
| 22 if (BlockID < naclbitc::FIRST_APPLICATION_BLOCKID) { |
| 23 if (BlockID == naclbitc::BLOCKINFO_BLOCK_ID) { |
| 24 switch (CodeID) { |
| 25 default: return 0; |
| 26 case naclbitc::BLOCKINFO_CODE_SETBID: return "SETBID"; |
| 27 } |
| 28 } |
| 29 return 0; |
| 30 } |
| 31 |
| 32 switch (BlockID) { |
| 33 default: return 0; |
| 34 case naclbitc::MODULE_BLOCK_ID: |
| 35 switch (CodeID) { |
| 36 default: return 0; |
| 37 case naclbitc::MODULE_CODE_VERSION: return "VERSION"; |
| 38 case naclbitc::MODULE_CODE_TRIPLE: return "TRIPLE"; |
| 39 case naclbitc::MODULE_CODE_DATALAYOUT: return "DATALAYOUT"; |
| 40 case naclbitc::MODULE_CODE_ASM: return "ASM"; |
| 41 case naclbitc::MODULE_CODE_SECTIONNAME: return "SECTIONNAME"; |
| 42 case naclbitc::MODULE_CODE_DEPLIB: return "DEPLIB"; // FIXME: Remove in
4.0 |
| 43 case naclbitc::MODULE_CODE_GLOBALVAR: return "GLOBALVAR"; |
| 44 case naclbitc::MODULE_CODE_FUNCTION: return "FUNCTION"; |
| 45 case naclbitc::MODULE_CODE_ALIAS: return "ALIAS"; |
| 46 case naclbitc::MODULE_CODE_PURGEVALS: return "PURGEVALS"; |
| 47 case naclbitc::MODULE_CODE_GCNAME: return "GCNAME"; |
| 48 } |
| 49 case naclbitc::PARAMATTR_BLOCK_ID: |
| 50 switch (CodeID) { |
| 51 default: return 0; |
| 52 case naclbitc::PARAMATTR_CODE_ENTRY_OLD: return "ENTRY"; |
| 53 case naclbitc::PARAMATTR_CODE_ENTRY: return "ENTRY"; |
| 54 case naclbitc::PARAMATTR_GRP_CODE_ENTRY: return "ENTRY"; |
| 55 } |
| 56 case naclbitc::TYPE_BLOCK_ID_NEW: |
| 57 switch (CodeID) { |
| 58 default: return 0; |
| 59 case naclbitc::TYPE_CODE_NUMENTRY: return "NUMENTRY"; |
| 60 case naclbitc::TYPE_CODE_VOID: return "VOID"; |
| 61 case naclbitc::TYPE_CODE_FLOAT: return "FLOAT"; |
| 62 case naclbitc::TYPE_CODE_DOUBLE: return "DOUBLE"; |
| 63 case naclbitc::TYPE_CODE_LABEL: return "LABEL"; |
| 64 case naclbitc::TYPE_CODE_OPAQUE: return "OPAQUE"; |
| 65 case naclbitc::TYPE_CODE_INTEGER: return "INTEGER"; |
| 66 case naclbitc::TYPE_CODE_POINTER: return "POINTER"; |
| 67 case naclbitc::TYPE_CODE_ARRAY: return "ARRAY"; |
| 68 case naclbitc::TYPE_CODE_VECTOR: return "VECTOR"; |
| 69 case naclbitc::TYPE_CODE_X86_FP80: return "X86_FP80"; |
| 70 case naclbitc::TYPE_CODE_FP128: return "FP128"; |
| 71 case naclbitc::TYPE_CODE_PPC_FP128: return "PPC_FP128"; |
| 72 case naclbitc::TYPE_CODE_METADATA: return "METADATA"; |
| 73 case naclbitc::TYPE_CODE_STRUCT_ANON: return "STRUCT_ANON"; |
| 74 case naclbitc::TYPE_CODE_STRUCT_NAME: return "STRUCT_NAME"; |
| 75 case naclbitc::TYPE_CODE_STRUCT_NAMED: return "STRUCT_NAMED"; |
| 76 case naclbitc::TYPE_CODE_FUNCTION: return "FUNCTION"; |
| 77 } |
| 78 |
| 79 case naclbitc::CONSTANTS_BLOCK_ID: |
| 80 switch (CodeID) { |
| 81 default: return 0; |
| 82 case naclbitc::CST_CODE_SETTYPE: return "SETTYPE"; |
| 83 case naclbitc::CST_CODE_NULL: return "NULL"; |
| 84 case naclbitc::CST_CODE_UNDEF: return "UNDEF"; |
| 85 case naclbitc::CST_CODE_INTEGER: return "INTEGER"; |
| 86 case naclbitc::CST_CODE_WIDE_INTEGER: return "WIDE_INTEGER"; |
| 87 case naclbitc::CST_CODE_FLOAT: return "FLOAT"; |
| 88 case naclbitc::CST_CODE_AGGREGATE: return "AGGREGATE"; |
| 89 case naclbitc::CST_CODE_STRING: return "STRING"; |
| 90 case naclbitc::CST_CODE_CSTRING: return "CSTRING"; |
| 91 case naclbitc::CST_CODE_CE_BINOP: return "CE_BINOP"; |
| 92 case naclbitc::CST_CODE_CE_CAST: return "CE_CAST"; |
| 93 case naclbitc::CST_CODE_CE_GEP: return "CE_GEP"; |
| 94 case naclbitc::CST_CODE_CE_INBOUNDS_GEP: return "CE_INBOUNDS_GEP"; |
| 95 case naclbitc::CST_CODE_CE_SELECT: return "CE_SELECT"; |
| 96 case naclbitc::CST_CODE_CE_EXTRACTELT: return "CE_EXTRACTELT"; |
| 97 case naclbitc::CST_CODE_CE_INSERTELT: return "CE_INSERTELT"; |
| 98 case naclbitc::CST_CODE_CE_SHUFFLEVEC: return "CE_SHUFFLEVEC"; |
| 99 case naclbitc::CST_CODE_CE_CMP: return "CE_CMP"; |
| 100 case naclbitc::CST_CODE_INLINEASM: return "INLINEASM"; |
| 101 case naclbitc::CST_CODE_CE_SHUFVEC_EX: return "CE_SHUFVEC_EX"; |
| 102 case naclbitc::CST_CODE_BLOCKADDRESS: return "CST_CODE_BLOCKADDRESS"; |
| 103 case naclbitc::CST_CODE_DATA: return "DATA"; |
| 104 } |
| 105 case naclbitc::FUNCTION_BLOCK_ID: |
| 106 switch (CodeID) { |
| 107 default: return 0; |
| 108 case naclbitc::FUNC_CODE_DECLAREBLOCKS: return "DECLAREBLOCKS"; |
| 109 |
| 110 case naclbitc::FUNC_CODE_INST_BINOP: return "INST_BINOP"; |
| 111 case naclbitc::FUNC_CODE_INST_CAST: return "INST_CAST"; |
| 112 case naclbitc::FUNC_CODE_INST_GEP: return "INST_GEP"; |
| 113 case naclbitc::FUNC_CODE_INST_INBOUNDS_GEP: return "INST_INBOUNDS_GEP"; |
| 114 case naclbitc::FUNC_CODE_INST_SELECT: return "INST_SELECT"; |
| 115 case naclbitc::FUNC_CODE_INST_EXTRACTELT: return "INST_EXTRACTELT"; |
| 116 case naclbitc::FUNC_CODE_INST_INSERTELT: return "INST_INSERTELT"; |
| 117 case naclbitc::FUNC_CODE_INST_SHUFFLEVEC: return "INST_SHUFFLEVEC"; |
| 118 case naclbitc::FUNC_CODE_INST_CMP: return "INST_CMP"; |
| 119 |
| 120 case naclbitc::FUNC_CODE_INST_RET: return "INST_RET"; |
| 121 case naclbitc::FUNC_CODE_INST_BR: return "INST_BR"; |
| 122 case naclbitc::FUNC_CODE_INST_SWITCH: return "INST_SWITCH"; |
| 123 case naclbitc::FUNC_CODE_INST_INVOKE: return "INST_INVOKE"; |
| 124 case naclbitc::FUNC_CODE_INST_UNREACHABLE: return "INST_UNREACHABLE"; |
| 125 |
| 126 case naclbitc::FUNC_CODE_INST_PHI: return "INST_PHI"; |
| 127 case naclbitc::FUNC_CODE_INST_ALLOCA: return "INST_ALLOCA"; |
| 128 case naclbitc::FUNC_CODE_INST_LOAD: return "INST_LOAD"; |
| 129 case naclbitc::FUNC_CODE_INST_VAARG: return "INST_VAARG"; |
| 130 case naclbitc::FUNC_CODE_INST_STORE: return "INST_STORE"; |
| 131 case naclbitc::FUNC_CODE_INST_EXTRACTVAL: return "INST_EXTRACTVAL"; |
| 132 case naclbitc::FUNC_CODE_INST_INSERTVAL: return "INST_INSERTVAL"; |
| 133 case naclbitc::FUNC_CODE_INST_CMP2: return "INST_CMP2"; |
| 134 case naclbitc::FUNC_CODE_INST_VSELECT: return "INST_VSELECT"; |
| 135 case naclbitc::FUNC_CODE_DEBUG_LOC_AGAIN: return "DEBUG_LOC_AGAIN"; |
| 136 case naclbitc::FUNC_CODE_INST_CALL: return "INST_CALL"; |
| 137 case naclbitc::FUNC_CODE_INST_CALL_INDIRECT: return "INST_CALL_INDIRECT"; |
| 138 case naclbitc::FUNC_CODE_DEBUG_LOC: return "DEBUG_LOC"; |
| 139 case naclbitc::FUNC_CODE_INST_FORWARDTYPEREF: return "FORWARDTYPEREF"; |
| 140 } |
| 141 case naclbitc::VALUE_SYMTAB_BLOCK_ID: |
| 142 switch (CodeID) { |
| 143 default: return 0; |
| 144 case naclbitc::VST_CODE_ENTRY: return "ENTRY"; |
| 145 case naclbitc::VST_CODE_BBENTRY: return "BBENTRY"; |
| 146 } |
| 147 case naclbitc::METADATA_ATTACHMENT_ID: |
| 148 switch(CodeID) { |
| 149 default:return 0; |
| 150 case naclbitc::METADATA_ATTACHMENT: return "METADATA_ATTACHMENT"; |
| 151 } |
| 152 case naclbitc::METADATA_BLOCK_ID: |
| 153 switch(CodeID) { |
| 154 default:return 0; |
| 155 case naclbitc::METADATA_STRING: return "METADATA_STRING"; |
| 156 case naclbitc::METADATA_NAME: return "METADATA_NAME"; |
| 157 case naclbitc::METADATA_KIND: return "METADATA_KIND"; |
| 158 case naclbitc::METADATA_NODE: return "METADATA_NODE"; |
| 159 case naclbitc::METADATA_FN_NODE: return "METADATA_FN_NODE"; |
| 160 case naclbitc::METADATA_NAMED_NODE: return "METADATA_NAMED_NODE"; |
| 161 } |
| 162 case naclbitc::GLOBALVAR_BLOCK_ID: |
| 163 switch (CodeID) { |
| 164 default: return 0; |
| 165 case naclbitc::GLOBALVAR_VAR: return "VAR"; |
| 166 case naclbitc::GLOBALVAR_COMPOUND: return "COMPOUND"; |
| 167 case naclbitc::GLOBALVAR_ZEROFILL: return "ZEROFILL"; |
| 168 case naclbitc::GLOBALVAR_DATA: return "DATA"; |
| 169 case naclbitc::GLOBALVAR_RELOC: return "RELOC"; |
| 170 case naclbitc::GLOBALVAR_COUNT: return "COUNT"; |
| 171 } |
| 172 } |
| 173 } |
| 174 |
| 175 NaClBitcodeCodeDistElement::~NaClBitcodeCodeDistElement() {} |
| 176 |
| 177 NaClBitcodeDistElement *NaClBitcodeCodeDistElement::CreateElement( |
| 178 NaClBitcodeDistValue Value) const { |
| 179 return new NaClBitcodeCodeDistElement(); |
| 180 } |
| 181 |
| 182 void NaClBitcodeCodeDistElement:: |
| 183 GetValueList(const NaClBitcodeRecord &Record, |
| 184 ValueListType &ValueList) const { |
| 185 if (Record.GetEntryKind() == NaClBitstreamEntry::Record) { |
| 186 ValueList.push_back(Record.GetCode()); |
| 187 } |
| 188 } |
| 189 |
| 190 const char *NaClBitcodeCodeDistElement::GetTitle() const { |
| 191 return "Record Histogram:"; |
| 192 } |
| 193 |
| 194 const char *NaClBitcodeCodeDistElement::GetValueHeader() const { |
| 195 return "Record Kind"; |
| 196 } |
| 197 |
| 198 void NaClBitcodeCodeDistElement:: |
| 199 PrintRowValue(raw_ostream &Stream, |
| 200 NaClBitcodeDistValue Value, |
| 201 const NaClBitcodeDist *Distribution) const { |
| 202 Stream << |
| 203 NaClBitcodeCodeDist:: |
| 204 GetCodeName(Value, |
| 205 cast<NaClBitcodeCodeDist>(Distribution)->GetBlockID()); |
| 206 } |
| 207 |
| 208 NaClBitcodeCodeDistElement NaClBitcodeCodeDist::DefaultSentinel; |
| 209 |
| 210 NaClBitcodeCodeDist::~NaClBitcodeCodeDist() {} |
| 211 |
| 212 std::string NaClBitcodeCodeDist::GetCodeName(unsigned CodeID, |
| 213 unsigned BlockID) { |
| 214 if (const char *CodeName = ::GetCodeName(CodeID, BlockID)) |
| 215 return CodeName; |
| 216 |
| 217 std::string Str; |
| 218 raw_string_ostream StrStrm(Str); |
| 219 StrStrm << "UnknownCode" << CodeID; |
| 220 return StrStrm.str(); |
| 221 } |
OLD | NEW |