//===-- BitcodeReader.h - ClangDoc Bitcode Reader --------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements a reader for parsing the clang-doc internal // representation from LLVM bitcode. The reader takes in a stream of bits and // generates the set of infos that it represents. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_BITCODEREADER_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_BITCODEREADER_H #include "BitcodeWriter.h" #include "Representation.h" #include "clang/AST/AST.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Bitstream/BitstreamReader.h" #include "llvm/Support/Error.h" #include namespace clang { namespace doc { // Class to read bitstream into an InfoSet collection class ClangDocBitcodeReader { public: ClangDocBitcodeReader(llvm::BitstreamCursor &Stream) : Stream(Stream) {} // Main entry point, calls readBlock to read each block in the given stream. llvm::Expected>> readBitcode(); private: enum class Cursor { BadBlock = 1, Record, BlockEnd, BlockBegin }; // Top level parsing llvm::Error validateStream(); llvm::Error readVersion(); llvm::Error readBlockInfoBlock(); // Read a block of records into a single Info struct, calls readRecord on each // record found. template llvm::Error readBlock(unsigned ID, T I); // Step through a block of records to find the next data field. template llvm::Error readSubBlock(unsigned ID, T I); // Read record data into the given Info data field, calling the appropriate // parseRecord functions to parse and store the data. template llvm::Error readRecord(unsigned ID, T I); // Allocate the relevant type of info and add read data to the object. template llvm::Expected> createInfo(unsigned ID); // Helper function to step through blocks to find and dispatch the next record // or block to be read. Cursor skipUntilRecordOrBlock(unsigned &BlockOrRecordID); // Helper function to set up the appropriate type of Info. llvm::Expected> readBlockToInfo(unsigned ID); llvm::BitstreamCursor &Stream; std::optional BlockInfo; FieldId CurrentReferenceField; }; } // namespace doc } // namespace clang #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_BITCODEREADER_H