123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- //===-- 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/Optional.h"
- #include "llvm/ADT/SmallVector.h"
- #include "llvm/Bitstream/BitstreamReader.h"
- #include "llvm/Support/Error.h"
- 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<std::vector<std::unique_ptr<Info>>> 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 <typename T> llvm::Error readBlock(unsigned ID, T I);
- // Step through a block of records to find the next data field.
- template <typename T> 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 <typename T> llvm::Error readRecord(unsigned ID, T I);
- // Allocate the relevant type of info and add read data to the object.
- template <typename T>
- llvm::Expected<std::unique_ptr<Info>> 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<std::unique_ptr<Info>> readBlockToInfo(unsigned ID);
- llvm::BitstreamCursor &Stream;
- Optional<llvm::BitstreamBlockInfo> BlockInfo;
- FieldId CurrentReferenceField;
- };
- } // namespace doc
- } // namespace clang
- #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_BITCODEREADER_H
|