10#include "llvm/ADT/IndexedMap.h"
11#include <initializer_list>
31using AbbrevDsc = void (*)(std::shared_ptr<llvm::BitCodeAbbrev> &Abbrev);
35 const std::initializer_list<llvm::BitCodeAbbrevOp> Ops) {
36 for (
const auto &Op : Ops)
40static void genBoolAbbrev(std::shared_ptr<llvm::BitCodeAbbrev> &Abbrev) {
43 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
47static void genIntAbbrev(std::shared_ptr<llvm::BitCodeAbbrev> &Abbrev) {
50 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
57 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
60 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Array),
61 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
68 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
71 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)});
79 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
82 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
85 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
88 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
91 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)});
103 operator bool()
const {
104 return Abbrev !=
nullptr &&
Name.data() !=
nullptr && !
Name.empty();
108static const llvm::IndexedMap<llvm::StringRef, BlockIdToIndexFunctor>
110 llvm::IndexedMap<llvm::StringRef, BlockIdToIndexFunctor>
BlockIdNameMap;
115 static const std::vector<std::pair<BlockId, const char *const>> Inits = {
137 for (
const auto &Init : Inits)
143static const llvm::IndexedMap<RecordIdDsc, RecordIdToIndexFunctor>
150 static const std::vector<std::pair<RecordId, RecordIdDsc>> Inits = {
234 for (
const auto &Init : Inits) {
242static const std::vector<std::pair<BlockId, std::vector<RecordId>>>
306void ClangDocBitcodeWriter::AbbreviationMap::add(
RecordId RID,
309 assert(!Abbrevs.contains(RID) &&
"Abbreviation already added.");
310 Abbrevs[RID] = AbbrevID;
313unsigned ClangDocBitcodeWriter::AbbreviationMap::get(
RecordId RID)
const {
315 assert(Abbrevs.contains(RID) &&
"Unknown abbreviation.");
316 return Abbrevs.lookup(RID);
323void ClangDocBitcodeWriter::emitHeader() {
328void ClangDocBitcodeWriter::emitVersionBlock() {
334void ClangDocBitcodeWriter::emitBlockID(
BlockId BID) {
336 assert(BlockIdName.data() && BlockIdName.size() &&
"Unknown BlockId.");
339 Record.push_back(BID);
340 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID, Record);
341 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME,
342 ArrayRef<unsigned char>(BlockIdName.bytes_begin(),
343 BlockIdName.bytes_end()));
347void ClangDocBitcodeWriter::emitRecordID(
RecordId ID) {
352 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, Record);
359 auto Abbrev = std::make_shared<llvm::BitCodeAbbrev>();
360 Abbrev->Add(llvm::BitCodeAbbrevOp(ID));
362 Abbrevs.add(ID, Stream.EmitBlockInfoAbbrev(Block, std::move(Abbrev)));
370 "Abbrev type mismatch.");
371 if (!prepRecordData(ID, Sym !=
EmptySID))
373 assert(Sym.size() == 20);
374 Record.push_back(Sym.size());
375 Record.append(Sym.begin(), Sym.end());
376 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
379void ClangDocBitcodeWriter::emitRecord(llvm::StringRef Str,
RecordId ID) {
382 "Abbrev type mismatch.");
383 if (!prepRecordData(ID, !Str.empty()))
386 Record.push_back(Str.size());
387 Stream.EmitRecordWithBlob(Abbrevs.get(ID), Record, Str);
390void ClangDocBitcodeWriter::emitRecord(
const Location &Loc,
RecordId ID) {
393 "Abbrev type mismatch.");
394 if (!prepRecordData(ID,
true))
397 Record.push_back(Loc.StartLineNumber);
398 Record.push_back(Loc.EndLineNumber);
400 Record.push_back(Loc.IsFileInRootDir);
401 Record.push_back(Loc.Filename.size());
402 Stream.EmitRecordWithBlob(Abbrevs.get(ID), Record, Loc.Filename);
405void ClangDocBitcodeWriter::emitRecord(
bool Val,
RecordId ID) {
408 "Abbrev type mismatch.");
409 if (!prepRecordData(ID, Val))
411 Record.push_back(Val);
412 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
415void ClangDocBitcodeWriter::emitRecord(
int Val,
RecordId ID) {
418 "Abbrev type mismatch.");
419 if (!prepRecordData(ID, Val))
422 Record.push_back(Val);
423 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
426void ClangDocBitcodeWriter::emitRecord(
unsigned Val,
RecordId ID) {
429 "Abbrev type mismatch.");
430 if (!prepRecordData(ID, Val))
433 Record.push_back(Val);
434 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
437void ClangDocBitcodeWriter::emitRecord(
const TemplateInfo &Templ) {}
439bool ClangDocBitcodeWriter::prepRecordData(
RecordId ID,
bool ShouldEmit) {
444 Record.push_back(ID);
450void ClangDocBitcodeWriter::emitBlockInfoBlock() {
451 Stream.EnterBlockInfoBlock();
454 emitBlockInfo(Block.first, Block.second);
459void ClangDocBitcodeWriter::emitBlockInfo(
BlockId BID,
460 const std::vector<RecordId> &RIDs) {
465 emitAbbrev(RID, BID);
491 for (
const auto &P : *R.
Params)
508 for (
const auto &N : T.Namespace)
510 for (
const auto &CI : T.Description)
536 for (
const auto &CI : T.Description)
544 for (
const auto &L : std::vector<std::pair<llvm::StringRef, RecordId>>{
550 emitRecord(L.first, L.second);
557 for (
const auto &A : I.
Args)
598 for (
const auto &L : I.
Loc)
603 for (
const auto &N : I.
Members)
628 for (
const auto &L : I.
Loc)
632 for (
const auto &N : I.
Members)
634 for (
const auto &P : I.
Parents)
638 for (
const auto &PB : I.
Bases)
650 for (
const auto &C : I.
Friends)
663 for (
const auto &M : I.
Members)
682 for (
const auto &L : I.
Loc)
686 for (
const auto &N : I.
Params)
705 for (
const auto &P : T.Params)
707 if (T.Specialization)
709 for (
const auto &C : T.Constraints)
716 for (
const auto &P : T.Params)
772 llvm::errs() <<
"Unexpected info, unable to write.\n";
void emitBlock(const NamespaceInfo &I)
bool dispatchInfoForWrite(Info *I)
static void genStringAbbrev(std::shared_ptr< llvm::BitCodeAbbrev > &Abbrev)
static const llvm::IndexedMap< RecordIdDsc, RecordIdToIndexFunctor > RecordIdNameMap
static void generateAbbrev(std::shared_ptr< llvm::BitCodeAbbrev > &Abbrev, const std::initializer_list< llvm::BitCodeAbbrevOp > Ops)
static const llvm::IndexedMap< llvm::StringRef, BlockIdToIndexFunctor > BlockIdNameMap
@ TEMPLATE_SPECIALIZATION_OF
@ MEMBER_TYPE_IS_TEMPLATE
@ TEMPLATE_PARAM_CONTENTS
@ CONCEPT_CONSTRAINT_EXPRESSION
static constexpr unsigned BlockIdCount
static const std::vector< std::pair< BlockId, std::vector< RecordId > > > RecordsByBlock
static const unsigned VersionNumber
void(*)(std::shared_ptr< llvm::BitCodeAbbrev > &Abbrev) AbbrevDsc
static void genIntAbbrev(std::shared_ptr< llvm::BitCodeAbbrev > &Abbrev)
static void genBoolAbbrev(std::shared_ptr< llvm::BitCodeAbbrev > &Abbrev)
static constexpr unsigned RecordIdCount
std::array< uint8_t, 20 > SymbolID
llvm::StringRef commentKindToString(CommentKind Kind)
static void genSymbolIdAbbrev(std::shared_ptr< llvm::BitCodeAbbrev > &Abbrev)
@ BI_TEMPLATE_SPECIALIZATION_BLOCK_ID
@ BI_TEMPLATE_PARAM_BLOCK_ID
@ BI_MEMBER_TYPE_BLOCK_ID
@ BI_BASE_RECORD_BLOCK_ID
static void genLocationAbbrev(std::shared_ptr< llvm::BitCodeAbbrev > &Abbrev)
static const SymbolID EmptySID
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
static constexpr unsigned BoolSize
static constexpr unsigned LineNumberSize
static constexpr unsigned RecordSize
static constexpr unsigned StringLengthSize
static constexpr unsigned USRBitLengthSize
static constexpr unsigned char Signature[4]
static constexpr unsigned IntSize
static constexpr unsigned SignatureBitSize
static constexpr unsigned SubblockIDSize
static constexpr unsigned USRLengthSize
unsigned operator()(unsigned ID) const
SmallString< 16 > ConstraintExpression
llvm::SmallVector< EnumValueInfo, 4 > Members
std::optional< TypeInfo > BaseType
std::vector< CommentInfo > Description
Comment description of this field.
SmallString< 16 > ValueExpr
std::optional< TypeInfo > ReturnType
std::optional< SmallVector< FieldTypeInfo, 4 > > Params
std::optional< TemplateInfo > Template
llvm::SmallVector< FieldTypeInfo, 4 > Params
std::optional< TemplateInfo > Template
std::vector< CommentInfo > Description
llvm::SmallString< 128 > Path
llvm::SmallVector< Reference, 4 > Namespace
RecordIdDsc(llvm::StringRef Name, AbbrevDsc Abbrev)
unsigned operator()(unsigned ID) const
llvm::SmallVector< MemberTypeInfo, 4 > Members
std::optional< TemplateInfo > Template
std::vector< FriendInfo > Friends
llvm::SmallVector< Reference, 4 > VirtualParents
llvm::SmallVector< Reference, 4 > Parents
std::vector< BaseRecordInfo > Bases
SmallString< 16 > QualName
llvm::SmallString< 128 > Path
SmallString< 16 > DocumentationFileName
std::vector< Reference > Records
std::vector< TypedefInfo > Typedefs
std::vector< FunctionInfo > Functions
std::vector< Reference > Namespaces
std::vector< VarInfo > Variables
std::vector< EnumInfo > Enums
std::vector< ConceptInfo > Concepts
llvm::SmallVector< Location, 2 > Loc
std::optional< Location > DefLoc
SmallString< 16 > MangledName