@@ -2060,13 +2060,14 @@ static char FindArmAarch64MappingSymbol(const char *symbol_name) {
2060
2060
#define IS_MICROMIPS (ST_OTHER ) (((ST_OTHER)&STO_MIPS_ISA) == STO_MICROMIPS)
2061
2061
2062
2062
// private
2063
- unsigned ObjectFileELF::ParseSymbols (Symtab *symtab, user_id_t start_id,
2064
- SectionList *section_list ,
2065
- const size_t num_symbols,
2066
- const DataExtractor &symtab_data,
2067
- const DataExtractor &strtab_data) {
2063
+ std::pair< unsigned , ObjectFileELF::FileAddressToAddressClassMap>
2064
+ ObjectFileELF::ParseSymbols (Symtab *symtab, user_id_t start_id ,
2065
+ SectionList *section_list, const size_t num_symbols,
2066
+ const DataExtractor &symtab_data,
2067
+ const DataExtractor &strtab_data) {
2068
2068
ELFSymbol symbol;
2069
2069
lldb::offset_t offset = 0 ;
2070
+ FileAddressToAddressClassMap address_class_map;
2070
2071
2071
2072
static ConstString text_section_name (" .text" );
2072
2073
static ConstString init_section_name (" .init" );
@@ -2213,18 +2214,18 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2213
2214
switch (mapping_symbol) {
2214
2215
case ' a' :
2215
2216
// $a[.<any>]* - marks an ARM instruction sequence
2216
- m_address_class_map [symbol.st_value ] = AddressClass::eCode;
2217
+ address_class_map [symbol.st_value ] = AddressClass::eCode;
2217
2218
break ;
2218
2219
case ' b' :
2219
2220
case ' t' :
2220
2221
// $b[.<any>]* - marks a THUMB BL instruction sequence
2221
2222
// $t[.<any>]* - marks a THUMB instruction sequence
2222
- m_address_class_map [symbol.st_value ] =
2223
+ address_class_map [symbol.st_value ] =
2223
2224
AddressClass::eCodeAlternateISA;
2224
2225
break ;
2225
2226
case ' d' :
2226
2227
// $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2227
- m_address_class_map [symbol.st_value ] = AddressClass::eData;
2228
+ address_class_map [symbol.st_value ] = AddressClass::eData;
2228
2229
break ;
2229
2230
}
2230
2231
}
@@ -2238,11 +2239,11 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2238
2239
switch (mapping_symbol) {
2239
2240
case ' x' :
2240
2241
// $x[.<any>]* - marks an A64 instruction sequence
2241
- m_address_class_map [symbol.st_value ] = AddressClass::eCode;
2242
+ address_class_map [symbol.st_value ] = AddressClass::eCode;
2242
2243
break ;
2243
2244
case ' d' :
2244
2245
// $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2245
- m_address_class_map [symbol.st_value ] = AddressClass::eData;
2246
+ address_class_map [symbol.st_value ] = AddressClass::eData;
2246
2247
break ;
2247
2248
}
2248
2249
}
@@ -2260,11 +2261,11 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2260
2261
// conjunction with symbol.st_value to produce the final
2261
2262
// symbol_value that we store in the symtab.
2262
2263
symbol_value_offset = -1 ;
2263
- m_address_class_map [symbol.st_value ^ 1 ] =
2264
+ address_class_map [symbol.st_value ^ 1 ] =
2264
2265
AddressClass::eCodeAlternateISA;
2265
2266
} else {
2266
2267
// This address is ARM
2267
- m_address_class_map [symbol.st_value ] = AddressClass::eCode;
2268
+ address_class_map [symbol.st_value ] = AddressClass::eCode;
2268
2269
}
2269
2270
}
2270
2271
}
@@ -2285,17 +2286,17 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2285
2286
*/
2286
2287
if (arch.IsMIPS ()) {
2287
2288
if (IS_MICROMIPS (symbol.st_other ))
2288
- m_address_class_map [symbol.st_value ] = AddressClass::eCodeAlternateISA;
2289
+ address_class_map [symbol.st_value ] = AddressClass::eCodeAlternateISA;
2289
2290
else if ((symbol.st_value & 1 ) && (symbol_type == eSymbolTypeCode)) {
2290
2291
symbol.st_value = symbol.st_value & (~1ull );
2291
- m_address_class_map [symbol.st_value ] = AddressClass::eCodeAlternateISA;
2292
+ address_class_map [symbol.st_value ] = AddressClass::eCodeAlternateISA;
2292
2293
} else {
2293
2294
if (symbol_type == eSymbolTypeCode)
2294
- m_address_class_map [symbol.st_value ] = AddressClass::eCode;
2295
+ address_class_map [symbol.st_value ] = AddressClass::eCode;
2295
2296
else if (symbol_type == eSymbolTypeData)
2296
- m_address_class_map [symbol.st_value ] = AddressClass::eData;
2297
+ address_class_map [symbol.st_value ] = AddressClass::eData;
2297
2298
else
2298
- m_address_class_map [symbol.st_value ] = AddressClass::eUnknown;
2299
+ address_class_map [symbol.st_value ] = AddressClass::eUnknown;
2299
2300
}
2300
2301
}
2301
2302
}
@@ -2392,24 +2393,27 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2392
2393
dc_symbol.SetIsWeak (true );
2393
2394
symtab->AddSymbol (dc_symbol);
2394
2395
}
2395
- return i ;
2396
+ return {i, address_class_map} ;
2396
2397
}
2397
2398
2398
- unsigned ObjectFileELF::ParseSymbolTable (Symtab *symbol_table,
2399
- user_id_t start_id,
2400
- lldb_private::Section *symtab) {
2399
+ std::pair< unsigned , ObjectFileELF::FileAddressToAddressClassMap>
2400
+ ObjectFileELF::ParseSymbolTable (Symtab *symbol_table, user_id_t start_id,
2401
+ lldb_private::Section *symtab) {
2401
2402
if (symtab->GetObjectFile () != this ) {
2402
2403
// If the symbol table section is owned by a different object file, have it
2403
2404
// do the parsing.
2404
2405
ObjectFileELF *obj_file_elf =
2405
2406
static_cast <ObjectFileELF *>(symtab->GetObjectFile ());
2406
- return obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab);
2407
+ auto [num_symbols, address_class_map] =
2408
+ obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab);
2409
+ m_address_class_map.merge (address_class_map);
2410
+ return {num_symbols, address_class_map};
2407
2411
}
2408
2412
2409
2413
// Get section list for this object file.
2410
2414
SectionList *section_list = m_sections_up.get ();
2411
2415
if (!section_list)
2412
- return 0 ;
2416
+ return {} ;
2413
2417
2414
2418
user_id_t symtab_id = symtab->GetID ();
2415
2419
const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex (symtab_id);
@@ -2435,7 +2439,7 @@ unsigned ObjectFileELF::ParseSymbolTable(Symtab *symbol_table,
2435
2439
}
2436
2440
}
2437
2441
2438
- return 0 ;
2442
+ return { 0 , {}} ;
2439
2443
}
2440
2444
2441
2445
size_t ObjectFileELF::ParseDynamicSymbols () {
@@ -2972,8 +2976,12 @@ void ObjectFileELF::ParseSymtab(Symtab &lldb_symtab) {
2972
2976
// while the reverse is not necessarily true.
2973
2977
Section *symtab =
2974
2978
section_list->FindSectionByType (eSectionTypeELFSymbolTable, true ).get ();
2975
- if (symtab)
2976
- symbol_id += ParseSymbolTable (&lldb_symtab, symbol_id, symtab);
2979
+ if (symtab) {
2980
+ auto [num_symbols, address_class_map] =
2981
+ ParseSymbolTable (&lldb_symtab, symbol_id, symtab);
2982
+ m_address_class_map.merge (address_class_map);
2983
+ symbol_id += num_symbols;
2984
+ }
2977
2985
2978
2986
// The symtab section is non-allocable and can be stripped, while the
2979
2987
// .dynsym section which should always be always be there. To support the
@@ -2986,8 +2994,12 @@ void ObjectFileELF::ParseSymtab(Symtab &lldb_symtab) {
2986
2994
Section *dynsym =
2987
2995
section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true )
2988
2996
.get ();
2989
- if (dynsym)
2990
- symbol_id += ParseSymbolTable (&lldb_symtab, symbol_id, dynsym);
2997
+ if (dynsym) {
2998
+ auto [num_symbols, address_class_map] =
2999
+ ParseSymbolTable (&lldb_symtab, symbol_id, dynsym);
3000
+ symbol_id += num_symbols;
3001
+ m_address_class_map.merge (address_class_map);
3002
+ }
2991
3003
}
2992
3004
2993
3005
// DT_JMPREL
0 commit comments