@@ -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,33 +2846,13 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
28122846 is_gsym = true ;
28132847 sym[sym_idx].SetExternal (true );
28142848
2815- llvm::StringRef symbol_name_ref (symbol_name);
2816- if (symbol_name_ref.starts_with (
2817- g_objc_v2_prefix_class)) {
2818- symbol_name_non_abi_mangled = symbol_name + 1 ;
2819- symbol_name =
2820- symbol_name + g_objc_v2_prefix_class.size ();
2821- type = eSymbolTypeObjCClass;
2822- demangled_is_synthesized = true ;
2823-
2824- } else if (symbol_name_ref.starts_with (
2825- g_objc_v2_prefix_metaclass)) {
2826- symbol_name_non_abi_mangled = symbol_name + 1 ;
2827- symbol_name =
2828- symbol_name + g_objc_v2_prefix_metaclass.size ();
2829- type = eSymbolTypeObjCMetaClass;
2849+ if (TryParseV2ObjCMetadataSymbol (
2850+ symbol_name, symbol_name_non_abi_mangled,
2851+ type)) {
28302852 demangled_is_synthesized = true ;
2831- } else if (symbol_name_ref.starts_with (
2832- g_objc_v2_prefix_ivar)) {
2833- symbol_name_non_abi_mangled = symbol_name + 1 ;
2834- symbol_name =
2835- symbol_name + g_objc_v2_prefix_ivar.size ();
2836- type = eSymbolTypeObjCIVar;
2837- demangled_is_synthesized = true ;
2838- } else {
2839- if (nlist.n_value != 0 )
2840- symbol_section = section_info.GetSection (
2841- nlist.n_sect , nlist.n_value );
2853+ } else if (nlist.n_value != 0 ) {
2854+ symbol_section = section_info.GetSection (
2855+ nlist.n_sect , nlist.n_value );
28422856 type = eSymbolTypeData;
28432857 }
28442858 break ;
@@ -3323,49 +3337,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
33233337 ::strstr (symbol_sect_name, " __objc" ) ==
33243338 symbol_sect_name) {
33253339 type = eSymbolTypeRuntime;
3326-
3327- if (symbol_name) {
3328- llvm::StringRef symbol_name_ref (symbol_name);
3329- if (symbol_name_ref.starts_with (" _OBJC_" )) {
3330- llvm::StringRef
3331- g_objc_v2_prefix_class (
3332- " _OBJC_CLASS_$_" );
3333- llvm::StringRef
3334- g_objc_v2_prefix_metaclass (
3335- " _OBJC_METACLASS_$_" );
3336- llvm::StringRef
3337- g_objc_v2_prefix_ivar (" _OBJC_IVAR_$_" );
3338- if (symbol_name_ref.starts_with (
3339- g_objc_v2_prefix_class)) {
3340- symbol_name_non_abi_mangled =
3341- symbol_name + 1 ;
3342- symbol_name =
3343- symbol_name +
3344- g_objc_v2_prefix_class.size ();
3345- type = eSymbolTypeObjCClass;
3346- demangled_is_synthesized = true ;
3347- } else if (
3348- symbol_name_ref.starts_with (
3349- g_objc_v2_prefix_metaclass)) {
3350- symbol_name_non_abi_mangled =
3351- symbol_name + 1 ;
3352- symbol_name =
3353- symbol_name +
3354- g_objc_v2_prefix_metaclass.size ();
3355- type = eSymbolTypeObjCMetaClass;
3356- demangled_is_synthesized = true ;
3357- } else if (symbol_name_ref.starts_with (
3358- g_objc_v2_prefix_ivar)) {
3359- symbol_name_non_abi_mangled =
3360- symbol_name + 1 ;
3361- symbol_name =
3362- symbol_name +
3363- g_objc_v2_prefix_ivar.size ();
3364- type = eSymbolTypeObjCIVar;
3365- demangled_is_synthesized = true ;
3366- }
3367- }
3368- }
3340+ demangled_is_synthesized =
3341+ TryParseV2ObjCMetadataSymbol (
3342+ symbol_name,
3343+ symbol_name_non_abi_mangled, type);
33693344 } else if (symbol_sect_name &&
33703345 ::strstr (symbol_sect_name,
33713346 " __gcc_except_tab" ) ==
@@ -3738,27 +3713,12 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
37383713 is_gsym = true ;
37393714 sym[sym_idx].SetExternal (true );
37403715
3741- llvm::StringRef symbol_name_ref (symbol_name);
3742- if (symbol_name_ref.starts_with (g_objc_v2_prefix_class)) {
3743- symbol_name_non_abi_mangled = symbol_name + 1 ;
3744- symbol_name = symbol_name + g_objc_v2_prefix_class.size ();
3745- type = eSymbolTypeObjCClass;
3746- demangled_is_synthesized = true ;
3747-
3748- } else if (symbol_name_ref.starts_with (g_objc_v2_prefix_metaclass)) {
3749- symbol_name_non_abi_mangled = symbol_name + 1 ;
3750- symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size ();
3751- type = eSymbolTypeObjCMetaClass;
3716+ if (TryParseV2ObjCMetadataSymbol (symbol_name,
3717+ symbol_name_non_abi_mangled, type)) {
37523718 demangled_is_synthesized = true ;
3753- } else if (symbol_name_ref.starts_with (g_objc_v2_prefix_ivar)) {
3754- symbol_name_non_abi_mangled = symbol_name + 1 ;
3755- symbol_name = symbol_name + g_objc_v2_prefix_ivar.size ();
3756- type = eSymbolTypeObjCIVar;
3757- demangled_is_synthesized = true ;
3758- } else {
3759- if (nlist.n_value != 0 )
3760- symbol_section =
3761- section_info.GetSection (nlist.n_sect , nlist.n_value );
3719+ } else if (nlist.n_value != 0 ) {
3720+ symbol_section =
3721+ section_info.GetSection (nlist.n_sect , nlist.n_value );
37623722 type = eSymbolTypeData;
37633723 }
37643724 } break ;
@@ -4201,39 +4161,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
42014161 if (symbol_sect_name &&
42024162 ::strstr (symbol_sect_name, " __objc" ) == symbol_sect_name) {
42034163 type = eSymbolTypeRuntime;
4164+ demangled_is_synthesized = TryParseV2ObjCMetadataSymbol (
4165+ symbol_name, symbol_name_non_abi_mangled, type);
42044166
4205- if (symbol_name) {
4206- llvm::StringRef symbol_name_ref (symbol_name);
4207- if (symbol_name_ref.starts_with (" _OBJC_" )) {
4208- llvm::StringRef g_objc_v2_prefix_class (
4209- " _OBJC_CLASS_$_" );
4210- llvm::StringRef g_objc_v2_prefix_metaclass (
4211- " _OBJC_METACLASS_$_" );
4212- llvm::StringRef g_objc_v2_prefix_ivar (
4213- " _OBJC_IVAR_$_" );
4214- if (symbol_name_ref.starts_with (g_objc_v2_prefix_class)) {
4215- symbol_name_non_abi_mangled = symbol_name + 1 ;
4216- symbol_name =
4217- symbol_name + g_objc_v2_prefix_class.size ();
4218- type = eSymbolTypeObjCClass;
4219- demangled_is_synthesized = true ;
4220- } else if (symbol_name_ref.starts_with (
4221- g_objc_v2_prefix_metaclass)) {
4222- symbol_name_non_abi_mangled = symbol_name + 1 ;
4223- symbol_name =
4224- symbol_name + g_objc_v2_prefix_metaclass.size ();
4225- type = eSymbolTypeObjCMetaClass;
4226- demangled_is_synthesized = true ;
4227- } else if (symbol_name_ref.starts_with (
4228- g_objc_v2_prefix_ivar)) {
4229- symbol_name_non_abi_mangled = symbol_name + 1 ;
4230- symbol_name =
4231- symbol_name + g_objc_v2_prefix_ivar.size ();
4232- type = eSymbolTypeObjCIVar;
4233- demangled_is_synthesized = true ;
4234- }
4235- }
4236- }
42374167 } else if (symbol_sect_name &&
42384168 ::strstr (symbol_sect_name, " __gcc_except_tab" ) ==
42394169 symbol_sect_name) {
0 commit comments