Skip to content

Commit 3ac5f5e

Browse files
authored
[lldb][TypeSystem] Pass ClangASTMetadata by-value when creating record/objc types (llvm#102296)
This is a follow-up to llvm#102161 where we changed the `GetMetadata`/`SetMetadata` APIs to pass `ClangASTMetadata` by-value, instead of `ClangASTMetadata *`, which wasn't a very friendly API. This patch continues from there and changes `CreateRecordType`/`CreateObjCClass` to take the metadata by-value as well. As a drive-by change, I also changed `DelayedAddObjCClassProperty` to store the metadata by-value, instead of in a `std::unique_ptr`, which AFAICT, was done solely due to the TypeSystemClang APIs taking the metadata by pointer. This meant we could also get rid of the user-provided copy constructors.
1 parent f05e818 commit 3ac5f5e

File tree

7 files changed

+38
-65
lines changed

7 files changed

+38
-65
lines changed

lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1803,7 +1803,7 @@ DWARFASTParserClang::ParseStructureLikeDIE(const SymbolContext &sc,
18031803
if (!clang_type) {
18041804
clang_type = m_ast.CreateRecordType(
18051805
containing_decl_ctx, GetOwningClangModule(die), attrs.accessibility,
1806-
attrs.name.GetCString(), tag_decl_kind, attrs.class_language, &metadata,
1806+
attrs.name.GetCString(), tag_decl_kind, attrs.class_language, metadata,
18071807
attrs.exports_symbols);
18081808
}
18091809

@@ -1883,43 +1883,18 @@ class DWARFASTParserClang::DelayedAddObjCClassProperty {
18831883
// required if you don't have an
18841884
// ivar decl
18851885
const char *property_setter_name, const char *property_getter_name,
1886-
uint32_t property_attributes, const ClangASTMetadata *metadata)
1886+
uint32_t property_attributes, ClangASTMetadata metadata)
18871887
: m_class_opaque_type(class_opaque_type), m_property_name(property_name),
18881888
m_property_opaque_type(property_opaque_type),
18891889
m_property_setter_name(property_setter_name),
18901890
m_property_getter_name(property_getter_name),
1891-
m_property_attributes(property_attributes) {
1892-
if (metadata != nullptr) {
1893-
m_metadata_up = std::make_unique<ClangASTMetadata>();
1894-
*m_metadata_up = *metadata;
1895-
}
1896-
}
1897-
1898-
DelayedAddObjCClassProperty(const DelayedAddObjCClassProperty &rhs) {
1899-
*this = rhs;
1900-
}
1901-
1902-
DelayedAddObjCClassProperty &
1903-
operator=(const DelayedAddObjCClassProperty &rhs) {
1904-
m_class_opaque_type = rhs.m_class_opaque_type;
1905-
m_property_name = rhs.m_property_name;
1906-
m_property_opaque_type = rhs.m_property_opaque_type;
1907-
m_property_setter_name = rhs.m_property_setter_name;
1908-
m_property_getter_name = rhs.m_property_getter_name;
1909-
m_property_attributes = rhs.m_property_attributes;
1910-
1911-
if (rhs.m_metadata_up) {
1912-
m_metadata_up = std::make_unique<ClangASTMetadata>();
1913-
*m_metadata_up = *rhs.m_metadata_up;
1914-
}
1915-
return *this;
1916-
}
1891+
m_property_attributes(property_attributes), m_metadata(metadata) {}
19171892

19181893
bool Finalize() {
19191894
return TypeSystemClang::AddObjCClassProperty(
19201895
m_class_opaque_type, m_property_name, m_property_opaque_type,
19211896
/*ivar_decl=*/nullptr, m_property_setter_name, m_property_getter_name,
1922-
m_property_attributes, m_metadata_up.get());
1897+
m_property_attributes, m_metadata);
19231898
}
19241899

19251900
private:
@@ -1929,7 +1904,7 @@ class DWARFASTParserClang::DelayedAddObjCClassProperty {
19291904
const char *m_property_setter_name;
19301905
const char *m_property_getter_name;
19311906
uint32_t m_property_attributes;
1932-
std::unique_ptr<ClangASTMetadata> m_metadata_up;
1907+
ClangASTMetadata m_metadata;
19331908
};
19341909

