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 = {
237 for (
const auto &Init : Inits) {
245static const std::vector<std::pair<BlockId, std::vector<RecordId>>>
309void ClangDocBitcodeWriter::AbbreviationMap::add(
RecordId RID,
312 assert(!Abbrevs.contains(RID) &&
"Abbreviation already added.");
313 Abbrevs[RID] = AbbrevID;
316unsigned ClangDocBitcodeWriter::AbbreviationMap::get(
RecordId RID)
const {
318 assert(Abbrevs.contains(RID) &&
"Unknown abbreviation.");
319 return Abbrevs.lookup(RID);
326void ClangDocBitcodeWriter::emitHeader() {
331void ClangDocBitcodeWriter::emitVersionBlock() {
337void ClangDocBitcodeWriter::emitBlockID(
BlockId BID) {
339 assert(BlockIdName.data() && BlockIdName.size() &&
"Unknown BlockId.");
342 Record.push_back(BID);
343 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID, Record);
344 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME,
345 ArrayRef<unsigned char>(BlockIdName.bytes_begin(),
346 BlockIdName.bytes_end()));
350void ClangDocBitcodeWriter::emitRecordID(
RecordId ID) {
355 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, Record);
362 auto Abbrev = std::make_shared<llvm::BitCodeAbbrev>();
363 Abbrev->Add(llvm::BitCodeAbbrevOp(ID));
365 Abbrevs.add(ID, Stream.EmitBlockInfoAbbrev(Block, std::move(Abbrev)));
373 "Abbrev type mismatch.");
374 if (!prepRecordData(ID, Sym !=
EmptySID))
376 assert(Sym.size() == 20);
377 Record.push_back(Sym.size());
378 Record.append(Sym.begin(), Sym.end());
379 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
382void ClangDocBitcodeWriter::emitRecord(llvm::StringRef Str,
RecordId ID) {
385 "Abbrev type mismatch.");
386 if (!prepRecordData(ID, !Str.empty()))
389 Record.push_back(Str.size());
390 Stream.EmitRecordWithBlob(Abbrevs.get(ID), Record, Str);
393void ClangDocBitcodeWriter::emitRecord(
const Location &Loc,
RecordId ID) {
396 "Abbrev type mismatch.");
397 if (!prepRecordData(ID,
true))
400 Record.push_back(Loc.StartLineNumber);
401 Record.push_back(Loc.EndLineNumber);
403 Record.push_back(Loc.IsFileInRootDir);
404 Record.push_back(Loc.Filename.size());
405 Stream.EmitRecordWithBlob(Abbrevs.get(ID), Record, Loc.Filename);
408void ClangDocBitcodeWriter::emitRecord(
bool Val,
RecordId ID) {
411 "Abbrev type mismatch.");
412 if (!prepRecordData(ID, Val))
414 Record.push_back(Val);
415 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
418void ClangDocBitcodeWriter::emitRecord(
int Val,
RecordId ID) {
421 "Abbrev type mismatch.");
422 if (!prepRecordData(ID, Val))
425 Record.push_back(Val);
426 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
429void ClangDocBitcodeWriter::emitRecord(
unsigned Val,
RecordId ID) {
432 "Abbrev type mismatch.");
433 if (!prepRecordData(ID, Val))
436 Record.push_back(Val);
437 Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
440void ClangDocBitcodeWriter::emitRecord(
const TemplateInfo &Templ) {}
442bool ClangDocBitcodeWriter::prepRecordData(
RecordId ID,
bool ShouldEmit) {
447 Record.push_back(ID);
453void ClangDocBitcodeWriter::emitBlockInfoBlock() {
454 Stream.EnterBlockInfoBlock();
457 emitBlockInfo(Block.first, Block.second);
462void ClangDocBitcodeWriter::emitBlockInfo(
BlockId BID,
463 const std::vector<RecordId> &RIDs) {
468 emitAbbrev(RID, BID);
494 for (
const auto &P : *R.
Params)
513 for (
const auto &N : T.Namespace)
515 for (
const auto &CI : T.Description)
543 for (
const auto &CI : T.Description)
551 for (
const auto &L : std::vector<std::pair<llvm::StringRef, RecordId>>{
557 emitRecord(L.first, L.second);
564 for (
const auto &A : I.
Args)
606 for (
const auto &L : I.
Loc)
611 for (
const auto &N : I.
Members)
637 for (
const auto &L : I.
Loc)
641 for (
const auto &N : I.
Members)
643 for (
const auto &P : I.
Parents)
647 for (
const auto &PB : I.
Bases)
659 for (
const auto &C : I.
Friends)
672 for (
const auto &M : I.
Members)
691 for (
const auto &L : I.
Loc)
695 for (
const auto &N : I.
Params)
716 for (
const auto &P : T.Params)
718 if (T.Specialization)
720 for (
const auto &C : T.Constraints)
727 for (
const auto &P : T.Params)
783 unsigned ID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
784 "Unexpected info, unable to write.");
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