@@ -2072,6 +2072,43 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset,
20722072 return true ;
20732073}
20742074
2075+ static bool
2076+ TryParseV2ObjCMetadataSymbol (const char *&symbol_name,
2077+ const char *&symbol_name_non_abi_mangled,
2078+ SymbolType &type) {
2079+ static constexpr llvm::StringLiteral g_objc_v2_prefix_class (" _OBJC_CLASS_$_" );
2080+ static constexpr llvm::StringLiteral g_objc_v2_prefix_metaclass (
2081+ " _OBJC_METACLASS_$_" );
2082+ static constexpr llvm::StringLiteral g_objc_v2_prefix_ivar (" _OBJC_IVAR_$_" );
2083+
2084+ llvm::StringRef symbol_name_ref (symbol_name);
2085+ if (symbol_name_ref.empty ())
2086+ return false ;
2087+
2088+ if (symbol_name_ref.starts_with (g_objc_v2_prefix_class)) {
2089+ symbol_name_non_abi_mangled = symbol_name + 1 ;
2090+ symbol_name = symbol_name + g_objc_v2_prefix_class.size ();
2091+ type = eSymbolTypeObjCClass;
2092+ return true ;
2093+ }
2094+
2095+ if (symbol_name_ref.starts_with (g_objc_v2_prefix_metaclass)) {
2096+ symbol_name_non_abi_mangled = symbol_name + 1 ;
2097+ symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size ();
2098+ type = eSymbolTypeObjCMetaClass;
2099+ return true ;
2100+ }
2101+
2102+ if (symbol_name_ref.starts_with (g_objc_v2_prefix_ivar)) {
2103+ symbol_name_non_abi_mangled = symbol_name + 1 ;
2104+ symbol_name = symbol_name + g_objc_v2_prefix_ivar.size ();
2105+ type = eSymbolTypeObjCIVar;
2106+ return true ;
2107+ }
2108+
2109+ return false ;
2110+ }
2111+
20752112static SymbolType GetSymbolType (const char *&symbol_name,
20762113 bool &demangled_is_synthesized,
20772114 const SectionSP &text_section_sp,
@@ -2188,9 +2225,6 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
21882225 lldb::offset_t offset = MachHeaderSizeFromMagic (m_header.magic );
21892226 uint32_t i;
21902227 FileSpecList dylib_files;
2191- llvm::StringRef g_objc_v2_prefix_class (" _OBJC_CLASS_$_" );
2192- llvm::StringRef g_objc_v2_prefix_metaclass (" _OBJC_METACLASS_$_" );
2193- llvm::StringRef g_objc_v2_prefix_ivar (" _OBJC_IVAR_$_" );
21942228 UUID image_uuid;
21952229
21962230 for (i = 0 ; i < m_header.ncmds ; ++i) {
@@ -2812,36 +2846,13 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
28122846 is_gsym = true ;
28132847 sym[sym_idx].SetExternal (true );
28142848
2815- if (symbol_name && symbol_name[0 ] == ' _' &&
2816- symbol_name[1 ] == ' O' ) {
2817- llvm::StringRef symbol_name_ref (symbol_name);
2818- if (symbol_name_ref.starts_with (
2819- g_objc_v2_prefix_class)) {
2820- symbol_name_non_abi_mangled = symbol_name + 1 ;
2821- symbol_name =
2822- symbol_name + g_objc_v2_prefix_class.size ();
2823- type = eSymbolTypeObjCClass;
2824- demangled_is_synthesized = true ;
2825-
2826- } else if (symbol_name_ref.starts_with (
2827- g_objc_v2_prefix_metaclass)) {
2828- symbol_name_non_abi_mangled = symbol_name + 1 ;
2829- symbol_name =
2830- symbol_name + g_objc_v2_prefix_metaclass.size ();
2831- type = eSymbolTypeObjCMetaClass;
2832- demangled_is_synthesized = true ;
2833- } else if (symbol_name_ref.starts_with (
2834- g_objc_v2_prefix_ivar)) {
2835- symbol_name_non_abi_mangled = symbol_name + 1 ;
2836- symbol_name =
2837- symbol_name + g_objc_v2_prefix_ivar.size ();
2838- type = eSymbolTypeObjCIVar;
2839- demangled_is_synthesized = true ;
2840- }
2841- } else {
2842- if (nlist.n_value != 0 )
2843- symbol_section = section_info.GetSection (
2844- nlist.n_sect , nlist.n_value );
2849+ if (TryParseV2ObjCMetadataSymbol (
2850+ symbol_name, symbol_name_non_abi_mangled,
2851+ type)) {
2852+ demangled_is_synthesized = true ;
2853+ } else if (nlist.n_value != 0 ) {
2854+ symbol_section = section_info.GetSection (
2855+ nlist.n_sect , nlist.n_value );
28452856 type = eSymbolTypeData;
28462857 }
28472858 break ;
@@ -3326,49 +3337,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
33263337 ::strstr (symbol_sect_name, " __objc" ) ==
33273338 symbol_sect_name) {
33283339 type = eSymbolTypeRuntime;
3329-
3330- if (symbol_name) {
3331- llvm::StringRef symbol_name_ref (symbol_name);
3332- if (symbol_name_ref.starts_with (" _OBJC_" )) {
3333- llvm::StringRef
3334- g_objc_v2_prefix_class (
3335- " _OBJC_CLASS_$_" );
3336- llvm::StringRef
3337- g_objc_v2_prefix_metaclass (
3338- " _OBJC_METACLASS_$_" );
3339- llvm::StringRef
3340- g_objc_v2_prefix_ivar (" _OBJC_IVAR_$_" );
3341- if (symbol_name_ref.starts_with (
3342- g_objc_v2_prefix_class)) {
3343- symbol_name_non_abi_mangled =
3344- symbol_name + 1 ;
3345- symbol_name =
3346- symbol_name +
3347- g_objc_v2_prefix_class.size ();
3348- type = eSymbolTypeObjCClass;
3349- demangled_is_synthesized = true ;
3350- } else if (
3351- symbol_name_ref.starts_with (
3352- g_objc_v2_prefix_metaclass)) {
3353- symbol_name_non_abi_mangled =
3354- symbol_name + 1 ;
3355- symbol_name =
3356- symbol_name +
3357- g_objc_v2_prefix_metaclass.size ();
3358- type = eSymbolTypeObjCMetaClass;
3359- demangled_is_synthesized = true ;
3360- } else if (symbol_name_ref.starts_with (
3361- g_objc_v2_prefix_ivar)) {
3362- symbol_name_non_abi_mangled =
3363- symbol_name + 1 ;
3364- symbol_name =
3365- symbol_name +
3366- g_objc_v2_prefix_ivar.size ();
3367- type = eSymbolTypeObjCIVar;
3368- demangled_is_synthesized = true ;
3369- }
3370- }
3371- }
3340+ demangled_is_synthesized =
3341+ TryParseV2ObjCMetadataSymbol (
3342+ symbol_name,
3343+ symbol_name_non_abi_mangled, type);
33723344 } else if (symbol_sect_name &&
33733345 ::strstr (symbol_sect_name,
33743346 " __gcc_except_tab" ) ==
@@ -3725,7 +3697,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
37253697
37263698 if (is_debug) {
37273699 switch (nlist.n_type ) {
3728- case N_GSYM:
3700+ case N_GSYM: {
37293701 // global symbol: name,,NO_SECT,type,0
37303702 // Sometimes the N_GSYM value contains the address.
37313703
@@ -3741,33 +3713,15 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
37413713 is_gsym = true ;
37423714 sym[sym_idx].SetExternal (true );
37433715
3744- if (symbol_name && symbol_name[0 ] == ' _' && symbol_name[1 ] == ' O' ) {
3745- llvm::StringRef symbol_name_ref (symbol_name);
3746- if (symbol_name_ref.starts_with (g_objc_v2_prefix_class)) {
3747- symbol_name_non_abi_mangled = symbol_name + 1 ;
3748- symbol_name = symbol_name + g_objc_v2_prefix_class.size ();
3749- type = eSymbolTypeObjCClass;
3750- demangled_is_synthesized = true ;
3751-
3752- } else if (symbol_name_ref.starts_with (
3753- g_objc_v2_prefix_metaclass)) {
3754- symbol_name_non_abi_mangled = symbol_name + 1 ;
3755- symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size ();
3756- type = eSymbolTypeObjCMetaClass;
3757- demangled_is_synthesized = true ;
3758- } else if (symbol_name_ref.starts_with (g_objc_v2_prefix_ivar)) {
3759- symbol_name_non_abi_mangled = symbol_name + 1 ;
3760- symbol_name = symbol_name + g_objc_v2_prefix_ivar.size ();
3761- type = eSymbolTypeObjCIVar;
3762- demangled_is_synthesized = true ;
3763- }
3764- } else {
3765- if (nlist.n_value != 0 )
3766- symbol_section =
3767- section_info.GetSection (nlist.n_sect , nlist.n_value );
3716+ if (TryParseV2ObjCMetadataSymbol (symbol_name,
3717+ symbol_name_non_abi_mangled, type)) {
3718+ demangled_is_synthesized = true ;
3719+ } else if (nlist.n_value != 0 ) {
3720+ symbol_section =
3721+ section_info.GetSection (nlist.n_sect , nlist.n_value );
37683722 type = eSymbolTypeData;
37693723 }
3770- break ;
3724+ } break ;
37713725
37723726 case N_FNAME:
37733727 // procedure name (f77 kludge): name,,NO_SECT,0,0
@@ -4207,39 +4161,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
42074161 if (symbol_sect_name &&
42084162 ::strstr (symbol_sect_name, " __objc" ) == symbol_sect_name) {
42094163 type = eSymbolTypeRuntime;
4164+ demangled_is_synthesized = TryParseV2ObjCMetadataSymbol (
4165+ symbol_name, symbol_name_non_abi_mangled, type);
42104166
4211- if (symbol_name) {
4212- llvm::StringRef symbol_name_ref (symbol_name);
4213- if (symbol_name_ref.starts_with (" _OBJC_" )) {
4214- llvm::StringRef g_objc_v2_prefix_class (
4215- " _OBJC_CLASS_$_" );
4216- llvm::StringRef g_objc_v2_prefix_metaclass (
4217- " _OBJC_METACLASS_$_" );
4218- llvm::StringRef g_objc_v2_prefix_ivar (
4219- " _OBJC_IVAR_$_" );
4220- if (symbol_name_ref.starts_with (g_objc_v2_prefix_class)) {
4221- symbol_name_non_abi_mangled = symbol_name + 1 ;
4222- symbol_name =
4223- symbol_name + g_objc_v2_prefix_class.size ();
4224- type = eSymbolTypeObjCClass;
4225- demangled_is_synthesized = true ;
4226- } else if (symbol_name_ref.starts_with (
4227- g_objc_v2_prefix_metaclass)) {
4228- symbol_name_non_abi_mangled = symbol_name + 1 ;
4229- symbol_name =
4230- symbol_name + g_objc_v2_prefix_metaclass.size ();
4231- type = eSymbolTypeObjCMetaClass;
4232- demangled_is_synthesized = true ;
4233- } else if (symbol_name_ref.starts_with (
4234- g_objc_v2_prefix_ivar)) {
4235- symbol_name_non_abi_mangled = symbol_name + 1 ;
4236- symbol_name =
4237- symbol_name + g_objc_v2_prefix_ivar.size ();
4238- type = eSymbolTypeObjCIVar;
4239- demangled_is_synthesized = true ;
4240- }
4241- }
4242- }
42434167 } else if (symbol_sect_name &&
42444168 ::strstr (symbol_sect_name, " __gcc_except_tab" ) ==
42454169 symbol_sect_name) {
0 commit comments