@@ -2072,6 +2072,43 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset,
2072
2072
return true ;
2073
2073
}
2074
2074
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
+
2075
2112
static SymbolType GetSymbolType (const char *&symbol_name,
2076
2113
bool &demangled_is_synthesized,
2077
2114
const SectionSP &text_section_sp,
@@ -2188,9 +2225,6 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
2188
2225
lldb::offset_t offset = MachHeaderSizeFromMagic (m_header.magic );
2189
2226
uint32_t i;
2190
2227
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_$_" );
2194
2228
UUID image_uuid;
2195
2229
2196
2230
for (i = 0 ; i < m_header.ncmds ; ++i) {
@@ -2812,36 +2846,15 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
2812
2846
is_gsym = true ;
2813
2847
sym[sym_idx].SetExternal (true );
2814
2848
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
- }
2849
+ if (TryParseV2ObjCMetadataSymbol (
2850
+ symbol_name, symbol_name_non_abi_mangled,
2851
+ type)) {
2852
+ demangled_is_synthesized = true ;
2841
2853
} else {
2842
2854
if (nlist.n_value != 0 )
2843
2855
symbol_section = section_info.GetSection (
2844
2856
nlist.n_sect , nlist.n_value );
2857
+
2845
2858
type = eSymbolTypeData;
2846
2859
}
2847
2860
break ;
@@ -3327,48 +3340,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
3327
3340
symbol_sect_name) {
3328
3341
type = eSymbolTypeRuntime;
3329
3342
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
- }
3343
+ if (TryParseV2ObjCMetadataSymbol (
3344
+ symbol_name,
3345
+ symbol_name_non_abi_mangled, type))
3346
+ demangled_is_synthesized = true ;
3372
3347
} else if (symbol_sect_name &&
3373
3348
::strstr (symbol_sect_name,
3374
3349
" __gcc_except_tab" ) ==
@@ -3725,7 +3700,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
3725
3700
3726
3701
if (is_debug) {
3727
3702
switch (nlist.n_type ) {
3728
- case N_GSYM:
3703
+ case N_GSYM: {
3729
3704
// global symbol: name,,NO_SECT,type,0
3730
3705
// Sometimes the N_GSYM value contains the address.
3731
3706
@@ -3741,33 +3716,17 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
3741
3716
is_gsym = true ;
3742
3717
sym[sym_idx].SetExternal (true );
3743
3718
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
- }
3719
+ if (TryParseV2ObjCMetadataSymbol (symbol_name,
3720
+ symbol_name_non_abi_mangled, type)) {
3721
+ demangled_is_synthesized = true ;
3764
3722
} else {
3765
3723
if (nlist.n_value != 0 )
3766
3724
symbol_section =
3767
3725
section_info.GetSection (nlist.n_sect , nlist.n_value );
3726
+
3768
3727
type = eSymbolTypeData;
3769
3728
}
3770
- break ;
3729
+ } break ;
3771
3730
3772
3731
case N_FNAME:
3773
3732
// procedure name (f77 kludge): name,,NO_SECT,0,0
@@ -4208,38 +4167,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
4208
4167
::strstr (symbol_sect_name, " __objc" ) == symbol_sect_name) {
4209
4168
type = eSymbolTypeRuntime;
4210
4169
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
- }
4170
+ if (TryParseV2ObjCMetadataSymbol (
4171
+ symbol_name, symbol_name_non_abi_mangled, type))
4172
+ demangled_is_synthesized = true ;
4243
4173
} else if (symbol_sect_name &&
4244
4174
::strstr (symbol_sect_name, " __gcc_except_tab" ) ==
4245
4175
symbol_sect_name) {
0 commit comments