Skip to content

Commit f9f0ae1

Browse files
authored
[lldb][TypeSystemClang] Pass ClangASTMetadata around by value (#102161)
This patch changes the return type of `GetMetadata` from a `ClangASTMetadata*` to a `std::optional<ClangASTMetadata>`. Except for one call-site (`SetDeclIsForcefullyCompleted`), we never actually make use of the mutability of the returned metadata. And we never make use of the pointer-identity. By passing `ClangASTMetadata` by-value (the type is fairly small, size of 2 64-bit pointers) we'll avoid some questions surrounding the lifetimes/ownership/mutability of this metadata. For consistency, we also change the parameter to `SetMetadata` from `ClangASTMetadata&` to `ClangASTMetadata` (which is an NFC since we copy the data anyway). This came up during some changes we plan to make where we [create redeclaration chains for decls in the LLDB AST](#95100). We want to avoid having to dig out the canonical decl of the declaration chain for retrieving/setting the metadata. It should just be copied across all decls in the chain. This is easier to guarantee when everything is done by-value.
1 parent 278c0ad commit f9f0ae1

File tree

7 files changed

+53
-46
lines changed

7 files changed

+53
-46
lines changed

lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,7 @@ clang::Decl *ClangASTImporter::CopyDecl(clang::ASTContext *dst_ast,
8484
LLDB_LOG_ERROR(log, result.takeError(), "Couldn't import decl: {0}");
8585
if (log) {
8686
lldb::user_id_t user_id = LLDB_INVALID_UID;
87-
ClangASTMetadata *metadata = GetDeclMetadata(decl);
88-
if (metadata)
87+
if (std::optional<ClangASTMetadata> metadata = GetDeclMetadata(decl))
8988
user_id = metadata->GetUserID();
9089

9190
if (NamedDecl *named_decl = dyn_cast<NamedDecl>(decl))
@@ -950,7 +949,8 @@ bool ClangASTImporter::RequireCompleteType(clang::QualType type) {
950949
return true;
951950
}
952951

953-
ClangASTMetadata *ClangASTImporter::GetDeclMetadata(const clang::Decl *decl) {
952+
std::optional<ClangASTMetadata>
953+
ClangASTImporter::GetDeclMetadata(const clang::Decl *decl) {
954954
DeclOrigin decl_origin = GetDeclOrigin(decl);
955955

956956
if (decl_origin.Valid()) {
@@ -1105,7 +1105,7 @@ ClangASTImporter::ASTImporterDelegate::ImportImpl(Decl *From) {
11051105

11061106
// If we have a forcefully completed type, try to find an actual definition
11071107
// for it in other modules.
1108-
const ClangASTMetadata *md = m_main.GetDeclMetadata(From);
1108+
std::optional<ClangASTMetadata> md = m_main.GetDeclMetadata(From);
11091109
auto *td = dyn_cast<TagDecl>(From);
11101110
if (td && md && md->IsForcefullyCompleted()) {
11111111
Log *log = GetLog(LLDBLog::Expressions);
@@ -1284,8 +1284,7 @@ void ClangASTImporter::ASTImporterDelegate::Imported(clang::Decl *from,
12841284
}
12851285

12861286
lldb::user_id_t user_id = LLDB_INVALID_UID;
1287-
ClangASTMetadata *metadata = m_main.GetDeclMetadata(from);
1288-
if (metadata)
1287+
if (std::optional<ClangASTMetadata> metadata = m_main.GetDeclMetadata(from))
12891288
user_id = metadata->GetUserID();
12901289

12911290
if (log) {

lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ class ClangASTImporter {
189189
/// is only a shallow clone that lacks any contents.
190190
void SetDeclOrigin(const clang::Decl *decl, clang::Decl *original_decl);
191191

192-
ClangASTMetadata *GetDeclMetadata(const clang::Decl *decl);
192+
std::optional<ClangASTMetadata> GetDeclMetadata(const clang::Decl *decl);
193193

194194
//
195195
// Namespace maps

lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,9 +219,10 @@ void ClangUserExpression::ScanContext(ExecutionContext &exe_ctx, Status &err) {
219219
// whatever runtime the debug info says the object pointer belongs to. Do
220220
// that here.
221221

222-
ClangASTMetadata *metadata =
223-
TypeSystemClang::DeclContextGetMetaData(decl_context, function_decl);
224-
if (metadata && metadata->HasObjectPtr()) {
222+
if (std::optional<ClangASTMetadata> metadata =
223+
TypeSystemClang::DeclContextGetMetaData(decl_context,
224+
function_decl);
225+
metadata && metadata->HasObjectPtr()) {
225226
lldb::LanguageType language = metadata->GetObjectPtrLanguage();
226227
if (language == lldb::eLanguageTypeC_plus_plus) {
227228
if (m_enforce_valid_object) {

lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -398,9 +398,9 @@ bool AppleObjCDeclVendor::FinishDecl(clang::ObjCInterfaceDecl *interface_decl) {
398398
Log *log(
399399
GetLog(LLDBLog::Expressions)); // FIXME - a more appropriate log channel?
400400

401-
ClangASTMetadata *metadata = m_ast_ctx->GetMetadata(interface_decl);
402401
ObjCLanguageRuntime::ObjCISA objc_isa = 0;
403-
if (metadata)
402+
if (std::optional<ClangASTMetadata> metadata =
403+
m_ast_ctx->GetMetadata(interface_decl))
404404
objc_isa = metadata->GetISAPtr();
405405

406406
if (!objc_isa)
@@ -559,8 +559,8 @@ uint32_t AppleObjCDeclVendor::FindDecls(ConstString name, bool append,
559559
ast_ctx.getObjCInterfaceType(result_iface_decl);
560560

561561
uint64_t isa_value = LLDB_INVALID_ADDRESS;
562-
ClangASTMetadata *metadata = m_ast_ctx->GetMetadata(result_iface_decl);
563-
if (metadata)
562+
if (std::optional<ClangASTMetadata> metadata =
563+
m_ast_ctx->GetMetadata(result_iface_decl))
564564
isa_value = metadata->GetISAPtr();
565565

566566
LLDB_LOGF(log,

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

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1787,8 +1787,8 @@ bool TypeSystemClang::RecordHasFields(const RecordDecl *record_decl) {
17871787
// -flimit-debug-info instead of just seeing nothing if this is a base class
17881788
// (since we were hiding empty base classes), or nothing when you turn open
17891789
// an valiable whose type was incomplete.
1790-
ClangASTMetadata *meta_data = GetMetadata(record_decl);
1791-
if (meta_data && meta_data->IsForcefullyCompleted())
1790+
if (std::optional<ClangASTMetadata> meta_data = GetMetadata(record_decl);
1791+
meta_data && meta_data->IsForcefullyCompleted())
17921792
return true;
17931793

17941794
return false;
@@ -2465,27 +2465,31 @@ void TypeSystemClang::SetMetadataAsUserID(const clang::Type *type,
24652465
}
24662466

24672467
void TypeSystemClang::SetMetadata(const clang::Decl *object,
2468-
ClangASTMetadata &metadata) {
2468+
ClangASTMetadata metadata) {
24692469
m_decl_metadata[object] = metadata;
24702470
}
24712471

24722472
void TypeSystemClang::SetMetadata(const clang::Type *object,
2473-
ClangASTMetadata &metadata) {
2473+
ClangASTMetadata metadata) {
24742474
m_type_metadata[object] = metadata;
24752475
}
24762476

2477-
ClangASTMetadata *TypeSystemClang::GetMetadata(const clang::Decl *object) {
2477+
std::optional<ClangASTMetadata>
2478+
TypeSystemClang::GetMetadata(const clang::Decl *object) {
24782479
auto It = m_decl_metadata.find(object);
24792480
if (It != m_decl_metadata.end())
2480-
return &It->second;
2481-
return nullptr;
2481+
return It->second;
2482+
2483+
return std::nullopt;
24822484
}
24832485

2484-
ClangASTMetadata *TypeSystemClang::GetMetadata(const clang::Type *object) {
2486+
std::optional<ClangASTMetadata>
2487+
TypeSystemClang::GetMetadata(const clang::Type *object) {
24852488
auto It = m_type_metadata.find(object);
24862489
if (It != m_type_metadata.end())
2487-
return &It->second;
2488-
return nullptr;
2490+
return It->second;
2491+
2492+
return std::nullopt;
24892493
}
24902494

24912495
void TypeSystemClang::SetCXXRecordDeclAccess(const clang::CXXRecordDecl *object,
@@ -2934,9 +2938,10 @@ bool TypeSystemClang::IsRuntimeGeneratedType(
29342938
clang::ObjCInterfaceDecl *result_iface_decl =
29352939
llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx);
29362940

2937-
ClangASTMetadata *ast_metadata = GetMetadata(result_iface_decl);
2941+
std::optional<ClangASTMetadata> ast_metadata = GetMetadata(result_iface_decl);
29382942
if (!ast_metadata)
29392943
return false;
2944+
29402945
return (ast_metadata->GetISAPtr() != 0);
29412946
}
29422947

@@ -3622,8 +3627,8 @@ bool TypeSystemClang::IsPossibleDynamicType(lldb::opaque_compiler_type_t type,
36223627
if (is_complete)
36233628
success = cxx_record_decl->isDynamicClass();
36243629
else {
3625-
ClangASTMetadata *metadata = GetMetadata(cxx_record_decl);
3626-
if (metadata)
3630+
if (std::optional<ClangASTMetadata> metadata =
3631+
GetMetadata(cxx_record_decl))
36273632
success = metadata->GetIsDynamicCXXType();
36283633
else {
36293634
is_complete = GetType(pointee_qual_type).GetCompleteType();
@@ -5326,7 +5331,8 @@ GetDynamicArrayInfo(TypeSystemClang &ast, SymbolFile *sym_file,
53265331
clang::QualType qual_type,
53275332
const ExecutionContext *exe_ctx) {
53285333
if (qual_type->isIncompleteArrayType())
5329-
if (auto *metadata = ast.GetMetadata(qual_type.getTypePtr()))
5334+
if (std::optional<ClangASTMetadata> metadata =
5335+
ast.GetMetadata(qual_type.getTypePtr()))
53305336
return sym_file->GetDynamicArrayInfoForUID(metadata->GetUserID(),
53315337
exe_ctx);
53325338
return std::nullopt;
@@ -8868,8 +8874,7 @@ void TypeSystemClang::DumpTypeDescription(lldb::opaque_compiler_type_t type,
88688874

88698875
CompilerType ct(weak_from_this(), type);
88708876
const clang::Type *clang_type = ClangUtil::GetQualType(ct).getTypePtr();
8871-
ClangASTMetadata *metadata = GetMetadata(clang_type);
8872-
if (metadata) {
8877+
if (std::optional<ClangASTMetadata> metadata = GetMetadata(clang_type)) {
88738878
metadata->Dump(&s);
88748879
}
88758880
}
@@ -9490,7 +9495,7 @@ bool TypeSystemClang::DeclContextIsClassMethod(void *opaque_decl_ctx) {
94909495
return true;
94919496
} else if (clang::FunctionDecl *fun_decl =
94929497
llvm::dyn_cast<clang::FunctionDecl>(decl_ctx)) {
9493-
if (ClangASTMetadata *metadata = GetMetadata(fun_decl))
9498+
if (std::optional<ClangASTMetadata> metadata = GetMetadata(fun_decl))
94949499
return metadata->HasObjectPtr();
94959500
}
94969501

@@ -9543,7 +9548,7 @@ TypeSystemClang::DeclContextGetLanguage(void *opaque_decl_ctx) {
95439548
} else if (llvm::isa<clang::CXXMethodDecl>(decl_ctx)) {
95449549
return eLanguageTypeC_plus_plus;
95459550
} else if (auto *fun_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx)) {
9546-
if (ClangASTMetadata *metadata = GetMetadata(fun_decl))
9551+
if (std::optional<ClangASTMetadata> metadata = GetMetadata(fun_decl))
95479552
return metadata->GetObjectPtrLanguage();
95489553
}
95499554

@@ -9593,7 +9598,7 @@ TypeSystemClang::DeclContextGetAsNamespaceDecl(const CompilerDeclContext &dc) {
95939598
return nullptr;
95949599
}
95959600

9596-
ClangASTMetadata *
9601+
std::optional<ClangASTMetadata>
95979602
TypeSystemClang::DeclContextGetMetaData(const CompilerDeclContext &dc,
95989603
const Decl *object) {
95999604
TypeSystemClang *ast = llvm::cast<TypeSystemClang>(dc.GetTypeSystem());
@@ -9827,8 +9832,7 @@ bool TypeSystemClang::IsForcefullyCompleted(lldb::opaque_compiler_type_t type) {
98279832
if (record_type) {
98289833
const clang::RecordDecl *record_decl = record_type->getDecl();
98299834
assert(record_decl);
9830-
ClangASTMetadata *metadata = GetMetadata(record_decl);
9831-
if (metadata)
9835+
if (std::optional<ClangASTMetadata> metadata = GetMetadata(record_decl))
98329836
return metadata->IsForcefullyCompleted();
98339837
}
98349838
}
@@ -9838,11 +9842,13 @@ bool TypeSystemClang::IsForcefullyCompleted(lldb::opaque_compiler_type_t type) {
98389842
bool TypeSystemClang::SetDeclIsForcefullyCompleted(const clang::TagDecl *td) {
98399843
if (td == nullptr)
98409844
return false;
9841-
ClangASTMetadata *metadata = GetMetadata(td);
9842-
if (metadata == nullptr)
9845+
std::optional<ClangASTMetadata> metadata = GetMetadata(td);
9846+
if (!metadata)
98439847
return false;
98449848
m_has_forcefully_completed_types = true;
98459849
metadata->SetIsForcefullyCompleted();
9850+
SetMetadata(td, *metadata);
9851+
98469852
return true;
98479853
}
98489854

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,11 @@ class TypeSystemClang : public TypeSystem {
191191
void SetMetadataAsUserID(const clang::Decl *decl, lldb::user_id_t user_id);
192192
void SetMetadataAsUserID(const clang::Type *type, lldb::user_id_t user_id);
193193

194-
void SetMetadata(const clang::Decl *object, ClangASTMetadata &meta_data);
194+
void SetMetadata(const clang::Decl *object, ClangASTMetadata meta_data);
195195

196-
void SetMetadata(const clang::Type *object, ClangASTMetadata &meta_data);
197-
ClangASTMetadata *GetMetadata(const clang::Decl *object);
198-
ClangASTMetadata *GetMetadata(const clang::Type *object);
196+
void SetMetadata(const clang::Type *object, ClangASTMetadata meta_data);
197+
std::optional<ClangASTMetadata> GetMetadata(const clang::Decl *object);
198+
std::optional<ClangASTMetadata> GetMetadata(const clang::Type *object);
199199

200200
void SetCXXRecordDeclAccess(const clang::CXXRecordDecl *object,
201201
clang::AccessSpecifier access);
@@ -616,8 +616,9 @@ class TypeSystemClang : public TypeSystem {
616616
static clang::NamespaceDecl *
617617
DeclContextGetAsNamespaceDecl(const CompilerDeclContext &dc);
618618

619-
static ClangASTMetadata *DeclContextGetMetaData(const CompilerDeclContext &dc,
620-
const clang::Decl *object);
619+
static std::optional<ClangASTMetadata>
620+
DeclContextGetMetaData(const CompilerDeclContext &dc,
621+
const clang::Decl *object);
621622

622623
static clang::ASTContext *
623624
DeclContextGetTypeSystemClang(const CompilerDeclContext &dc);

lldb/unittests/Symbol/TestClangASTImporter.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ TEST_F(TestClangASTImporter, MetadataPropagation) {
188188
ASSERT_NE(nullptr, imported);
189189

190190
// Check that we got the same Metadata.
191-
ASSERT_NE(nullptr, importer.GetDeclMetadata(imported));
191+
ASSERT_NE(std::nullopt, importer.GetDeclMetadata(imported));
192192
EXPECT_EQ(metadata, importer.GetDeclMetadata(imported)->GetUserID());
193193
}
194194

@@ -219,7 +219,7 @@ TEST_F(TestClangASTImporter, MetadataPropagationIndirectImport) {
219219
ASSERT_NE(nullptr, imported);
220220

221221
// Check that we got the same Metadata.
222-
ASSERT_NE(nullptr, importer.GetDeclMetadata(imported));
222+
ASSERT_NE(std::nullopt, importer.GetDeclMetadata(imported));
223223
EXPECT_EQ(metadata, importer.GetDeclMetadata(imported)->GetUserID());
224224
}
225225

@@ -244,7 +244,7 @@ TEST_F(TestClangASTImporter, MetadataPropagationAfterCopying) {
244244
source.ast->SetMetadataAsUserID(source.record_decl, metadata);
245245

246246
// Check that we got the same Metadata.
247-
ASSERT_NE(nullptr, importer.GetDeclMetadata(imported));
247+
ASSERT_NE(std::nullopt, importer.GetDeclMetadata(imported));
248248
EXPECT_EQ(metadata, importer.GetDeclMetadata(imported)->GetUserID());
249249
}
250250

0 commit comments

Comments
 (0)