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>>>
308void ClangDocBitcodeWriter::AbbreviationMap::add(
RecordId RID,
311 assert(!Abbrevs.contains(RID) &&
"Abbreviation already added.");
312 Abbrevs[RID] = AbbrevID;
315unsigned ClangDocBitcodeWriter::AbbreviationMap::get(
RecordId RID)
const {
317 assert(Abbrevs.contains(RID) &&
"Unknown abbreviation.");
318 return Abbrevs.lookup(RID);
325void ClangDocBitcodeWriter::emitHeader() {
330void ClangDocBitcodeWriter::emitVersionBlock() {
336void ClangDocBitcodeWriter::emitBlockID(
BlockId BID) {
338 assert(BlockIdName.data() && BlockIdName.size() &&
"Unknown BlockId.");
341 Record.push_back(BID);
342 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID, Record);
343 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME,
344 ArrayRef<unsigned char>(BlockIdName.bytes_begin(),
345 BlockIdName.bytes_end()));
349void ClangDocBitcodeWriter::emitRecordID(
RecordId ID) {
354 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, Record);
361 auto Abbrev = std::make_shared<llvm::BitCodeAbbrev>();
362 Abbrev->Add(llvm::BitCodeAbbrevOp(ID));
364 Abbrevs.add(ID, Stream.EmitBlockInfoAbbrev(Block, std::move(Abbrev)));
372 "Abbrev type mismatch.");
373 if (!prepRecordData(ID, Sym !=
EmptySID))
375 assert(Sym.size() == 20);
376 Record.push_back(Sym.size());
377 Record.append(Sym.begin(), Sym.end());
378 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
381void ClangDocBitcodeWriter::emitRecord(llvm::StringRef Str,
RecordId ID) {
384 "Abbrev type mismatch.");
385 if (!prepRecordData(ID, !Str.empty()))
388 Record.push_back(Str.size());
389 Stream.EmitRecordWithBlob(Abbrevs.get(ID), Record, Str);
392void ClangDocBitcodeWriter::emitRecord(
const Location &Loc,
RecordId ID) {
395 "Abbrev type mismatch.");
396 if (!prepRecordData(ID,
true))
399 Record.push_back(Loc.StartLineNumber);
400 Record.push_back(Loc.EndLineNumber);
402 Record.push_back(Loc.IsFileInRootDir);
403 Record.push_back(Loc.Filename.size());
404 Stream.EmitRecordWithBlob(Abbrevs.get(ID), Record, Loc.Filename);
407void ClangDocBitcodeWriter::emitRecord(
bool Val,
RecordId ID) {
410 "Abbrev type mismatch.");
411 if (!prepRecordData(ID, Val))
413 Record.push_back(Val);
414 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
417void ClangDocBitcodeWriter::emitRecord(
int Val,
RecordId ID) {
420 "Abbrev type mismatch.");
421 if (!prepRecordData(ID, Val))
424 Record.push_back(Val);
425 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
428void ClangDocBitcodeWriter::emitRecord(
unsigned Val,
RecordId ID) {
431 "Abbrev type mismatch.");
432 if (!prepRecordData(ID, Val))
435 Record.push_back(Val);
436 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
439void ClangDocBitcodeWriter::emitRecord(
const TemplateInfo &Templ) {}
441bool ClangDocBitcodeWriter::prepRecordData(
RecordId ID,
bool ShouldEmit) {
446 Record.push_back(ID);
452void ClangDocBitcodeWriter::emitBlockInfoBlock() {
453 Stream.EnterBlockInfoBlock();
456 emitBlockInfo(Block.first, Block.second);
461void ClangDocBitcodeWriter::emitBlockInfo(
BlockId BID,
462 const std::vector<RecordId> &RIDs) {
467 emitAbbrev(RID, BID);
493 for (
const auto &P : *R.
Params)
510 for (
const auto &N : T.Namespace)
512 for (
const auto &CI : T.Description)
538 for (
const auto &CI : T.Description)
546 for (
const auto &L : std::vector<std::pair<llvm::StringRef, RecordId>>{
552 emitRecord(L.first, L.second);
559 for (
const auto &A : I.
Args)
600 for (
const auto &L : I.
Loc)
605 for (
const auto &N : I.
Members)
630 for (
const auto &L : I.
Loc)
634 for (
const auto &N : I.
Members)
636 for (
const auto &P : I.
Parents)
640 for (
const auto &PB : I.
Bases)
652 for (
const auto &C : I.
Friends)
665 for (
const auto &M : I.
Members)
684 for (
const auto &L : I.
Loc)
688 for (
const auto &N : I.
Params)
707 for (
const auto &P : T.Params)
709 if (T.Specialization)
711 for (
const auto &C : T.Constraints)
718 for (
const auto &P : T.Params)
774 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 char Signature[4]
static constexpr unsigned RecordSize
static constexpr unsigned StringLengthSize
static constexpr unsigned USRBitLengthSize
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