11 #include "llvm/ADT/IndexedMap.h" 12 #include "llvm/ADT/Optional.h" 13 #include "llvm/Support/raw_ostream.h" 18 using Record = llvm::SmallVector<uint64_t, 1024>;
21 llvm::StringRef Blob) {
22 Field.assign(Blob.begin(), Blob.end());
32 for (
int I = 0, E = R[0]; I < E; ++I)
55 Field = (AccessSpecifier)R[0];
69 Field = (TagTypeKind)R[0];
77 llvm::StringRef Blob) {
80 Field.emplace((
int)R[0], Blob);
85 switch (
auto IT = static_cast<InfoType>(R[0])) {
98 switch (
auto F = static_cast<FieldId>(R[0])) {
111 llvm::StringRef Blob) {
112 Field.push_back(Blob);
117 llvm::StringRef Blob) {
120 Field.emplace_back((
int)R[0], Blob);
125 const unsigned VersionNo) {
126 if (ID ==
VERSION && R[0] == VersionNo)
270 llvm::errs() <<
"Cannot have comment subblock.\n";
295 I->
Children.emplace_back(llvm::make_unique<CommentInfo>());
303 template <
typename T,
typename TTypeInfo>
305 llvm::errs() <<
"Invalid type for info.\n";
310 I->
Members.emplace_back(std::move(T));
318 I->
Params.emplace_back(std::move(T));
322 llvm::errs() <<
"Invalid field type for info.\n";
329 I->
Type = std::move(R);
332 llvm::errs() <<
"Invalid field type for info.\n";
340 I->
Type = std::move(R);
343 llvm::errs() <<
"Invalid field type for info.\n";
351 I->
Type = std::move(R);
354 llvm::errs() <<
"Invalid field type for info.\n";
365 llvm::errs() <<
"Invalid field type for info.\n";
376 llvm::errs() <<
"Invalid field type for info.\n";
390 llvm::errs() <<
"Invalid field type for info.\n";
401 I->
Parents.emplace_back(std::move(R));
407 llvm::errs() <<
"Invalid field type for info.\n";
413 template <
typename T>
bool ClangDocBitcodeReader::readRecord(
unsigned ID, T I) {
415 llvm::StringRef Blob;
416 unsigned RecID = Stream.readRecord(ID, R, &Blob);
420 template <>
bool ClangDocBitcodeReader::readRecord(
unsigned ID,
Reference *I) {
422 llvm::StringRef Blob;
423 unsigned RecID = Stream.readRecord(ID, R, &Blob);
424 return parseRecord(R, RecID, Blob, I, CurrentReferenceField);
428 template <
typename T>
bool ClangDocBitcodeReader::readBlock(
unsigned ID, T I) {
429 if (Stream.EnterSubBlock(ID))
433 unsigned BlockOrCode = 0;
434 Cursor Res = skipUntilRecordOrBlock(BlockOrCode);
437 case Cursor::BadBlock:
439 case Cursor::BlockEnd:
441 case Cursor::BlockBegin:
442 if (readSubBlock(BlockOrCode, I))
444 if (!Stream.SkipBlock())
450 if (!readRecord(BlockOrCode, I))
455 template <
typename T>
456 bool ClangDocBitcodeReader::readSubBlock(
unsigned ID, T I) {
465 if (readBlock(ID, &TI)) {
473 if (readBlock(ID, &TI)) {
481 if (readBlock(ID, &TI)) {
489 if (readBlock(ID, &R)) {
496 llvm::errs() <<
"Invalid subblock type.\n";
501 ClangDocBitcodeReader::Cursor
502 ClangDocBitcodeReader::skipUntilRecordOrBlock(
unsigned &BlockOrRecordID) {
505 while (!Stream.AtEndOfStream()) {
506 unsigned Code = Stream.ReadCode();
508 switch ((llvm::bitc::FixedAbbrevIDs)Code) {
509 case llvm::bitc::ENTER_SUBBLOCK:
510 BlockOrRecordID = Stream.ReadSubBlockID();
511 return Cursor::BlockBegin;
512 case llvm::bitc::END_BLOCK:
513 if (Stream.ReadBlockEnd())
514 return Cursor::BadBlock;
515 return Cursor::BlockEnd;
516 case llvm::bitc::DEFINE_ABBREV:
517 Stream.ReadAbbrevRecord();
519 case llvm::bitc::UNABBREV_RECORD:
520 return Cursor::BadBlock;
522 BlockOrRecordID = Code;
523 return Cursor::Record;
526 llvm_unreachable(
"Premature stream end.");
529 bool ClangDocBitcodeReader::validateStream() {
530 if (Stream.AtEndOfStream())
542 bool ClangDocBitcodeReader::readBlockInfoBlock() {
543 BlockInfo = Stream.ReadBlockInfoBlock();
546 Stream.setBlockInfo(&*BlockInfo);
550 template <
typename T>
551 std::unique_ptr<Info> ClangDocBitcodeReader::createInfo(
unsigned ID) {
552 std::unique_ptr<Info> I = llvm::make_unique<T>();
553 if (readBlock(ID, static_cast<T *>(I.get())))
555 llvm::errs() <<
"Error reading from block.\n";
559 std::unique_ptr<Info> ClangDocBitcodeReader::readBlockToInfo(
unsigned ID) {
562 return createInfo<NamespaceInfo>(ID);
564 return createInfo<RecordInfo>(ID);
566 return createInfo<EnumInfo>(ID);
568 return createInfo<FunctionInfo>(ID);
570 llvm::errs() <<
"Error reading from block.\n";
577 std::vector<std::unique_ptr<Info>> Infos;
578 if (!validateStream())
582 while (!Stream.AtEndOfStream()) {
583 unsigned Code = Stream.ReadCode();
584 if (Code != llvm::bitc::ENTER_SUBBLOCK)
587 unsigned ID = Stream.ReadSubBlockID();
595 llvm::errs() <<
"Invalid top level block.\n";
601 if (std::unique_ptr<Info> I = readBlockToInfo(ID)) {
602 Infos.emplace_back(std::move(I));
609 case llvm::bitc::BLOCKINFO_BLOCK_ID:
610 if (readBlockInfoBlock())
614 if (!Stream.SkipBlock())
llvm::SmallVector< Reference, 4 > Namespace
bool parseRecord(Record R, unsigned ID, llvm::StringRef Blob, const unsigned VersionNo)
static const unsigned VersionNumber
llvm::SmallVector< uint64_t, 1024 > Record
llvm::Optional< Location > DefLoc
llvm::SmallVector< Location, 2 > Loc
void addTypeInfo(T I, TTypeInfo &&TI)
llvm::SmallVector< Reference, 4 > VirtualParents
llvm::SmallVector< FieldTypeInfo, 4 > Params
void addReference(T I, Reference &&R, FieldId F)
static constexpr char Signature[4]
llvm::SmallVector< SmallString< 16 >, 4 > Members
std::vector< CommentInfo > Description
static constexpr int USRHashSize
llvm::SmallVector< Reference, 4 > Parents
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
CommentInfo * getCommentInfo(T I)
llvm::SmallVector< MemberTypeInfo, 4 > Members
std::array< uint8_t, 20 > SymbolID
std::vector< std::unique_ptr< Info > > readBitcode()
bool decodeRecord(Record R, llvm::SmallVectorImpl< char > &Field, llvm::StringRef Blob)