xref: /freebsd/contrib/llvm-project/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp (revision 1fc148624f50cbf93365f6d56c6587a7d268195b)
1  //===- BitcodeAnalyzer.cpp - Internal BitcodeAnalyzer implementation ------===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  
9  #include "llvm/Bitcode/BitcodeAnalyzer.h"
10  #include "llvm/Bitcode/BitcodeReader.h"
11  #include "llvm/Bitcode/LLVMBitCodes.h"
12  #include "llvm/Bitstream/BitCodes.h"
13  #include "llvm/Bitstream/BitstreamReader.h"
14  #include "llvm/Support/Format.h"
15  #include "llvm/Support/SHA1.h"
16  
17  using namespace llvm;
18  
19  static Error reportError(StringRef Message) {
20    return createStringError(std::errc::illegal_byte_sequence, Message.data());
21  }
22  
23  /// Return a symbolic block name if known, otherwise return null.
24  static Optional<const char *> GetBlockName(unsigned BlockID,
25                                             const BitstreamBlockInfo &BlockInfo,
26                                             CurStreamTypeType CurStreamType) {
27    // Standard blocks for all bitcode files.
28    if (BlockID < bitc::FIRST_APPLICATION_BLOCKID) {
29      if (BlockID == bitc::BLOCKINFO_BLOCK_ID)
30        return "BLOCKINFO_BLOCK";
31      return None;
32    }
33  
34    // Check to see if we have a blockinfo record for this block, with a name.
35    if (const BitstreamBlockInfo::BlockInfo *Info =
36            BlockInfo.getBlockInfo(BlockID)) {
37      if (!Info->Name.empty())
38        return Info->Name.c_str();
39    }
40  
41    if (CurStreamType != LLVMIRBitstream)
42      return None;
43  
44    switch (BlockID) {
45    default:
46      return None;
47    case bitc::OPERAND_BUNDLE_TAGS_BLOCK_ID:
48      return "OPERAND_BUNDLE_TAGS_BLOCK";
49    case bitc::MODULE_BLOCK_ID:
50      return "MODULE_BLOCK";
51    case bitc::PARAMATTR_BLOCK_ID:
52      return "PARAMATTR_BLOCK";
53    case bitc::PARAMATTR_GROUP_BLOCK_ID:
54      return "PARAMATTR_GROUP_BLOCK_ID";
55    case bitc::TYPE_BLOCK_ID_NEW:
56      return "TYPE_BLOCK_ID";
57    case bitc::CONSTANTS_BLOCK_ID:
58      return "CONSTANTS_BLOCK";
59    case bitc::FUNCTION_BLOCK_ID:
60      return "FUNCTION_BLOCK";
61    case bitc::IDENTIFICATION_BLOCK_ID:
62      return "IDENTIFICATION_BLOCK_ID";
63    case bitc::VALUE_SYMTAB_BLOCK_ID:
64      return "VALUE_SYMTAB";
65    case bitc::METADATA_BLOCK_ID:
66      return "METADATA_BLOCK";
67    case bitc::METADATA_KIND_BLOCK_ID:
68      return "METADATA_KIND_BLOCK";
69    case bitc::METADATA_ATTACHMENT_ID:
70      return "METADATA_ATTACHMENT_BLOCK";
71    case bitc::USELIST_BLOCK_ID:
72      return "USELIST_BLOCK_ID";
73    case bitc::GLOBALVAL_SUMMARY_BLOCK_ID:
74      return "GLOBALVAL_SUMMARY_BLOCK";
75    case bitc::FULL_LTO_GLOBALVAL_SUMMARY_BLOCK_ID:
76      return "FULL_LTO_GLOBALVAL_SUMMARY_BLOCK";
77    case bitc::MODULE_STRTAB_BLOCK_ID:
78      return "MODULE_STRTAB_BLOCK";
79    case bitc::STRTAB_BLOCK_ID:
80      return "STRTAB_BLOCK";
81    case bitc::SYMTAB_BLOCK_ID:
82      return "SYMTAB_BLOCK";
83    }
84  }
85  
86  /// Return a symbolic code name if known, otherwise return null.
87  static Optional<const char *> GetCodeName(unsigned CodeID, unsigned BlockID,
88                                            const BitstreamBlockInfo &BlockInfo,
89                                            CurStreamTypeType CurStreamType) {
90    // Standard blocks for all bitcode files.
91    if (BlockID < bitc::FIRST_APPLICATION_BLOCKID) {
92      if (BlockID == bitc::BLOCKINFO_BLOCK_ID) {
93        switch (CodeID) {
94        default:
95          return None;
96        case bitc::BLOCKINFO_CODE_SETBID:
97          return "SETBID";
98        case bitc::BLOCKINFO_CODE_BLOCKNAME:
99          return "BLOCKNAME";
100        case bitc::BLOCKINFO_CODE_SETRECORDNAME:
101          return "SETRECORDNAME";
102        }
103      }
104      return None;
105    }
106  
107    // Check to see if we have a blockinfo record for this record, with a name.
108    if (const BitstreamBlockInfo::BlockInfo *Info =
109            BlockInfo.getBlockInfo(BlockID)) {
110      for (unsigned i = 0, e = Info->RecordNames.size(); i != e; ++i)
111        if (Info->RecordNames[i].first == CodeID)
112          return Info->RecordNames[i].second.c_str();
113    }
114  
115    if (CurStreamType != LLVMIRBitstream)
116      return None;
117  
118  #define STRINGIFY_CODE(PREFIX, CODE)                                           \
119    case bitc::PREFIX##_##CODE:                                                  \
120      return #CODE;
121    switch (BlockID) {
122    default:
123      return None;
124    case bitc::MODULE_BLOCK_ID:
125      switch (CodeID) {
126      default:
127        return None;
128        STRINGIFY_CODE(MODULE_CODE, VERSION)
129        STRINGIFY_CODE(MODULE_CODE, TRIPLE)
130        STRINGIFY_CODE(MODULE_CODE, DATALAYOUT)
131        STRINGIFY_CODE(MODULE_CODE, ASM)
132        STRINGIFY_CODE(MODULE_CODE, SECTIONNAME)
133        STRINGIFY_CODE(MODULE_CODE, DEPLIB) // Deprecated, present in old bitcode
134        STRINGIFY_CODE(MODULE_CODE, GLOBALVAR)
135        STRINGIFY_CODE(MODULE_CODE, FUNCTION)
136        STRINGIFY_CODE(MODULE_CODE, ALIAS)
137        STRINGIFY_CODE(MODULE_CODE, GCNAME)
138        STRINGIFY_CODE(MODULE_CODE, VSTOFFSET)
139        STRINGIFY_CODE(MODULE_CODE, METADATA_VALUES_UNUSED)
140        STRINGIFY_CODE(MODULE_CODE, SOURCE_FILENAME)
141        STRINGIFY_CODE(MODULE_CODE, HASH)
142      }
143    case bitc::IDENTIFICATION_BLOCK_ID:
144      switch (CodeID) {
145      default:
146        return None;
147        STRINGIFY_CODE(IDENTIFICATION_CODE, STRING)
148        STRINGIFY_CODE(IDENTIFICATION_CODE, EPOCH)
149      }
150    case bitc::PARAMATTR_BLOCK_ID:
151      switch (CodeID) {
152      default:
153        return None;
154      // FIXME: Should these be different?
155      case bitc::PARAMATTR_CODE_ENTRY_OLD:
156        return "ENTRY";
157      case bitc::PARAMATTR_CODE_ENTRY:
158        return "ENTRY";
159      }
160    case bitc::PARAMATTR_GROUP_BLOCK_ID:
161      switch (CodeID) {
162      default:
163        return None;
164      case bitc::PARAMATTR_GRP_CODE_ENTRY:
165        return "ENTRY";
166      }
167    case bitc::TYPE_BLOCK_ID_NEW:
168      switch (CodeID) {
169      default:
170        return None;
171        STRINGIFY_CODE(TYPE_CODE, NUMENTRY)
172        STRINGIFY_CODE(TYPE_CODE, VOID)
173        STRINGIFY_CODE(TYPE_CODE, FLOAT)
174        STRINGIFY_CODE(TYPE_CODE, DOUBLE)
175        STRINGIFY_CODE(TYPE_CODE, LABEL)
176        STRINGIFY_CODE(TYPE_CODE, OPAQUE)
177        STRINGIFY_CODE(TYPE_CODE, INTEGER)
178        STRINGIFY_CODE(TYPE_CODE, POINTER)
179        STRINGIFY_CODE(TYPE_CODE, ARRAY)
180        STRINGIFY_CODE(TYPE_CODE, VECTOR)
181        STRINGIFY_CODE(TYPE_CODE, X86_FP80)
182        STRINGIFY_CODE(TYPE_CODE, FP128)
183        STRINGIFY_CODE(TYPE_CODE, PPC_FP128)
184        STRINGIFY_CODE(TYPE_CODE, METADATA)
185        STRINGIFY_CODE(TYPE_CODE, STRUCT_ANON)
186        STRINGIFY_CODE(TYPE_CODE, STRUCT_NAME)
187        STRINGIFY_CODE(TYPE_CODE, STRUCT_NAMED)
188        STRINGIFY_CODE(TYPE_CODE, FUNCTION)
189      }
190  
191    case bitc::CONSTANTS_BLOCK_ID:
192      switch (CodeID) {
193      default:
194        return None;
195        STRINGIFY_CODE(CST_CODE, SETTYPE)
196        STRINGIFY_CODE(CST_CODE, NULL)
197        STRINGIFY_CODE(CST_CODE, UNDEF)
198        STRINGIFY_CODE(CST_CODE, INTEGER)
199        STRINGIFY_CODE(CST_CODE, WIDE_INTEGER)
200        STRINGIFY_CODE(CST_CODE, FLOAT)
201        STRINGIFY_CODE(CST_CODE, AGGREGATE)
202        STRINGIFY_CODE(CST_CODE, STRING)
203        STRINGIFY_CODE(CST_CODE, CSTRING)
204        STRINGIFY_CODE(CST_CODE, CE_BINOP)
205        STRINGIFY_CODE(CST_CODE, CE_CAST)
206        STRINGIFY_CODE(CST_CODE, CE_GEP)
207        STRINGIFY_CODE(CST_CODE, CE_INBOUNDS_GEP)
208        STRINGIFY_CODE(CST_CODE, CE_SELECT)
209        STRINGIFY_CODE(CST_CODE, CE_EXTRACTELT)
210        STRINGIFY_CODE(CST_CODE, CE_INSERTELT)
211        STRINGIFY_CODE(CST_CODE, CE_SHUFFLEVEC)
212        STRINGIFY_CODE(CST_CODE, CE_CMP)
213        STRINGIFY_CODE(CST_CODE, INLINEASM)
214        STRINGIFY_CODE(CST_CODE, CE_SHUFVEC_EX)
215        STRINGIFY_CODE(CST_CODE, CE_UNOP)
216      case bitc::CST_CODE_BLOCKADDRESS:
217        return "CST_CODE_BLOCKADDRESS";
218        STRINGIFY_CODE(CST_CODE, DATA)
219      }
220    case bitc::FUNCTION_BLOCK_ID:
221      switch (CodeID) {
222      default:
223        return None;
224        STRINGIFY_CODE(FUNC_CODE, DECLAREBLOCKS)
225        STRINGIFY_CODE(FUNC_CODE, INST_BINOP)
226        STRINGIFY_CODE(FUNC_CODE, INST_CAST)
227        STRINGIFY_CODE(FUNC_CODE, INST_GEP_OLD)
228        STRINGIFY_CODE(FUNC_CODE, INST_INBOUNDS_GEP_OLD)
229        STRINGIFY_CODE(FUNC_CODE, INST_SELECT)
230        STRINGIFY_CODE(FUNC_CODE, INST_EXTRACTELT)
231        STRINGIFY_CODE(FUNC_CODE, INST_INSERTELT)
232        STRINGIFY_CODE(FUNC_CODE, INST_SHUFFLEVEC)
233        STRINGIFY_CODE(FUNC_CODE, INST_CMP)
234        STRINGIFY_CODE(FUNC_CODE, INST_RET)
235        STRINGIFY_CODE(FUNC_CODE, INST_BR)
236        STRINGIFY_CODE(FUNC_CODE, INST_SWITCH)
237        STRINGIFY_CODE(FUNC_CODE, INST_INVOKE)
238        STRINGIFY_CODE(FUNC_CODE, INST_UNOP)
239        STRINGIFY_CODE(FUNC_CODE, INST_UNREACHABLE)
240        STRINGIFY_CODE(FUNC_CODE, INST_CLEANUPRET)
241        STRINGIFY_CODE(FUNC_CODE, INST_CATCHRET)
242        STRINGIFY_CODE(FUNC_CODE, INST_CATCHPAD)
243        STRINGIFY_CODE(FUNC_CODE, INST_PHI)
244        STRINGIFY_CODE(FUNC_CODE, INST_ALLOCA)
245        STRINGIFY_CODE(FUNC_CODE, INST_LOAD)
246        STRINGIFY_CODE(FUNC_CODE, INST_VAARG)
247        STRINGIFY_CODE(FUNC_CODE, INST_STORE)
248        STRINGIFY_CODE(FUNC_CODE, INST_EXTRACTVAL)
249        STRINGIFY_CODE(FUNC_CODE, INST_INSERTVAL)
250        STRINGIFY_CODE(FUNC_CODE, INST_CMP2)
251        STRINGIFY_CODE(FUNC_CODE, INST_VSELECT)
252        STRINGIFY_CODE(FUNC_CODE, DEBUG_LOC_AGAIN)
253        STRINGIFY_CODE(FUNC_CODE, INST_CALL)
254        STRINGIFY_CODE(FUNC_CODE, DEBUG_LOC)
255        STRINGIFY_CODE(FUNC_CODE, INST_GEP)
256        STRINGIFY_CODE(FUNC_CODE, OPERAND_BUNDLE)
257        STRINGIFY_CODE(FUNC_CODE, INST_FENCE)
258        STRINGIFY_CODE(FUNC_CODE, INST_ATOMICRMW)
259        STRINGIFY_CODE(FUNC_CODE, INST_LOADATOMIC)
260        STRINGIFY_CODE(FUNC_CODE, INST_STOREATOMIC)
261        STRINGIFY_CODE(FUNC_CODE, INST_CMPXCHG)
262        STRINGIFY_CODE(FUNC_CODE, INST_CALLBR)
263      }
264    case bitc::VALUE_SYMTAB_BLOCK_ID:
265      switch (CodeID) {
266      default:
267        return None;
268        STRINGIFY_CODE(VST_CODE, ENTRY)
269        STRINGIFY_CODE(VST_CODE, BBENTRY)
270        STRINGIFY_CODE(VST_CODE, FNENTRY)
271        STRINGIFY_CODE(VST_CODE, COMBINED_ENTRY)
272      }
273    case bitc::MODULE_STRTAB_BLOCK_ID:
274      switch (CodeID) {
275      default:
276        return None;
277        STRINGIFY_CODE(MST_CODE, ENTRY)
278        STRINGIFY_CODE(MST_CODE, HASH)
279      }
280    case bitc::GLOBALVAL_SUMMARY_BLOCK_ID:
281    case bitc::FULL_LTO_GLOBALVAL_SUMMARY_BLOCK_ID:
282      switch (CodeID) {
283      default:
284        return None;
285        STRINGIFY_CODE(FS, PERMODULE)
286        STRINGIFY_CODE(FS, PERMODULE_PROFILE)
287        STRINGIFY_CODE(FS, PERMODULE_RELBF)
288        STRINGIFY_CODE(FS, PERMODULE_GLOBALVAR_INIT_REFS)
289        STRINGIFY_CODE(FS, PERMODULE_VTABLE_GLOBALVAR_INIT_REFS)
290        STRINGIFY_CODE(FS, COMBINED)
291        STRINGIFY_CODE(FS, COMBINED_PROFILE)
292        STRINGIFY_CODE(FS, COMBINED_GLOBALVAR_INIT_REFS)
293        STRINGIFY_CODE(FS, ALIAS)
294        STRINGIFY_CODE(FS, COMBINED_ALIAS)
295        STRINGIFY_CODE(FS, COMBINED_ORIGINAL_NAME)
296        STRINGIFY_CODE(FS, VERSION)
297        STRINGIFY_CODE(FS, FLAGS)
298        STRINGIFY_CODE(FS, TYPE_TESTS)
299        STRINGIFY_CODE(FS, TYPE_TEST_ASSUME_VCALLS)
300        STRINGIFY_CODE(FS, TYPE_CHECKED_LOAD_VCALLS)
301        STRINGIFY_CODE(FS, TYPE_TEST_ASSUME_CONST_VCALL)
302        STRINGIFY_CODE(FS, TYPE_CHECKED_LOAD_CONST_VCALL)
303        STRINGIFY_CODE(FS, VALUE_GUID)
304        STRINGIFY_CODE(FS, CFI_FUNCTION_DEFS)
305        STRINGIFY_CODE(FS, CFI_FUNCTION_DECLS)
306        STRINGIFY_CODE(FS, TYPE_ID)
307        STRINGIFY_CODE(FS, TYPE_ID_METADATA)
308        STRINGIFY_CODE(FS, BLOCK_COUNT)
309        STRINGIFY_CODE(FS, PARAM_ACCESS)
310      }
311    case bitc::METADATA_ATTACHMENT_ID:
312      switch (CodeID) {
313      default:
314        return None;
315        STRINGIFY_CODE(METADATA, ATTACHMENT)
316      }
317    case bitc::METADATA_BLOCK_ID:
318      switch (CodeID) {
319      default:
320        return None;
321        STRINGIFY_CODE(METADATA, STRING_OLD)
322        STRINGIFY_CODE(METADATA, VALUE)
323        STRINGIFY_CODE(METADATA, NODE)
324        STRINGIFY_CODE(METADATA, NAME)
325        STRINGIFY_CODE(METADATA, DISTINCT_NODE)
326        STRINGIFY_CODE(METADATA, KIND) // Older bitcode has it in a MODULE_BLOCK
327        STRINGIFY_CODE(METADATA, LOCATION)
328        STRINGIFY_CODE(METADATA, OLD_NODE)
329        STRINGIFY_CODE(METADATA, OLD_FN_NODE)
330        STRINGIFY_CODE(METADATA, NAMED_NODE)
331        STRINGIFY_CODE(METADATA, GENERIC_DEBUG)
332        STRINGIFY_CODE(METADATA, SUBRANGE)
333        STRINGIFY_CODE(METADATA, ENUMERATOR)
334        STRINGIFY_CODE(METADATA, BASIC_TYPE)
335        STRINGIFY_CODE(METADATA, FILE)
336        STRINGIFY_CODE(METADATA, DERIVED_TYPE)
337        STRINGIFY_CODE(METADATA, COMPOSITE_TYPE)
338        STRINGIFY_CODE(METADATA, SUBROUTINE_TYPE)
339        STRINGIFY_CODE(METADATA, COMPILE_UNIT)
340        STRINGIFY_CODE(METADATA, SUBPROGRAM)
341        STRINGIFY_CODE(METADATA, LEXICAL_BLOCK)
342        STRINGIFY_CODE(METADATA, LEXICAL_BLOCK_FILE)
343        STRINGIFY_CODE(METADATA, NAMESPACE)
344        STRINGIFY_CODE(METADATA, TEMPLATE_TYPE)
345        STRINGIFY_CODE(METADATA, TEMPLATE_VALUE)
346        STRINGIFY_CODE(METADATA, GLOBAL_VAR)
347        STRINGIFY_CODE(METADATA, LOCAL_VAR)
348        STRINGIFY_CODE(METADATA, EXPRESSION)
349        STRINGIFY_CODE(METADATA, OBJC_PROPERTY)
350        STRINGIFY_CODE(METADATA, IMPORTED_ENTITY)
351        STRINGIFY_CODE(METADATA, MODULE)
352        STRINGIFY_CODE(METADATA, MACRO)
353        STRINGIFY_CODE(METADATA, MACRO_FILE)
354        STRINGIFY_CODE(METADATA, STRINGS)
355        STRINGIFY_CODE(METADATA, GLOBAL_DECL_ATTACHMENT)
356        STRINGIFY_CODE(METADATA, GLOBAL_VAR_EXPR)
357        STRINGIFY_CODE(METADATA, INDEX_OFFSET)
358        STRINGIFY_CODE(METADATA, INDEX)
359      }
360    case bitc::METADATA_KIND_BLOCK_ID:
361      switch (CodeID) {
362      default:
363        return None;
364        STRINGIFY_CODE(METADATA, KIND)
365      }
366    case bitc::USELIST_BLOCK_ID:
367      switch (CodeID) {
368      default:
369        return None;
370      case bitc::USELIST_CODE_DEFAULT:
371        return "USELIST_CODE_DEFAULT";
372      case bitc::USELIST_CODE_BB:
373        return "USELIST_CODE_BB";
374      }
375  
376    case bitc::OPERAND_BUNDLE_TAGS_BLOCK_ID:
377      switch (CodeID) {
378      default:
379        return None;
380      case bitc::OPERAND_BUNDLE_TAG:
381        return "OPERAND_BUNDLE_TAG";
382      }
383    case bitc::STRTAB_BLOCK_ID:
384      switch (CodeID) {
385      default:
386        return None;
387      case bitc::STRTAB_BLOB:
388        return "BLOB";
389      }
390    case bitc::SYMTAB_BLOCK_ID:
391      switch (CodeID) {
392      default:
393        return None;
394      case bitc::SYMTAB_BLOB:
395        return "BLOB";
396      }
397    }
398  #undef STRINGIFY_CODE
399  }
400  
401  static void printSize(raw_ostream &OS, double Bits) {
402    OS << format("%.2f/%.2fB/%luW", Bits, Bits / 8, (unsigned long)(Bits / 32));
403  }
404  static void printSize(raw_ostream &OS, uint64_t Bits) {
405    OS << format("%lub/%.2fB/%luW", (unsigned long)Bits, (double)Bits / 8,
406                 (unsigned long)(Bits / 32));
407  }
408  
409  static Expected<CurStreamTypeType> ReadSignature(BitstreamCursor &Stream) {
410    auto tryRead = [&Stream](char &Dest, size_t size) -> Error {
411      if (Expected<SimpleBitstreamCursor::word_t> MaybeWord = Stream.Read(size))
412        Dest = MaybeWord.get();
413      else
414        return MaybeWord.takeError();
415      return Error::success();
416    };
417  
418    char Signature[6];
419    if (Error Err = tryRead(Signature[0], 8))
420      return std::move(Err);
421    if (Error Err = tryRead(Signature[1], 8))
422      return std::move(Err);
423  
424    // Autodetect the file contents, if it is one we know.
425    if (Signature[0] == 'C' && Signature[1] == 'P') {
426      if (Error Err = tryRead(Signature[2], 8))
427        return std::move(Err);
428      if (Error Err = tryRead(Signature[3], 8))
429        return std::move(Err);
430      if (Signature[2] == 'C' && Signature[3] == 'H')
431        return ClangSerializedASTBitstream;
432    } else if (Signature[0] == 'D' && Signature[1] == 'I') {
433      if (Error Err = tryRead(Signature[2], 8))
434        return std::move(Err);
435      if (Error Err = tryRead(Signature[3], 8))
436        return std::move(Err);
437      if (Signature[2] == 'A' && Signature[3] == 'G')
438        return ClangSerializedDiagnosticsBitstream;
439    } else if (Signature[0] == 'R' && Signature[1] == 'M') {
440      if (Error Err = tryRead(Signature[2], 8))
441        return std::move(Err);
442      if (Error Err = tryRead(Signature[3], 8))
443        return std::move(Err);
444      if (Signature[2] == 'R' && Signature[3] == 'K')
445        return LLVMBitstreamRemarks;
446    } else {
447      if (Error Err = tryRead(Signature[2], 4))
448        return std::move(Err);
449      if (Error Err = tryRead(Signature[3], 4))
450        return std::move(Err);
451      if (Error Err = tryRead(Signature[4], 4))
452        return std::move(Err);
453      if (Error Err = tryRead(Signature[5], 4))
454        return std::move(Err);
455      if (Signature[0] == 'B' && Signature[1] == 'C' && Signature[2] == 0x0 &&
456          Signature[3] == 0xC && Signature[4] == 0xE && Signature[5] == 0xD)
457        return LLVMIRBitstream;
458    }
459    return UnknownBitstream;
460  }
461  
462  static Expected<CurStreamTypeType> analyzeHeader(Optional<BCDumpOptions> O,
463                                                   BitstreamCursor &Stream) {
464    ArrayRef<uint8_t> Bytes = Stream.getBitcodeBytes();
465    const unsigned char *BufPtr = (const unsigned char *)Bytes.data();
466    const unsigned char *EndBufPtr = BufPtr + Bytes.size();
467  
468    // If we have a wrapper header, parse it and ignore the non-bc file
469    // contents. The magic number is 0x0B17C0DE stored in little endian.
470    if (isBitcodeWrapper(BufPtr, EndBufPtr)) {
471      if (Bytes.size() < BWH_HeaderSize)
472        return reportError("Invalid bitcode wrapper header");
473  
474      if (O) {
475        unsigned Magic = support::endian::read32le(&BufPtr[BWH_MagicField]);
476        unsigned Version = support::endian::read32le(&BufPtr[BWH_VersionField]);
477        unsigned Offset = support::endian::read32le(&BufPtr[BWH_OffsetField]);
478        unsigned Size = support::endian::read32le(&BufPtr[BWH_SizeField]);
479        unsigned CPUType = support::endian::read32le(&BufPtr[BWH_CPUTypeField]);
480  
481        O->OS << "<BITCODE_WRAPPER_HEADER"
482              << " Magic=" << format_hex(Magic, 10)
483              << " Version=" << format_hex(Version, 10)
484              << " Offset=" << format_hex(Offset, 10)
485              << " Size=" << format_hex(Size, 10)
486              << " CPUType=" << format_hex(CPUType, 10) << "/>\n";
487      }
488  
489      if (SkipBitcodeWrapperHeader(BufPtr, EndBufPtr, true))
490        return reportError("Invalid bitcode wrapper header");
491    }
492  
493    // Use the cursor modified by skipping the wrapper header.
494    Stream = BitstreamCursor(ArrayRef<uint8_t>(BufPtr, EndBufPtr));
495  
496    return ReadSignature(Stream);
497  }
498  
499  static bool canDecodeBlob(unsigned Code, unsigned BlockID) {
500    return BlockID == bitc::METADATA_BLOCK_ID && Code == bitc::METADATA_STRINGS;
501  }
502  
503  Error BitcodeAnalyzer::decodeMetadataStringsBlob(StringRef Indent,
504                                                   ArrayRef<uint64_t> Record,
505                                                   StringRef Blob,
506                                                   raw_ostream &OS) {
507    if (Blob.empty())
508      return reportError("Cannot decode empty blob.");
509  
510    if (Record.size() != 2)
511      return reportError(
512          "Decoding metadata strings blob needs two record entries.");
513  
514    unsigned NumStrings = Record[0];
515    unsigned StringsOffset = Record[1];
516    OS << " num-strings = " << NumStrings << " {\n";
517  
518    StringRef Lengths = Blob.slice(0, StringsOffset);
519    SimpleBitstreamCursor R(Lengths);
520    StringRef Strings = Blob.drop_front(StringsOffset);
521    do {
522      if (R.AtEndOfStream())
523        return reportError("bad length");
524  
525      Expected<uint32_t> MaybeSize = R.ReadVBR(6);
526      if (!MaybeSize)
527        return MaybeSize.takeError();
528      uint32_t Size = MaybeSize.get();
529      if (Strings.size() < Size)
530        return reportError("truncated chars");
531  
532      OS << Indent << "    '";
533      OS.write_escaped(Strings.slice(0, Size), /*hex=*/true);
534      OS << "'\n";
535      Strings = Strings.drop_front(Size);
536    } while (--NumStrings);
537  
538    OS << Indent << "  }";
539    return Error::success();
540  }
541  
542  BitcodeAnalyzer::BitcodeAnalyzer(StringRef Buffer,
543                                   Optional<StringRef> BlockInfoBuffer)
544      : Stream(Buffer) {
545    if (BlockInfoBuffer)
546      BlockInfoStream.emplace(*BlockInfoBuffer);
547  }
548  
549  Error BitcodeAnalyzer::analyze(Optional<BCDumpOptions> O,
550                                 Optional<StringRef> CheckHash) {
551    Expected<CurStreamTypeType> MaybeType = analyzeHeader(O, Stream);
552    if (!MaybeType)
553      return MaybeType.takeError();
554    else
555      CurStreamType = *MaybeType;
556  
557    Stream.setBlockInfo(&BlockInfo);
558  
559    // Read block info from BlockInfoStream, if specified.
560    // The block info must be a top-level block.
561    if (BlockInfoStream) {
562      BitstreamCursor BlockInfoCursor(*BlockInfoStream);
563      Expected<CurStreamTypeType> H = analyzeHeader(O, BlockInfoCursor);
564      if (!H)
565        return H.takeError();
566  
567      while (!BlockInfoCursor.AtEndOfStream()) {
568        Expected<unsigned> MaybeCode = BlockInfoCursor.ReadCode();
569        if (!MaybeCode)
570          return MaybeCode.takeError();
571        if (MaybeCode.get() != bitc::ENTER_SUBBLOCK)
572          return reportError("Invalid record at top-level in block info file");
573  
574        Expected<unsigned> MaybeBlockID = BlockInfoCursor.ReadSubBlockID();
575        if (!MaybeBlockID)
576          return MaybeBlockID.takeError();
577        if (MaybeBlockID.get() == bitc::BLOCKINFO_BLOCK_ID) {
578          Expected<Optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
579              BlockInfoCursor.ReadBlockInfoBlock(/*ReadBlockInfoNames=*/true);
580          if (!MaybeNewBlockInfo)
581            return MaybeNewBlockInfo.takeError();
582          Optional<BitstreamBlockInfo> NewBlockInfo =
583              std::move(MaybeNewBlockInfo.get());
584          if (!NewBlockInfo)
585            return reportError("Malformed BlockInfoBlock in block info file");
586          BlockInfo = std::move(*NewBlockInfo);
587          break;
588        }
589  
590        if (Error Err = BlockInfoCursor.SkipBlock())
591          return Err;
592      }
593    }
594  
595    // Parse the top-level structure.  We only allow blocks at the top-level.
596    while (!Stream.AtEndOfStream()) {
597      Expected<unsigned> MaybeCode = Stream.ReadCode();
598      if (!MaybeCode)
599        return MaybeCode.takeError();
600      if (MaybeCode.get() != bitc::ENTER_SUBBLOCK)
601        return reportError("Invalid record at top-level");
602  
603      Expected<unsigned> MaybeBlockID = Stream.ReadSubBlockID();
604      if (!MaybeBlockID)
605        return MaybeBlockID.takeError();
606  
607      if (Error E = parseBlock(MaybeBlockID.get(), 0, O, CheckHash))
608        return E;
609      ++NumTopBlocks;
610    }
611  
612    return Error::success();
613  }
614  
615  void BitcodeAnalyzer::printStats(BCDumpOptions O,
616                                   Optional<StringRef> Filename) {
617    uint64_t BufferSizeBits = Stream.getBitcodeBytes().size() * CHAR_BIT;
618    // Print a summary of the read file.
619    O.OS << "Summary ";
620    if (Filename)
621      O.OS << "of " << Filename->data() << ":\n";
622    O.OS << "         Total size: ";
623    printSize(O.OS, BufferSizeBits);
624    O.OS << "\n";
625    O.OS << "        Stream type: ";
626    switch (CurStreamType) {
627    case UnknownBitstream:
628      O.OS << "unknown\n";
629      break;
630    case LLVMIRBitstream:
631      O.OS << "LLVM IR\n";
632      break;
633    case ClangSerializedASTBitstream:
634      O.OS << "Clang Serialized AST\n";
635      break;
636    case ClangSerializedDiagnosticsBitstream:
637      O.OS << "Clang Serialized Diagnostics\n";
638      break;
639    case LLVMBitstreamRemarks:
640      O.OS << "LLVM Remarks\n";
641      break;
642    }
643    O.OS << "  # Toplevel Blocks: " << NumTopBlocks << "\n";
644    O.OS << "\n";
645  
646    // Emit per-block stats.
647    O.OS << "Per-block Summary:\n";
648    for (std::map<unsigned, PerBlockIDStats>::iterator I = BlockIDStats.begin(),
649                                                       E = BlockIDStats.end();
650         I != E; ++I) {
651      O.OS << "  Block ID #" << I->first;
652      if (Optional<const char *> BlockName =
653              GetBlockName(I->first, BlockInfo, CurStreamType))
654        O.OS << " (" << *BlockName << ")";
655      O.OS << ":\n";
656  
657      const PerBlockIDStats &Stats = I->second;
658      O.OS << "      Num Instances: " << Stats.NumInstances << "\n";
659      O.OS << "         Total Size: ";
660      printSize(O.OS, Stats.NumBits);
661      O.OS << "\n";
662      double pct = (Stats.NumBits * 100.0) / BufferSizeBits;
663      O.OS << "    Percent of file: " << format("%2.4f%%", pct) << "\n";
664      if (Stats.NumInstances > 1) {
665        O.OS << "       Average Size: ";
666        printSize(O.OS, Stats.NumBits / (double)Stats.NumInstances);
667        O.OS << "\n";
668        O.OS << "  Tot/Avg SubBlocks: " << Stats.NumSubBlocks << "/"
669             << Stats.NumSubBlocks / (double)Stats.NumInstances << "\n";
670        O.OS << "    Tot/Avg Abbrevs: " << Stats.NumAbbrevs << "/"
671             << Stats.NumAbbrevs / (double)Stats.NumInstances << "\n";
672        O.OS << "    Tot/Avg Records: " << Stats.NumRecords << "/"
673             << Stats.NumRecords / (double)Stats.NumInstances << "\n";
674      } else {
675        O.OS << "      Num SubBlocks: " << Stats.NumSubBlocks << "\n";
676        O.OS << "        Num Abbrevs: " << Stats.NumAbbrevs << "\n";
677        O.OS << "        Num Records: " << Stats.NumRecords << "\n";
678      }
679      if (Stats.NumRecords) {
680        double pct = (Stats.NumAbbreviatedRecords * 100.0) / Stats.NumRecords;
681        O.OS << "    Percent Abbrevs: " << format("%2.4f%%", pct) << "\n";
682      }
683      O.OS << "\n";
684  
685      // Print a histogram of the codes we see.
686      if (O.Histogram && !Stats.CodeFreq.empty()) {
687        std::vector<std::pair<unsigned, unsigned>> FreqPairs; // <freq,code>
688        for (unsigned i = 0, e = Stats.CodeFreq.size(); i != e; ++i)
689          if (unsigned Freq = Stats.CodeFreq[i].NumInstances)
690            FreqPairs.push_back(std::make_pair(Freq, i));
691        llvm::stable_sort(FreqPairs);
692        std::reverse(FreqPairs.begin(), FreqPairs.end());
693  
694        O.OS << "\tRecord Histogram:\n";
695        O.OS << "\t\t  Count    # Bits     b/Rec   % Abv  Record Kind\n";
696        for (unsigned i = 0, e = FreqPairs.size(); i != e; ++i) {
697          const PerRecordStats &RecStats = Stats.CodeFreq[FreqPairs[i].second];
698  
699          O.OS << format("\t\t%7d %9lu", RecStats.NumInstances,
700                         (unsigned long)RecStats.TotalBits);
701  
702          if (RecStats.NumInstances > 1)
703            O.OS << format(" %9.1f",
704                           (double)RecStats.TotalBits / RecStats.NumInstances);
705          else
706            O.OS << "          ";
707  
708          if (RecStats.NumAbbrev)
709            O.OS << format(" %7.2f", (double)RecStats.NumAbbrev /
710                                         RecStats.NumInstances * 100);
711          else
712            O.OS << "        ";
713  
714          O.OS << "  ";
715          if (Optional<const char *> CodeName = GetCodeName(
716                  FreqPairs[i].second, I->first, BlockInfo, CurStreamType))
717            O.OS << *CodeName << "\n";
718          else
719            O.OS << "UnknownCode" << FreqPairs[i].second << "\n";
720        }
721        O.OS << "\n";
722      }
723    }
724  }
725  
726  Error BitcodeAnalyzer::parseBlock(unsigned BlockID, unsigned IndentLevel,
727                                    Optional<BCDumpOptions> O,
728                                    Optional<StringRef> CheckHash) {
729    std::string Indent(IndentLevel * 2, ' ');
730    uint64_t BlockBitStart = Stream.GetCurrentBitNo();
731  
732    // Get the statistics for this BlockID.
733    PerBlockIDStats &BlockStats = BlockIDStats[BlockID];
734  
735    BlockStats.NumInstances++;
736  
737    // BLOCKINFO is a special part of the stream.
738    bool DumpRecords = O.hasValue();
739    if (BlockID == bitc::BLOCKINFO_BLOCK_ID) {
740      if (O)
741        O->OS << Indent << "<BLOCKINFO_BLOCK/>\n";
742      Expected<Optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
743          Stream.ReadBlockInfoBlock(/*ReadBlockInfoNames=*/true);
744      if (!MaybeNewBlockInfo)
745        return MaybeNewBlockInfo.takeError();
746      Optional<BitstreamBlockInfo> NewBlockInfo =
747          std::move(MaybeNewBlockInfo.get());
748      if (!NewBlockInfo)
749        return reportError("Malformed BlockInfoBlock");
750      BlockInfo = std::move(*NewBlockInfo);
751      if (Error Err = Stream.JumpToBit(BlockBitStart))
752        return Err;
753      // It's not really interesting to dump the contents of the blockinfo
754      // block.
755      DumpRecords = false;
756    }
757  
758    unsigned NumWords = 0;
759    if (Error Err = Stream.EnterSubBlock(BlockID, &NumWords))
760      return Err;
761  
762    // Keep it for later, when we see a MODULE_HASH record
763    uint64_t BlockEntryPos = Stream.getCurrentByteNo();
764  
765    Optional<const char *> BlockName = None;
766    if (DumpRecords) {
767      O->OS << Indent << "<";
768      if ((BlockName = GetBlockName(BlockID, BlockInfo, CurStreamType)))
769        O->OS << *BlockName;
770      else
771        O->OS << "UnknownBlock" << BlockID;
772  
773      if (!O->Symbolic && BlockName)
774        O->OS << " BlockID=" << BlockID;
775  
776      O->OS << " NumWords=" << NumWords
777            << " BlockCodeSize=" << Stream.getAbbrevIDWidth() << ">\n";
778    }
779  
780    SmallVector<uint64_t, 64> Record;
781  
782    // Keep the offset to the metadata index if seen.
783    uint64_t MetadataIndexOffset = 0;
784  
785    // Read all the records for this block.
786    while (1) {
787      if (Stream.AtEndOfStream())
788        return reportError("Premature end of bitstream");
789  
790      uint64_t RecordStartBit = Stream.GetCurrentBitNo();
791  
792      Expected<BitstreamEntry> MaybeEntry =
793          Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs);
794      if (!MaybeEntry)
795        return MaybeEntry.takeError();
796      BitstreamEntry Entry = MaybeEntry.get();
797  
798      switch (Entry.Kind) {
799      case BitstreamEntry::Error:
800        return reportError("malformed bitcode file");
801      case BitstreamEntry::EndBlock: {
802        uint64_t BlockBitEnd = Stream.GetCurrentBitNo();
803        BlockStats.NumBits += BlockBitEnd - BlockBitStart;
804        if (DumpRecords) {
805          O->OS << Indent << "</";
806          if (BlockName)
807            O->OS << *BlockName << ">\n";
808          else
809            O->OS << "UnknownBlock" << BlockID << ">\n";
810        }
811        return Error::success();
812      }
813  
814      case BitstreamEntry::SubBlock: {
815        uint64_t SubBlockBitStart = Stream.GetCurrentBitNo();
816        if (Error E = parseBlock(Entry.ID, IndentLevel + 1, O, CheckHash))
817          return E;
818        ++BlockStats.NumSubBlocks;
819        uint64_t SubBlockBitEnd = Stream.GetCurrentBitNo();
820  
821        // Don't include subblock sizes in the size of this block.
822        BlockBitStart += SubBlockBitEnd - SubBlockBitStart;
823        continue;
824      }
825      case BitstreamEntry::Record:
826        // The interesting case.
827        break;
828      }
829  
830      if (Entry.ID == bitc::DEFINE_ABBREV) {
831        if (Error Err = Stream.ReadAbbrevRecord())
832          return Err;
833        ++BlockStats.NumAbbrevs;
834        continue;
835      }
836  
837      Record.clear();
838  
839      ++BlockStats.NumRecords;
840  
841      StringRef Blob;
842      uint64_t CurrentRecordPos = Stream.GetCurrentBitNo();
843      Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record, &Blob);
844      if (!MaybeCode)
845        return MaybeCode.takeError();
846      unsigned Code = MaybeCode.get();
847  
848      // Increment the # occurrences of this code.
849      if (BlockStats.CodeFreq.size() <= Code)
850        BlockStats.CodeFreq.resize(Code + 1);
851      BlockStats.CodeFreq[Code].NumInstances++;
852      BlockStats.CodeFreq[Code].TotalBits +=
853          Stream.GetCurrentBitNo() - RecordStartBit;
854      if (Entry.ID != bitc::UNABBREV_RECORD) {
855        BlockStats.CodeFreq[Code].NumAbbrev++;
856        ++BlockStats.NumAbbreviatedRecords;
857      }
858  
859      if (DumpRecords) {
860        O->OS << Indent << "  <";
861        Optional<const char *> CodeName =
862            GetCodeName(Code, BlockID, BlockInfo, CurStreamType);
863        if (CodeName)
864          O->OS << *CodeName;
865        else
866          O->OS << "UnknownCode" << Code;
867        if (!O->Symbolic && CodeName)
868          O->OS << " codeid=" << Code;
869        const BitCodeAbbrev *Abbv = nullptr;
870        if (Entry.ID != bitc::UNABBREV_RECORD) {
871          Abbv = Stream.getAbbrev(Entry.ID);
872          O->OS << " abbrevid=" << Entry.ID;
873        }
874  
875        for (unsigned i = 0, e = Record.size(); i != e; ++i)
876          O->OS << " op" << i << "=" << (int64_t)Record[i];
877  
878        // If we found a metadata index, let's verify that we had an offset
879        // before and validate its forward reference offset was correct!
880        if (BlockID == bitc::METADATA_BLOCK_ID) {
881          if (Code == bitc::METADATA_INDEX_OFFSET) {
882            if (Record.size() != 2)
883              O->OS << "(Invalid record)";
884            else {
885              auto Offset = Record[0] + (Record[1] << 32);
886              MetadataIndexOffset = Stream.GetCurrentBitNo() + Offset;
887            }
888          }
889          if (Code == bitc::METADATA_INDEX) {
890            O->OS << " (offset ";
891            if (MetadataIndexOffset == RecordStartBit)
892              O->OS << "match)";
893            else
894              O->OS << "mismatch: " << MetadataIndexOffset << " vs "
895                    << RecordStartBit << ")";
896          }
897        }
898  
899        // If we found a module hash, let's verify that it matches!
900        if (BlockID == bitc::MODULE_BLOCK_ID && Code == bitc::MODULE_CODE_HASH &&
901            CheckHash.hasValue()) {
902          if (Record.size() != 5)
903            O->OS << " (invalid)";
904          else {
905            // Recompute the hash and compare it to the one in the bitcode
906            SHA1 Hasher;
907            StringRef Hash;
908            Hasher.update(*CheckHash);
909            {
910              int BlockSize = (CurrentRecordPos / 8) - BlockEntryPos;
911              auto Ptr = Stream.getPointerToByte(BlockEntryPos, BlockSize);
912              Hasher.update(ArrayRef<uint8_t>(Ptr, BlockSize));
913              Hash = Hasher.result();
914            }
915            std::array<char, 20> RecordedHash;
916            int Pos = 0;
917            for (auto &Val : Record) {
918              assert(!(Val >> 32) && "Unexpected high bits set");
919              support::endian::write32be(&RecordedHash[Pos], Val);
920              Pos += 4;
921            }
922            if (Hash == StringRef(RecordedHash.data(), RecordedHash.size()))
923              O->OS << " (match)";
924            else
925              O->OS << " (!mismatch!)";
926          }
927        }
928  
929        O->OS << "/>";
930  
931        if (Abbv) {
932          for (unsigned i = 1, e = Abbv->getNumOperandInfos(); i != e; ++i) {
933            const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
934            if (!Op.isEncoding() || Op.getEncoding() != BitCodeAbbrevOp::Array)
935              continue;
936            assert(i + 2 == e && "Array op not second to last");
937            std::string Str;
938            bool ArrayIsPrintable = true;
939            for (unsigned j = i - 1, je = Record.size(); j != je; ++j) {
940              if (!isPrint(static_cast<unsigned char>(Record[j]))) {
941                ArrayIsPrintable = false;
942                break;
943              }
944              Str += (char)Record[j];
945            }
946            if (ArrayIsPrintable)
947              O->OS << " record string = '" << Str << "'";
948            break;
949          }
950        }
951  
952        if (Blob.data()) {
953          if (canDecodeBlob(Code, BlockID)) {
954            if (Error E = decodeMetadataStringsBlob(Indent, Record, Blob, O->OS))
955              return E;
956          } else {
957            O->OS << " blob data = ";
958            if (O->ShowBinaryBlobs) {
959              O->OS << "'";
960              O->OS.write_escaped(Blob, /*hex=*/true) << "'";
961            } else {
962              bool BlobIsPrintable = true;
963              for (unsigned i = 0, e = Blob.size(); i != e; ++i)
964                if (!isPrint(static_cast<unsigned char>(Blob[i]))) {
965                  BlobIsPrintable = false;
966                  break;
967                }
968  
969              if (BlobIsPrintable)
970                O->OS << "'" << Blob << "'";
971              else
972                O->OS << "unprintable, " << Blob.size() << " bytes.";
973            }
974          }
975        }
976  
977        O->OS << "\n";
978      }
979  
980      // Make sure that we can skip the current record.
981      if (Error Err = Stream.JumpToBit(CurrentRecordPos))
982        return Err;
983      if (Expected<unsigned> Skipped = Stream.skipRecord(Entry.ID))
984        ; // Do nothing.
985      else
986        return Skipped.takeError();
987    }
988  }
989  
990