10 #include "llvm/ADT/IndexedMap.h"
11 #include <initializer_list>
31 using AbbrevDsc = void (*)(std::shared_ptr<llvm::BitCodeAbbrev> &Abbrev);
33 static void AbbrevGen(std::shared_ptr<llvm::BitCodeAbbrev> &Abbrev,
34 const std::initializer_list<llvm::BitCodeAbbrevOp> Ops) {
35 for (
const auto &Op : Ops)
39 static void BoolAbbrev(std::shared_ptr<llvm::BitCodeAbbrev> &Abbrev) {
42 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
46 static void IntAbbrev(std::shared_ptr<llvm::BitCodeAbbrev> &Abbrev) {
49 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
56 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
59 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Array),
60 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
64 static void StringAbbrev(std::shared_ptr<llvm::BitCodeAbbrev> &Abbrev) {
67 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
70 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)});
78 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
81 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
84 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed,
87 llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)});
99 operator bool()
const {
100 return Abbrev !=
nullptr &&
Name.data() !=
nullptr && !
Name.empty();
104 static const llvm::IndexedMap<llvm::StringRef, BlockIdToIndexFunctor>
106 llvm::IndexedMap<llvm::StringRef, BlockIdToIndexFunctor>
BlockIdNameMap;
111 static const std::vector<std::pair<BlockId, const char *const>> Inits = {
129 for (
const auto &Init : Inits)
135 static const llvm::IndexedMap<RecordIdDsc, RecordIdToIndexFunctor>
142 static const std::vector<std::pair<RecordId, RecordIdDsc>> Inits = {
203 for (
const auto &Init : Inits) {
211 static const std::vector<std::pair<BlockId, std::vector<RecordId>>>
264 void ClangDocBitcodeWriter::AbbreviationMap::add(
RecordId RID,
267 assert(Abbrevs.find(RID) == Abbrevs.end() &&
"Abbreviation already added.");
268 Abbrevs[RID] = AbbrevID;
271 unsigned ClangDocBitcodeWriter::AbbreviationMap::get(
RecordId RID)
const {
273 assert(Abbrevs.find(RID) != Abbrevs.end() &&
"Unknown abbreviation.");
274 return Abbrevs.lookup(RID);
281 void ClangDocBitcodeWriter::emitHeader() {
286 void ClangDocBitcodeWriter::emitVersionBlock() {
292 void ClangDocBitcodeWriter::emitBlockID(
BlockId BID) {
294 assert(BlockIdName.data() && BlockIdName.size() &&
"Unknown BlockId.");
297 Record.push_back(BID);
298 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID, Record);
299 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME,
300 ArrayRef<unsigned char>(BlockIdName.bytes_begin(),
301 BlockIdName.bytes_end()));
305 void ClangDocBitcodeWriter::emitRecordID(
RecordId ID) {
310 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, Record);
317 auto Abbrev = std::make_shared<llvm::BitCodeAbbrev>();
318 Abbrev->Add(llvm::BitCodeAbbrevOp(
ID));
320 Abbrevs.add(
ID, Stream.EmitBlockInfoAbbrev(Block, std::move(Abbrev)));
328 "Abbrev type mismatch.");
331 assert(Sym.size() == 20);
332 Record.push_back(Sym.size());
333 Record.append(Sym.begin(), Sym.end());
334 Stream.EmitRecordWithAbbrev(Abbrevs.get(
ID), Record);
337 void ClangDocBitcodeWriter::emitRecord(llvm::StringRef Str,
RecordId ID) {
340 "Abbrev type mismatch.");
341 if (!prepRecordData(
ID, !Str.empty()))
344 Record.push_back(Str.size());
345 Stream.EmitRecordWithBlob(Abbrevs.get(
ID), Record, Str);
351 "Abbrev type mismatch.");
352 if (!prepRecordData(
ID,
true))
355 Record.push_back(
Loc.LineNumber);
357 Record.push_back(
Loc.IsFileInRootDir);
358 Record.push_back(
Loc.Filename.size());
359 Stream.EmitRecordWithBlob(Abbrevs.get(
ID), Record,
Loc.Filename);
362 void ClangDocBitcodeWriter::emitRecord(
bool Val,
RecordId ID) {
365 if (!prepRecordData(
ID, Val))
367 Record.push_back(Val);
368 Stream.EmitRecordWithAbbrev(Abbrevs.get(
ID), Record);
371 void ClangDocBitcodeWriter::emitRecord(
int Val,
RecordId ID) {
374 if (!prepRecordData(
ID, Val))
377 Record.push_back(Val);
378 Stream.EmitRecordWithAbbrev(Abbrevs.get(
ID), Record);
381 void ClangDocBitcodeWriter::emitRecord(
unsigned Val,
RecordId ID) {
384 if (!prepRecordData(
ID, Val))
387 Record.push_back(Val);
388 Stream.EmitRecordWithAbbrev(Abbrevs.get(
ID), Record);
391 void ClangDocBitcodeWriter::emitRecord(
const TemplateInfo &Templ) {}
393 bool ClangDocBitcodeWriter::prepRecordData(
RecordId ID,
bool ShouldEmit) {
398 Record.push_back(
ID);
404 void ClangDocBitcodeWriter::emitBlockInfoBlock() {
405 Stream.EnterBlockInfoBlock();
408 emitBlockInfo(Block.first, Block.second);
413 void ClangDocBitcodeWriter::emitBlockInfo(
BlockId BID,
414 const std::vector<RecordId> &RIDs) {
419 emitAbbrev(RID, BID);
446 for (
const auto &N : T.Namespace)
448 for (
const auto &
CI : T.Description)
468 for (
const auto &
CI : T.Description)
474 for (
const auto &L : std::vector<std::pair<llvm::StringRef, RecordId>>{
481 emitRecord(L.first, L.second);
488 for (
const auto &
A : I.
Args)
525 for (
const auto &L : I.
Loc)
530 for (
const auto &N : I.
Members)
552 for (
const auto &L : I.
Loc)
556 for (
const auto &N : I.
Members)
558 for (
const auto &P : I.
Parents)
562 for (
const auto &PB : I.
Bases)
603 for (
const auto &L : I.
Loc)
607 for (
const auto &N : I.
Params)
615 for (
const auto &P : T.Params)
617 if (T.Specialization)
624 for (
const auto &P : T.Params)
651 llvm::errs() <<
"Unexpected info, unable to write.\n";