19351910
bool DWARFASTParserClang::ParseTemplateDIE(
@@ -2721,10 +2696,10 @@ void DWARFASTParserClang::ParseObjCProperty(
27212696

27222697
ClangASTMetadata metadata;
27232698
metadata.SetUserID(die.GetID());
2724-
delayed_properties.push_back(DelayedAddObjCClassProperty(
2699+
delayed_properties.emplace_back(
27252700
class_clang_type, propAttrs.prop_name,
27262701
member_type->GetLayoutCompilerType(), propAttrs.prop_setter_name,
2727-
propAttrs.prop_getter_name, propAttrs.prop_attributes, &metadata));
2702+
propAttrs.prop_getter_name, propAttrs.prop_attributes, metadata);
27282703
}
27292704

27302705
llvm::Expected<llvm::APInt> DWARFASTParserClang::ExtractIntFromFormValue(

lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ clang::QualType PdbAstBuilder::CreateRecordType(PdbTypeSymId id,
618618

619619
CompilerType ct = m_clang.CreateRecordType(
620620
context, OptionalClangModuleID(), access, uname, llvm::to_underlying(ttk),
621-
lldb::eLanguageTypeC_plus_plus, &metadata);
621+
lldb::eLanguageTypeC_plus_plus, metadata);
622622

623623
lldbassert(ct.IsValid());
624624

lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ UdtRecordCompleter::AddMember(TypeSystemClang &clang, Member *field,
366366
metadata.SetIsDynamicCXXType(false);
367367
CompilerType record_ct = clang.CreateRecordType(
368368
parent_decl_ctx, OptionalClangModuleID(), lldb::eAccessPublic, "",
369-
llvm::to_underlying(kind), lldb::eLanguageTypeC_plus_plus, &metadata);
369+
llvm::to_underlying(kind), lldb::eLanguageTypeC_plus_plus, metadata);
370370
TypeSystemClang::StartTagDeclarationDefinition(record_ct);
371371
ClangASTImporter::LayoutInfo layout;
372372
clang::DeclContext *decl_ctx = clang.GetDeclContextForType(record_ct);

lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) {
420420

421421
clang_type = m_ast.CreateRecordType(
422422
decl_context, OptionalClangModuleID(), access, name, tag_type_kind,
423-
lldb::eLanguageTypeC_plus_plus, &metadata);
423+
lldb::eLanguageTypeC_plus_plus, metadata);
424424
assert(clang_type.IsValid());
425425

426426
auto record_decl =

lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,7 +1220,8 @@ TypeSystemClang::GetOrCreateClangModule(llvm::StringRef name,
12201220
CompilerType TypeSystemClang::CreateRecordType(
12211221
clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module,
12221222
AccessType access_type, llvm::StringRef name, int kind,
1223-
LanguageType language, ClangASTMetadata *metadata, bool exports_symbols) {
1223+
LanguageType language, std::optional<ClangASTMetadata> metadata,
1224+
bool exports_symbols) {
12241225
ASTContext &ast = getASTContext();
12251226

12261227
if (decl_ctx == nullptr)
@@ -1799,7 +1800,7 @@ bool TypeSystemClang::RecordHasFields(const RecordDecl *record_decl) {
17991800
CompilerType TypeSystemClang::CreateObjCClass(
18001801
llvm::StringRef name, clang::DeclContext *decl_ctx,
18011802
OptionalClangModuleID owning_module, bool isForwardDecl, bool isInternal,
1802-
ClangASTMetadata *metadata) {
1803+
std::optional<ClangASTMetadata> metadata) {
18031804
ASTContext &ast = getASTContext();
18041805
assert(!name.empty());
18051806
if (!decl_ctx)
@@ -7986,7 +7987,7 @@ bool TypeSystemClang::AddObjCClassProperty(
79867987
const CompilerType &type, const char *property_name,
79877988
const CompilerType &property_clang_type, clang::ObjCIvarDecl *ivar_decl,
79887989
const char *property_setter_name, const char *property_getter_name,
7989-
uint32_t property_attributes, ClangASTMetadata *metadata) {
7990+
uint32_t property_attributes, ClangASTMetadata metadata) {
79907991
if (!type || !property_clang_type.IsValid() || property_name == nullptr ||
79917992
property_name[0] == '\0')
79927993
return false;
@@ -8030,8 +8031,7 @@ bool TypeSystemClang::AddObjCClassProperty(
80308031
if (!property_decl)
80318032
return false;
80328033

8033-
if (metadata)
8034-
ast->SetMetadata(property_decl, *metadata);
8034+
ast->SetMetadata(property_decl, metadata);
80358035

80368036
class_interface_decl->addDecl(property_decl);
80378037

@@ -8123,8 +8123,7 @@ bool TypeSystemClang::AddObjCClassProperty(
81238123
SetMemberOwningModule(getter, class_interface_decl);
81248124

81258125
if (getter) {
8126-
if (metadata)
8127-
ast->SetMetadata(getter, *metadata);
8126+
ast->SetMetadata(getter, metadata);
81288127

81298128
getter->setMethodParams(clang_ast, llvm::ArrayRef<clang::ParmVarDecl *>(),
81308129
llvm::ArrayRef<clang::SourceLocation>());
@@ -8166,8 +8165,7 @@ bool TypeSystemClang::AddObjCClassProperty(
81668165
SetMemberOwningModule(setter, class_interface_decl);
81678166

81688167
if (setter) {
8169-
if (metadata)
8170-
ast->SetMetadata(setter, *metadata);
8168+
ast->SetMetadata(setter, metadata);
81718169

81728170
llvm::SmallVector<clang::ParmVarDecl *, 1> params;
81738171
params.push_back(clang::ParmVarDecl::Create(

lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "llvm/ADT/APSInt.h"
3030
#include "llvm/ADT/SmallVector.h"
3131

32+
#include "Plugins/ExpressionParser/Clang/ClangASTMetadata.h"
3233
#include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h"
3334
#include "lldb/Expression/ExpressionVariable.h"
3435
#include "lldb/Symbol/CompilerType.h"
@@ -50,7 +51,6 @@ class ModuleMap;
5051

5152
namespace lldb_private {
5253

53-
class ClangASTMetadata;
5454
class ClangASTSource;
5555
class Declaration;
5656

@@ -325,13 +325,13 @@ class TypeSystemClang : public TypeSystem {
325325
bool is_framework = false,
326326
bool is_explicit = false);
327327

328-
CompilerType CreateRecordType(clang::DeclContext *decl_ctx,
329-
OptionalClangModuleID owning_module,
330-
lldb::AccessType access_type,
331-
llvm::StringRef name, int kind,
332-
lldb::LanguageType language,
333-
ClangASTMetadata *metadata = nullptr,
334-
bool exports_symbols = false);
328+
CompilerType
329+
CreateRecordType(clang::DeclContext *decl_ctx,
330+
OptionalClangModuleID owning_module,
331+
lldb::AccessType access_type, llvm::StringRef name, int kind,
332+
lldb::LanguageType language,
333+
std::optional<ClangASTMetadata> metadata = std::nullopt,
334+
bool exports_symbols = false);
335335

336336
class TemplateParameterInfos {
337337
public:
@@ -455,11 +455,11 @@ class TypeSystemClang : public TypeSystem {
455455

456456
bool BaseSpecifierIsEmpty(const clang::CXXBaseSpecifier *b);
457457

458-
CompilerType CreateObjCClass(llvm::StringRef name,
459-
clang::DeclContext *decl_ctx,
460-
OptionalClangModuleID owning_module,
461-
bool isForwardDecl, bool isInternal,
462-
ClangASTMetadata *metadata = nullptr);
458+
CompilerType
459+
CreateObjCClass(llvm::StringRef name, clang::DeclContext *decl_ctx,
460+
OptionalClangModuleID owning_module, bool isForwardDecl,
461+
bool isInternal,
462+
std::optional<ClangASTMetadata> metadata = std::nullopt);
463463

464464
// Returns a mask containing bits from the TypeSystemClang::eTypeXXX
465465
// enumerations
@@ -1005,7 +1005,7 @@ class TypeSystemClang : public TypeSystem {
10051005
const char *property_setter_name,
10061006
const char *property_getter_name,
10071007
uint32_t property_attributes,
1008-
ClangASTMetadata *metadata);
1008+
ClangASTMetadata metadata);
10091009

10101010
static clang::ObjCMethodDecl *AddMethodToObjCObjectType(
10111011
const CompilerType &type,

lldb/unittests/Symbol/TestTypeSystemClang.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ TEST_F(TestTypeSystemClang, TestOwningModule) {
296296
CompilerType record_type = ast.CreateRecordType(
297297
nullptr, OptionalClangModuleID(200), lldb::eAccessPublic, "FooRecord",
298298
llvm::to_underlying(clang::TagTypeKind::Struct),
299-
lldb::eLanguageTypeC_plus_plus, nullptr);
299+
lldb::eLanguageTypeC_plus_plus, std::nullopt);
300300
auto *rd = TypeSystemClang::GetAsRecordDecl(record_type);
301301
EXPECT_FALSE(!rd);
302302
EXPECT_EQ(rd->getOwningModuleID(), 200u);
@@ -317,7 +317,7 @@ TEST_F(TestTypeSystemClang, TestIsClangType) {
317317
CompilerType record_type = m_ast->CreateRecordType(
318318
nullptr, OptionalClangModuleID(100), lldb::eAccessPublic, "FooRecord",
319319
llvm::to_underlying(clang::TagTypeKind::Struct),
320-
lldb::eLanguageTypeC_plus_plus, nullptr);
320+
lldb::eLanguageTypeC_plus_plus, std::nullopt);
321321
// Clang builtin type and record type should pass
322322
EXPECT_TRUE(ClangUtil::IsClangType(bool_type));
323323
EXPECT_TRUE(ClangUtil::IsClangType(record_type));
@@ -330,7 +330,7 @@ TEST_F(TestTypeSystemClang, TestRemoveFastQualifiers) {
330330
CompilerType record_type = m_ast->CreateRecordType(
331331
nullptr, OptionalClangModuleID(), lldb::eAccessPublic, "FooRecord",
332332
llvm::to_underlying(clang::TagTypeKind::Struct),
333-
lldb::eLanguageTypeC_plus_plus, nullptr);
333+
lldb::eLanguageTypeC_plus_plus, std::nullopt);
334334
QualType qt;
335335

336336
qt = ClangUtil::GetQualType(record_type);
@@ -403,7 +403,7 @@ TEST_F(TestTypeSystemClang, TestRecordHasFields) {
403403
CompilerType empty_base = m_ast->CreateRecordType(
404404
nullptr, OptionalClangModuleID(), lldb::eAccessPublic, "EmptyBase",
405405
llvm::to_underlying(clang::TagTypeKind::Struct),
406-
lldb::eLanguageTypeC_plus_plus, nullptr);
406+
lldb::eLanguageTypeC_plus_plus, std::nullopt);
407407
TypeSystemClang::StartTagDeclarationDefinition(empty_base);
408408
TypeSystemClang::CompleteTagDeclarationDefinition(empty_base);
409409

@@ -415,7 +415,7 @@ TEST_F(TestTypeSystemClang, TestRecordHasFields) {
415415
CompilerType non_empty_base = m_ast->CreateRecordType(
416416
nullptr, OptionalClangModuleID(), lldb::eAccessPublic, "NonEmptyBase",
417417
llvm::to_underlying(clang::TagTypeKind::Struct),
418-
lldb::eLanguageTypeC_plus_plus, nullptr);
418+
lldb::eLanguageTypeC_plus_plus, std::nullopt);
419419
TypeSystemClang::StartTagDeclarationDefinition(non_empty_base);
420420
FieldDecl *non_empty_base_field_decl = m_ast->AddFieldToRecordType(
421421
non_empty_base, "MyField", int_type, eAccessPublic, 0);
@@ -432,7 +432,7 @@ TEST_F(TestTypeSystemClang, TestRecordHasFields) {
432432
CompilerType empty_derived = m_ast->CreateRecordType(
433433
nullptr, OptionalClangModuleID(), lldb::eAccessPublic, "EmptyDerived",
434434
llvm::to_underlying(clang::TagTypeKind::Struct),
435-
lldb::eLanguageTypeC_plus_plus, nullptr);
435+
lldb::eLanguageTypeC_plus_plus, std::nullopt);
436436
TypeSystemClang::StartTagDeclarationDefinition(empty_derived);
437437
std::unique_ptr<clang::CXXBaseSpecifier> non_empty_base_spec =
438438
m_ast->CreateBaseClassSpecifier(non_empty_base.GetOpaqueQualType(),
@@ -455,7 +455,7 @@ TEST_F(TestTypeSystemClang, TestRecordHasFields) {
455455
CompilerType empty_derived2 = m_ast->CreateRecordType(
456456
nullptr, OptionalClangModuleID(), lldb::eAccessPublic, "EmptyDerived2",
457457
llvm::to_underlying(clang::TagTypeKind::Struct),
458-
lldb::eLanguageTypeC_plus_plus, nullptr);
458+
lldb::eLanguageTypeC_plus_plus, std::nullopt);
459459
TypeSystemClang::StartTagDeclarationDefinition(empty_derived2);
460460
std::unique_ptr<CXXBaseSpecifier> non_empty_vbase_spec =
461461
m_ast->CreateBaseClassSpecifier(non_empty_base.GetOpaqueQualType(),

0 commit comments

Comments
 (0)