1d0f9a872SJulie Hockett //===-- BitcodeReader.h - ClangDoc Bitcode Reader --------------*- C++ -*-===// 2d0f9a872SJulie Hockett // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d0f9a872SJulie Hockett // 7d0f9a872SJulie Hockett //===----------------------------------------------------------------------===// 8d0f9a872SJulie Hockett // 9d0f9a872SJulie Hockett // This file implements a reader for parsing the clang-doc internal 10d0f9a872SJulie Hockett // representation from LLVM bitcode. The reader takes in a stream of bits and 11d0f9a872SJulie Hockett // generates the set of infos that it represents. 12d0f9a872SJulie Hockett // 13d0f9a872SJulie Hockett //===----------------------------------------------------------------------===// 14d0f9a872SJulie Hockett 15d0f9a872SJulie Hockett #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_BITCODEREADER_H 16d0f9a872SJulie Hockett #define LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_BITCODEREADER_H 17d0f9a872SJulie Hockett 18d0f9a872SJulie Hockett #include "BitcodeWriter.h" 19d0f9a872SJulie Hockett #include "Representation.h" 20d0f9a872SJulie Hockett #include "clang/AST/AST.h" 21d0f9a872SJulie Hockett #include "llvm/ADT/SmallVector.h" 22e0308279SFrancis Visoiu Mistrih #include "llvm/Bitstream/BitstreamReader.h" 2346fc9592SJulie Hockett #include "llvm/Support/Error.h" 24*49e75ebdSKrzysztof Parzyszek #include <optional> 25d0f9a872SJulie Hockett 26d0f9a872SJulie Hockett namespace clang { 27d0f9a872SJulie Hockett namespace doc { 28d0f9a872SJulie Hockett 29d0f9a872SJulie Hockett // Class to read bitstream into an InfoSet collection 30d0f9a872SJulie Hockett class ClangDocBitcodeReader { 31d0f9a872SJulie Hockett public: ClangDocBitcodeReader(llvm::BitstreamCursor & Stream)32d0f9a872SJulie Hockett ClangDocBitcodeReader(llvm::BitstreamCursor &Stream) : Stream(Stream) {} 33d0f9a872SJulie Hockett 34d0f9a872SJulie Hockett // Main entry point, calls readBlock to read each block in the given stream. 358899c29bSJulie Hockett llvm::Expected<std::vector<std::unique_ptr<Info>>> readBitcode(); 36d0f9a872SJulie Hockett 37d0f9a872SJulie Hockett private: 38d0f9a872SJulie Hockett enum class Cursor { BadBlock = 1, Record, BlockEnd, BlockBegin }; 39d0f9a872SJulie Hockett 40d0f9a872SJulie Hockett // Top level parsing 4146fc9592SJulie Hockett llvm::Error validateStream(); 4246fc9592SJulie Hockett llvm::Error readVersion(); 4346fc9592SJulie Hockett llvm::Error readBlockInfoBlock(); 44d0f9a872SJulie Hockett 45d0f9a872SJulie Hockett // Read a block of records into a single Info struct, calls readRecord on each 46d0f9a872SJulie Hockett // record found. 4746fc9592SJulie Hockett template <typename T> llvm::Error readBlock(unsigned ID, T I); 48d0f9a872SJulie Hockett 49d0f9a872SJulie Hockett // Step through a block of records to find the next data field. 5046fc9592SJulie Hockett template <typename T> llvm::Error readSubBlock(unsigned ID, T I); 51d0f9a872SJulie Hockett 52d0f9a872SJulie Hockett // Read record data into the given Info data field, calling the appropriate 53d0f9a872SJulie Hockett // parseRecord functions to parse and store the data. 5446fc9592SJulie Hockett template <typename T> llvm::Error readRecord(unsigned ID, T I); 55d0f9a872SJulie Hockett 56d0f9a872SJulie Hockett // Allocate the relevant type of info and add read data to the object. 5746fc9592SJulie Hockett template <typename T> 5846fc9592SJulie Hockett llvm::Expected<std::unique_ptr<Info>> createInfo(unsigned ID); 59d0f9a872SJulie Hockett 60d0f9a872SJulie Hockett // Helper function to step through blocks to find and dispatch the next record 61d0f9a872SJulie Hockett // or block to be read. 62d0f9a872SJulie Hockett Cursor skipUntilRecordOrBlock(unsigned &BlockOrRecordID); 63d0f9a872SJulie Hockett 64b7ecf1c1SKazuaki Ishizaki // Helper function to set up the appropriate type of Info. 6546fc9592SJulie Hockett llvm::Expected<std::unique_ptr<Info>> readBlockToInfo(unsigned ID); 66d0f9a872SJulie Hockett 67d0f9a872SJulie Hockett llvm::BitstreamCursor &Stream; 68*49e75ebdSKrzysztof Parzyszek std::optional<llvm::BitstreamBlockInfo> BlockInfo; 69d0f9a872SJulie Hockett FieldId CurrentReferenceField; 70d0f9a872SJulie Hockett }; 71d0f9a872SJulie Hockett 72d0f9a872SJulie Hockett } // namespace doc 73d0f9a872SJulie Hockett } // namespace clang 74d0f9a872SJulie Hockett 75d0f9a872SJulie Hockett #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_BITCODEREADER_H 76