@@ -445,6 +445,15 @@ ParsedDWARFTypeAttributes::ParsedDWARFTypeAttributes(const DWARFDIE &die) {
445
445
name.SetCString (form_value.AsCString ());
446
446
break ;
447
447
448
+ case DW_AT_object_pointer:
449
+ // GetAttributes follows DW_AT_specification.
450
+ // DW_TAG_subprogram definitions and declarations may both
451
+ // have a DW_AT_object_pointer. Don't overwrite the one
452
+ // we parsed for the definition with the one from the declaration.
453
+ if (!object_pointer.IsValid ())
454
+ object_pointer = form_value.Reference ();
455
+ break ;
456
+
448
457
case DW_AT_signature:
449
458
signature = form_value;
450
459
break ;
@@ -1107,7 +1116,7 @@ bool DWARFASTParserClang::ParseObjCMethod(
1107
1116
std::pair<bool , TypeSP> DWARFASTParserClang::ParseCXXMethod (
1108
1117
const DWARFDIE &die, CompilerType clang_type,
1109
1118
const ParsedDWARFTypeAttributes &attrs, const DWARFDIE &decl_ctx_die,
1110
- const DWARFDIE &object_parameter , bool &ignore_containing_context) {
1119
+ bool is_static , bool &ignore_containing_context) {
1111
1120
Log *log = GetLog (DWARFLog::TypeCompletion | DWARFLog::Lookups);
1112
1121
SymbolFileDWARF *dwarf = die.GetDWARF ();
1113
1122
assert (dwarf);
@@ -1191,9 +1200,6 @@ std::pair<bool, TypeSP> DWARFASTParserClang::ParseCXXMethod(
1191
1200
TypeSystemClang::GetDeclContextForType (class_opaque_type), die,
1192
1201
attrs.name .GetCString ());
1193
1202
1194
- // In DWARF, a C++ method is static if it has no object parameter child.
1195
- const bool is_static = !object_parameter.IsValid ();
1196
-
1197
1203
// We have a C++ member function with no children (this pointer!) and clang
1198
1204
// will get mad if we try and make a function that isn't well formed in the
1199
1205
// DWARF, so we will just skip it...
@@ -1219,7 +1225,9 @@ std::pair<bool, TypeSP> DWARFASTParserClang::ParseCXXMethod(
1219
1225
ClangASTMetadata metadata;
1220
1226
metadata.SetUserID (die.GetID ());
1221
1227
1222
- if (char const *object_pointer_name = object_parameter.GetName ()) {
1228
+ char const *object_pointer_name =
1229
+ attrs.object_pointer ? attrs.object_pointer .GetName () : nullptr ;
1230
+ if (object_pointer_name) {
1223
1231
metadata.SetObjectPtrName (object_pointer_name);
1224
1232
LLDB_LOGF (log, " Setting object pointer name: %s on method object %p.\n " ,
1225
1233
object_pointer_name, static_cast <void *>(cxx_method_decl));
@@ -1315,9 +1323,11 @@ DWARFASTParserClang::ParseSubroutine(const DWARFDIE &die,
1315
1323
type_handled =
1316
1324
ParseObjCMethod (*objc_method, die, clang_type, attrs, is_variadic);
1317
1325
} else if (is_cxx_method) {
1326
+ // In DWARF, a C++ method is static if it has no object parameter child.
1327
+ const bool is_static = !object_parameter.IsValid ();
1318
1328
auto [handled, type_sp] =
1319
- ParseCXXMethod (die, clang_type, attrs, decl_ctx_die,
1320
- object_parameter, ignore_containing_context);
1329
+ ParseCXXMethod (die, clang_type, attrs, decl_ctx_die, is_static,
1330
+ ignore_containing_context);
1321
1331
if (type_sp)
1322
1332
return type_sp;
1323
1333
@@ -1412,7 +1422,9 @@ DWARFASTParserClang::ParseSubroutine(const DWARFDIE &die,
1412
1422
ClangASTMetadata metadata;
1413
1423
metadata.SetUserID (die.GetID ());
1414
1424
1415
- if (char const *object_pointer_name = object_parameter.GetName ()) {
1425
+ char const *object_pointer_name =
1426
+ attrs.object_pointer ? attrs.object_pointer .GetName () : nullptr ;
1427
+ if (object_pointer_name) {
1416
1428
metadata.SetObjectPtrName (object_pointer_name);
1417
1429
LLDB_LOGF (log,
1418
1430
" Setting object pointer name: %s on function "
0 commit comments