@@ -2306,6 +2306,43 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset,
23062306 return true ;
23072307}
23082308
2309+ static bool
2310+ TryParseV2ObjCMetadataSymbol (const char *&symbol_name,
2311+ const char *&symbol_name_non_abi_mangled,
2312+ SymbolType &type) {
2313+ static constexpr llvm::StringLiteral g_objc_v2_prefix_class (" _OBJC_CLASS_$_" );
2314+ static constexpr llvm::StringLiteral g_objc_v2_prefix_metaclass (
2315+ " _OBJC_METACLASS_$_" );
2316+ static constexpr llvm::StringLiteral g_objc_v2_prefix_ivar (" _OBJC_IVAR_$_" );
2317+
2318+ llvm::StringRef symbol_name_ref (symbol_name);
2319+ if (symbol_name_ref.empty ())
2320+ return false ;
2321+
2322+ if (symbol_name_ref.starts_with (g_objc_v2_prefix_class)) {
2323+ symbol_name_non_abi_mangled = symbol_name + 1 ;
2324+ symbol_name = symbol_name + g_objc_v2_prefix_class.size ();
2325+ type = eSymbolTypeObjCClass;
2326+ return true ;
2327+ }
2328+
2329+ if (symbol_name_ref.starts_with (g_objc_v2_prefix_metaclass)) {
2330+ symbol_name_non_abi_mangled = symbol_name + 1 ;
2331+ symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size ();
2332+ type = eSymbolTypeObjCMetaClass;
2333+ return true ;
2334+ }
2335+
2336+ if (symbol_name_ref.starts_with (g_objc_v2_prefix_ivar)) {
2337+ symbol_name_non_abi_mangled = symbol_name + 1 ;
2338+ symbol_name = symbol_name + g_objc_v2_prefix_ivar.size ();
2339+ type = eSymbolTypeObjCIVar;
2340+ return true ;
2341+ }
2342+
2343+ return false ;
2344+ }
2345+
23092346static SymbolType GetSymbolType (const char *&symbol_name,
23102347 bool &demangled_is_synthesized,
23112348 const SectionSP &text_section_sp,
@@ -2422,9 +2459,6 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
24222459 lldb::offset_t offset = MachHeaderSizeFromMagic (m_header.magic );
24232460 uint32_t i;
24242461 FileSpecList dylib_files;
2425- llvm::StringRef g_objc_v2_prefix_class (" _OBJC_CLASS_$_" );
2426- llvm::StringRef g_objc_v2_prefix_metaclass (" _OBJC_METACLASS_$_" );
2427- llvm::StringRef g_objc_v2_prefix_ivar (" _OBJC_IVAR_$_" );
24282462 UUID image_uuid;
24292463
24302464 for (i = 0 ; i < m_header.ncmds ; ++i) {
@@ -3057,36 +3091,15 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
30573091 is_gsym = true ;
30583092 sym[sym_idx].SetExternal (true );
30593093
3060- if (symbol_name && symbol_name[0 ] == ' _' &&
3061- symbol_name[1 ] == ' O' ) {
3062- llvm::StringRef symbol_name_ref (symbol_name);
3063- if (symbol_name_ref.starts_with (
3064- g_objc_v2_prefix_class)) {
3065- symbol_name_non_abi_mangled = symbol_name + 1 ;
3066- symbol_name =
3067- symbol_name + g_objc_v2_prefix_class.size ();
3068- type = eSymbolTypeObjCClass;
3069- demangled_is_synthesized = true ;
3070-
3071- } else if (symbol_name_ref.starts_with (
3072- g_objc_v2_prefix_metaclass)) {
3073- symbol_name_non_abi_mangled = symbol_name + 1 ;
3074- symbol_name =
3075- symbol_name + g_objc_v2_prefix_metaclass.size ();
3076- type = eSymbolTypeObjCMetaClass;
3077- demangled_is_synthesized = true ;
3078- } else if (symbol_name_ref.starts_with (
3079- g_objc_v2_prefix_ivar)) {
3080- symbol_name_non_abi_mangled = symbol_name + 1 ;
3081- symbol_name =
3082- symbol_name + g_objc_v2_prefix_ivar.size ();
3083- type = eSymbolTypeObjCIVar;
3084- demangled_is_synthesized = true ;
3085- }
3094+ if (TryParseV2ObjCMetadataSymbol (
3095+ symbol_name, symbol_name_non_abi_mangled,
3096+ type)) {
3097+ demangled_is_synthesized = true ;
30863098 } else {
30873099 if (nlist.n_value != 0 )
30883100 symbol_section = section_info.GetSection (
30893101 nlist.n_sect , nlist.n_value );
3102+
30903103 type = eSymbolTypeData;
30913104 }
30923105 break ;
@@ -3572,48 +3585,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
35723585 symbol_sect_name) {
35733586 type = eSymbolTypeRuntime;
35743587
3575- if (symbol_name) {
3576- llvm::StringRef symbol_name_ref (symbol_name);
3577- if (symbol_name_ref.starts_with (" _OBJC_" )) {
3578- llvm::StringRef
3579- g_objc_v2_prefix_class (
3580- " _OBJC_CLASS_$_" );
3581- llvm::StringRef
3582- g_objc_v2_prefix_metaclass (
3583- " _OBJC_METACLASS_$_" );
3584- llvm::StringRef
3585- g_objc_v2_prefix_ivar (" _OBJC_IVAR_$_" );
3586- if (symbol_name_ref.starts_with (
3587- g_objc_v2_prefix_class)) {
3588- symbol_name_non_abi_mangled =
3589- symbol_name + 1 ;
3590- symbol_name =
3591- symbol_name +
3592- g_objc_v2_prefix_class.size ();
3593- type = eSymbolTypeObjCClass;
3594- demangled_is_synthesized = true ;
3595- } else if (
3596- symbol_name_ref.starts_with (
3597- g_objc_v2_prefix_metaclass)) {
3598- symbol_name_non_abi_mangled =
3599- symbol_name + 1 ;
3600- symbol_name =
3601- symbol_name +
3602- g_objc_v2_prefix_metaclass.size ();
3603- type = eSymbolTypeObjCMetaClass;
3604- demangled_is_synthesized = true ;
3605- } else if (symbol_name_ref.starts_with (
3606- g_objc_v2_prefix_ivar)) {
3607- symbol_name_non_abi_mangled =
3608- symbol_name + 1 ;
3609- symbol_name =
3610- symbol_name +
3611- g_objc_v2_prefix_ivar.size ();
3612- type = eSymbolTypeObjCIVar;
3613- demangled_is_synthesized = true ;
3614- }
3615- }
3616- }
3588+ if (TryParseV2ObjCMetadataSymbol (
3589+ symbol_name,
3590+ symbol_name_non_abi_mangled, type))
3591+ demangled_is_synthesized = true ;
36173592 } else if (symbol_sect_name &&
36183593 ::strstr (symbol_sect_name,
36193594 " __gcc_except_tab" ) ==
@@ -3970,7 +3945,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39703945
39713946 if (is_debug) {
39723947 switch (nlist.n_type ) {
3973- case N_GSYM:
3948+ case N_GSYM: {
39743949 // global symbol: name,,NO_SECT,type,0
39753950 // Sometimes the N_GSYM value contains the address.
39763951
@@ -3986,33 +3961,17 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39863961 is_gsym = true ;
39873962 sym[sym_idx].SetExternal (true );
39883963
3989- if (symbol_name && symbol_name[0 ] == ' _' && symbol_name[1 ] == ' O' ) {
3990- llvm::StringRef symbol_name_ref (symbol_name);
3991- if (symbol_name_ref.starts_with (g_objc_v2_prefix_class)) {
3992- symbol_name_non_abi_mangled = symbol_name + 1 ;
3993- symbol_name = symbol_name + g_objc_v2_prefix_class.size ();
3994- type = eSymbolTypeObjCClass;
3995- demangled_is_synthesized = true ;
3996-
3997- } else if (symbol_name_ref.starts_with (
3998- g_objc_v2_prefix_metaclass)) {
3999- symbol_name_non_abi_mangled = symbol_name + 1 ;
4000- symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size ();
4001- type = eSymbolTypeObjCMetaClass;
4002- demangled_is_synthesized = true ;
4003- } else if (symbol_name_ref.starts_with (g_objc_v2_prefix_ivar)) {
4004- symbol_name_non_abi_mangled = symbol_name + 1 ;
4005- symbol_name = symbol_name + g_objc_v2_prefix_ivar.size ();
4006- type = eSymbolTypeObjCIVar;
4007- demangled_is_synthesized = true ;
4008- }
3964+ if (TryParseV2ObjCMetadataSymbol (symbol_name,
3965+ symbol_name_non_abi_mangled, type)) {
3966+ demangled_is_synthesized = true ;
40093967 } else {
40103968 if (nlist.n_value != 0 )
40113969 symbol_section =
40123970 section_info.GetSection (nlist.n_sect , nlist.n_value );
3971+
40133972 type = eSymbolTypeData;
40143973 }
4015- break ;
3974+ } break ;
40163975
40173976 case N_FNAME:
40183977 // procedure name (f77 kludge): name,,NO_SECT,0,0
@@ -4453,38 +4412,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
44534412 ::strstr (symbol_sect_name, " __objc" ) == symbol_sect_name) {
44544413 type = eSymbolTypeRuntime;
44554414
4456- if (symbol_name) {
4457- llvm::StringRef symbol_name_ref (symbol_name);
4458- if (symbol_name_ref.starts_with (" _OBJC_" )) {
4459- llvm::StringRef g_objc_v2_prefix_class (
4460- " _OBJC_CLASS_$_" );
4461- llvm::StringRef g_objc_v2_prefix_metaclass (
4462- " _OBJC_METACLASS_$_" );
4463- llvm::StringRef g_objc_v2_prefix_ivar (
4464- " _OBJC_IVAR_$_" );
4465- if (symbol_name_ref.starts_with (g_objc_v2_prefix_class)) {
4466- symbol_name_non_abi_mangled = symbol_name + 1 ;
4467- symbol_name =
4468- symbol_name + g_objc_v2_prefix_class.size ();
4469- type = eSymbolTypeObjCClass;
4470- demangled_is_synthesized = true ;
4471- } else if (symbol_name_ref.starts_with (
4472- g_objc_v2_prefix_metaclass)) {
4473- symbol_name_non_abi_mangled = symbol_name + 1 ;
4474- symbol_name =
4475- symbol_name + g_objc_v2_prefix_metaclass.size ();
4476- type = eSymbolTypeObjCMetaClass;
4477- demangled_is_synthesized = true ;
4478- } else if (symbol_name_ref.starts_with (
4479- g_objc_v2_prefix_ivar)) {
4480- symbol_name_non_abi_mangled = symbol_name + 1 ;
4481- symbol_name =
4482- symbol_name + g_objc_v2_prefix_ivar.size ();
4483- type = eSymbolTypeObjCIVar;
4484- demangled_is_synthesized = true ;
4485- }
4486- }
4487- }
4415+ if (TryParseV2ObjCMetadataSymbol (
4416+ symbol_name, symbol_name_non_abi_mangled, type))
4417+ demangled_is_synthesized = true ;
44884418 } else if (symbol_sect_name &&
44894419 ::strstr (symbol_sect_name, " __gcc_except_tab" ) ==
44904420 symbol_sect_name) {
0 commit comments