@@ -2060,13 +2060,17 @@ 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
+ // The changes these symbols would make to the class map. We will also update
2071
+ // m_address_class_map but need to tell the caller what changed because the
2072
+ // caller may be another object file.
2073
+ FileAddressToAddressClassMap address_class_map;
2070
2074
2071
2075
static ConstString text_section_name (" .text" );
2072
2076
static ConstString init_section_name (" .init" );
@@ -2213,18 +2217,18 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2213
2217
switch (mapping_symbol) {
2214
2218
case ' a' :
2215
2219
// $a[.<any>]* - marks an ARM instruction sequence
2216
- m_address_class_map [symbol.st_value ] = AddressClass::eCode;
2220
+ address_class_map [symbol.st_value ] = AddressClass::eCode;
2217
2221
break ;
2218
2222
case ' b' :
2219
2223
case ' t' :
2220
2224
// $b[.<any>]* - marks a THUMB BL instruction sequence
2221
2225
// $t[.<any>]* - marks a THUMB instruction sequence
2222
- m_address_class_map [symbol.st_value ] =
2226
+ address_class_map [symbol.st_value ] =
2223
2227
AddressClass::eCodeAlternateISA;
2224
2228
break ;
2225
2229
case ' d' :
2226
2230
// $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2227
- m_address_class_map [symbol.st_value ] = AddressClass::eData;
2231
+ address_class_map [symbol.st_value ] = AddressClass::eData;
2228
2232
break ;
2229
2233
}
2230
2234
}
@@ -2238,11 +2242,11 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2238
2242
switch (mapping_symbol) {
2239
2243
case ' x' :
2240
2244
// $x[.<any>]* - marks an A64 instruction sequence
2241
- m_address_class_map [symbol.st_value ] = AddressClass::eCode;
2245
+ address_class_map [symbol.st_value ] = AddressClass::eCode;
2242
2246
break ;
2243
2247
case ' d' :
2244
2248
// $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2245
- m_address_class_map [symbol.st_value ] = AddressClass::eData;
2249
+ address_class_map [symbol.st_value ] = AddressClass::eData;
2246
2250
break ;
2247
2251
}
2248
2252
}
@@ -2260,11 +2264,11 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2260
2264
// conjunction with symbol.st_value to produce the final
2261
2265
// symbol_value that we store in the symtab.
2262
2266
symbol_value_offset = -1 ;
2263
- m_address_class_map [symbol.st_value ^ 1 ] =
2267
+ address_class_map [symbol.st_value ^ 1 ] =
2264
2268
AddressClass::eCodeAlternateISA;
2265
2269
} else {
2266
2270
// This address is ARM
2267
- m_address_class_map [symbol.st_value ] = AddressClass::eCode;
2271
+ address_class_map [symbol.st_value ] = AddressClass::eCode;
2268
2272
}
2269
2273
}
2270
2274
}
@@ -2285,17 +2289,17 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2285
2289
*/
2286
2290
if (arch.IsMIPS ()) {
2287
2291
if (IS_MICROMIPS (symbol.st_other ))
2288
- m_address_class_map [symbol.st_value ] = AddressClass::eCodeAlternateISA;
2292
+ address_class_map [symbol.st_value ] = AddressClass::eCodeAlternateISA;
2289
2293
else if ((symbol.st_value & 1 ) && (symbol_type == eSymbolTypeCode)) {
2290
2294
symbol.st_value = symbol.st_value & (~1ull );
2291
- m_address_class_map [symbol.st_value ] = AddressClass::eCodeAlternateISA;
2295
+ address_class_map [symbol.st_value ] = AddressClass::eCodeAlternateISA;
2292
2296
} else {
2293
2297
if (symbol_type == eSymbolTypeCode)
2294
- m_address_class_map [symbol.st_value ] = AddressClass::eCode;
2298
+ address_class_map [symbol.st_value ] = AddressClass::eCode;
2295
2299
else if (symbol_type == eSymbolTypeData)
2296
- m_address_class_map [symbol.st_value ] = AddressClass::eData;
2300
+ address_class_map [symbol.st_value ] = AddressClass::eData;
2297
2301
else
2298
- m_address_class_map [symbol.st_value ] = AddressClass::eUnknown;
2302
+ address_class_map [symbol.st_value ] = AddressClass::eUnknown;
2299
2303
}
2300
2304
}
2301
2305
}
@@ -2392,24 +2396,33 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2392
2396
dc_symbol.SetIsWeak (true );
2393
2397
symtab->AddSymbol (dc_symbol);
2394
2398
}
2395
- return i;
2399
+
2400
+ m_address_class_map.merge (address_class_map);
2401
+ return {i, address_class_map};
2396
2402
}
2397
2403
2398
- unsigned ObjectFileELF::ParseSymbolTable (Symtab *symbol_table,
2399
- user_id_t start_id,
2400
- lldb_private::Section *symtab) {
2404
+ std::pair< unsigned , ObjectFileELF::FileAddressToAddressClassMap>
2405
+ ObjectFileELF::ParseSymbolTable (Symtab *symbol_table, user_id_t start_id,
2406
+ lldb_private::Section *symtab) {
2401
2407
if (symtab->GetObjectFile () != this ) {
2402
2408
// If the symbol table section is owned by a different object file, have it
2403
2409
// do the parsing.
2404
2410
ObjectFileELF *obj_file_elf =
2405
2411
static_cast <ObjectFileELF *>(symtab->GetObjectFile ());
2406
- return obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab);
2412
+ auto [num_symbols, address_class_map] =
2413
+ obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab);
2414
+
2415
+ // The other object file returned the changes it made to its address
2416
+ // class map, make the same changes to ours.
2417
+ m_address_class_map.merge (address_class_map);
2418
+
2419
+ return {num_symbols, address_class_map};
2407
2420
}
2408
2421
2409
2422
// Get section list for this object file.
2410
2423
SectionList *section_list = m_sections_up.get ();
2411
2424
if (!section_list)
2412
- return 0 ;
2425
+ return {} ;
2413
2426
2414
2427
user_id_t symtab_id = symtab->GetID ();
2415
2428
const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex (symtab_id);
@@ -2435,7 +2448,7 @@ unsigned ObjectFileELF::ParseSymbolTable(Symtab *symbol_table,
2435
2448
}
2436
2449
}
2437
2450
2438
- return 0 ;
2451
+ return { 0 , {}} ;
2439
2452
}
2440
2453
2441
2454
size_t ObjectFileELF::ParseDynamicSymbols () {
@@ -2972,8 +2985,12 @@ void ObjectFileELF::ParseSymtab(Symtab &lldb_symtab) {
2972
2985
// while the reverse is not necessarily true.
2973
2986
Section *symtab =
2974
2987
section_list->FindSectionByType (eSectionTypeELFSymbolTable, true ).get ();
2975
- if (symtab)
2976
- symbol_id += ParseSymbolTable (&lldb_symtab, symbol_id, symtab);
2988
+ if (symtab) {
2989
+ auto [num_symbols, address_class_map] =
2990
+ ParseSymbolTable (&lldb_symtab, symbol_id, symtab);
2991
+ m_address_class_map.merge (address_class_map);
2992
+ symbol_id += num_symbols;
2993
+ }
2977
2994
2978
2995
// The symtab section is non-allocable and can be stripped, while the
2979
2996
// .dynsym section which should always be always be there. To support the
@@ -2986,8 +3003,12 @@ void ObjectFileELF::ParseSymtab(Symtab &lldb_symtab) {
2986
3003
Section *dynsym =
2987
3004
section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true )
2988
3005
.get ();
2989
- if (dynsym)
2990
- symbol_id += ParseSymbolTable (&lldb_symtab, symbol_id, dynsym);
3006
+ if (dynsym) {
3007
+ auto [num_symbols, address_class_map] =
3008
+ ParseSymbolTable (&lldb_symtab, symbol_id, dynsym);
3009
+ symbol_id += num_symbols;
3010
+ m_address_class_map.merge (address_class_map);
3011
+ }
2991
3012
}
2992
3013
2993
3014
// DT_JMPREL
0 commit comments