[llvm-branch-commits] [clang-tools-extra] [clang-doc] refactor BitcodeReader::readSubBlock (PR #145835)
Erick Velez via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jun 25 21:52:37 PDT 2025
https://github.com/evelez7 created https://github.com/llvm/llvm-project/pull/145835
None
>From c15962ea2a37f3d9896fa77914aee67ccf3b5d3f Mon Sep 17 00:00:00 2001
From: Erick Velez <erickvelez7 at gmail.com>
Date: Tue, 24 Jun 2025 21:08:36 -0700
Subject: [PATCH] [clang-doc] refactor BitcodeReader::readSubBlock
---
clang-tools-extra/clang-doc/BitcodeReader.cpp | 129 ++++++++----------
clang-tools-extra/clang-doc/BitcodeReader.h | 7 +
2 files changed, 61 insertions(+), 75 deletions(-)
diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index cbdd5d245b8de..437599b879748 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -800,11 +800,37 @@ llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, T I) {
}
}
-// TODO: Create a helper that can receive a function to reduce repetition for
-// most blocks.
+template <typename InfoType, typename T, typename Callback>
+llvm::Error ClangDocBitcodeReader::handleSubBlock(unsigned ID, T Parent,
+ Callback Function) {
+ InfoType Info;
+ if (auto Err = readBlock(ID, &Info))
+ return Err;
+ Function(Parent, std::move(Info));
+ return llvm::Error::success();
+}
+
+template <typename InfoType, typename T, typename Callback>
+llvm::Error ClangDocBitcodeReader::handleTypeSubBlock(unsigned ID, T Parent,
+ Callback Function) {
+ InfoType Info;
+ if (auto Err = readBlock(ID, &Info))
+ return Err;
+ if (auto Err = Function(Parent, std::move(Info)))
+ return Err;
+ return llvm::Error::success();
+}
+
template <typename T>
llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
llvm::TimeTraceScope("Reducing infos", "readSubBlock");
+
+ static auto CreateAddFunc = [](auto AddFunc) {
+ return [AddFunc](auto Parent, auto Child) {
+ return AddFunc(Parent, std::move(Child));
+ };
+ };
+
switch (ID) {
// Blocks can only have certain types of sub blocks.
case BI_COMMENT_BLOCK_ID: {
@@ -816,28 +842,16 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
return llvm::Error::success();
}
case BI_TYPE_BLOCK_ID: {
- TypeInfo TI;
- if (auto Err = readBlock(ID, &TI))
- return Err;
- if (auto Err = addTypeInfo(I, std::move(TI)))
- return Err;
- return llvm::Error::success();
+ return handleTypeSubBlock<TypeInfo>(
+ ID, I, CreateAddFunc(addTypeInfo<T, TypeInfo>));
}
case BI_FIELD_TYPE_BLOCK_ID: {
- FieldTypeInfo TI;
- if (auto Err = readBlock(ID, &TI))
- return Err;
- if (auto Err = addTypeInfo(I, std::move(TI)))
- return Err;
- return llvm::Error::success();
+ return handleTypeSubBlock<FieldTypeInfo>(
+ ID, I, CreateAddFunc(addTypeInfo<T, FieldTypeInfo>));
}
case BI_MEMBER_TYPE_BLOCK_ID: {
- MemberTypeInfo TI;
- if (auto Err = readBlock(ID, &TI))
- return Err;
- if (auto Err = addTypeInfo(I, std::move(TI)))
- return Err;
- return llvm::Error::success();
+ return handleTypeSubBlock<MemberTypeInfo>(
+ ID, I, CreateAddFunc(addTypeInfo<T, MemberTypeInfo>));
}
case BI_REFERENCE_BLOCK_ID: {
Reference R;
@@ -848,81 +862,46 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
return llvm::Error::success();
}
case BI_FUNCTION_BLOCK_ID: {
- FunctionInfo F;
- if (auto Err = readBlock(ID, &F))
- return Err;
- addChild(I, std::move(F));
- return llvm::Error::success();
+ return handleSubBlock<FunctionInfo>(
+ ID, I, CreateAddFunc(addChild<T, FunctionInfo>));
}
case BI_BASE_RECORD_BLOCK_ID: {
- BaseRecordInfo BR;
- if (auto Err = readBlock(ID, &BR))
- return Err;
- addChild(I, std::move(BR));
- return llvm::Error::success();
+ return handleSubBlock<BaseRecordInfo>(
+ ID, I, CreateAddFunc(addChild<T, BaseRecordInfo>));
}
case BI_ENUM_BLOCK_ID: {
- EnumInfo E;
- if (auto Err = readBlock(ID, &E))
- return Err;
- addChild(I, std::move(E));
- return llvm::Error::success();
+ return handleSubBlock<EnumInfo>(ID, I,
+ CreateAddFunc(addChild<T, EnumInfo>));
}
case BI_ENUM_VALUE_BLOCK_ID: {
- EnumValueInfo EV;
- if (auto Err = readBlock(ID, &EV))
- return Err;
- addChild(I, std::move(EV));
- return llvm::Error::success();
+ return handleSubBlock<EnumValueInfo>(
+ ID, I, CreateAddFunc(addChild<T, EnumValueInfo>));
}
case BI_TEMPLATE_BLOCK_ID: {
- TemplateInfo TI;
- if (auto Err = readBlock(ID, &TI))
- return Err;
- addTemplate(I, std::move(TI));
- return llvm::Error::success();
+ return handleSubBlock<TemplateInfo>(ID, I, CreateAddFunc(addTemplate<T>));
}
case BI_TEMPLATE_SPECIALIZATION_BLOCK_ID: {
- TemplateSpecializationInfo TSI;
- if (auto Err = readBlock(ID, &TSI))
- return Err;
- addTemplateSpecialization(I, std::move(TSI));
- return llvm::Error::success();
+ return handleSubBlock<TemplateSpecializationInfo>(
+ ID, I, CreateAddFunc(addTemplateSpecialization<T>));
}
case BI_TEMPLATE_PARAM_BLOCK_ID: {
- TemplateParamInfo TPI;
- if (auto Err = readBlock(ID, &TPI))
- return Err;
- addTemplateParam(I, std::move(TPI));
- return llvm::Error::success();
+ return handleSubBlock<TemplateParamInfo>(
+ ID, I, CreateAddFunc(addTemplateParam<T>));
}
case BI_TYPEDEF_BLOCK_ID: {
- TypedefInfo TI;
- if (auto Err = readBlock(ID, &TI))
- return Err;
- addChild(I, std::move(TI));
- return llvm::Error::success();
+ return handleSubBlock<TypedefInfo>(ID, I,
+ CreateAddFunc(addChild<T, TypedefInfo>));
}
case BI_CONSTRAINT_BLOCK_ID: {
- ConstraintInfo CI;
- if (auto Err = readBlock(ID, &CI))
- return Err;
- addConstraint(I, std::move(CI));
- return llvm::Error::success();
+ return handleSubBlock<ConstraintInfo>(ID, I,
+ CreateAddFunc(addConstraint<T>));
}
case BI_CONCEPT_BLOCK_ID: {
- ConceptInfo CI;
- if (auto Err = readBlock(ID, &CI))
- return Err;
- addChild(I, std::move(CI));
- return llvm::Error::success();
+ return handleSubBlock<ConceptInfo>(ID, I,
+ CreateAddFunc(addChild<T, ConceptInfo>));
}
case BI_VAR_BLOCK_ID: {
- VarInfo VI;
- if (auto Err = readBlock(ID, &VI))
- return Err;
- addChild(I, std::move(VI));
- return llvm::Error::success();
+ return handleSubBlock<VarInfo>(ID, I, CreateAddFunc(addChild<T, VarInfo>));
}
default:
return llvm::createStringError(llvm::inconvertibleErrorCode(),
diff --git a/clang-tools-extra/clang-doc/BitcodeReader.h b/clang-tools-extra/clang-doc/BitcodeReader.h
index a046ee2f7a24a..4947721f0a06d 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.h
+++ b/clang-tools-extra/clang-doc/BitcodeReader.h
@@ -64,6 +64,13 @@ class ClangDocBitcodeReader {
// Helper function to set up the appropriate type of Info.
llvm::Expected<std::unique_ptr<Info>> readBlockToInfo(unsigned ID);
+ template <typename InfoType, typename T, typename CallbackFunction>
+ llvm::Error handleSubBlock(unsigned ID, T Parent, CallbackFunction Function);
+
+ template <typename InfoType, typename T, typename CallbackFunction>
+ llvm::Error handleTypeSubBlock(unsigned ID, T Parent,
+ CallbackFunction Function);
+
llvm::BitstreamCursor &Stream;
std::optional<llvm::BitstreamBlockInfo> BlockInfo;
FieldId CurrentReferenceField;
More information about the llvm-branch-commits
mailing list