@@ -3775,6 +3775,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
3775
3775
3776
3776
SymbolType type = eSymbolTypeInvalid;
3777
3777
SectionSP symbol_section;
3778
+ lldb::addr_t symbol_byte_size = 0 ;
3778
3779
bool add_nlist = true ;
3779
3780
bool is_gsym = false ;
3780
3781
bool demangled_is_synthesized = false ;
@@ -4360,6 +4361,47 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
4360
4361
4361
4362
if (symbol_section) {
4362
4363
const addr_t section_file_addr = symbol_section->GetFileAddress ();
4364
+ if (symbol_byte_size == 0 && function_starts_count > 0 ) {
4365
+ addr_t symbol_lookup_file_addr = nlist.n_value ;
4366
+ // Do an exact address match for non-ARM addresses, else get the
4367
+ // closest since the symbol might be a thumb symbol which has an
4368
+ // address with bit zero set.
4369
+ FunctionStarts::Entry *func_start_entry =
4370
+ function_starts.FindEntry (symbol_lookup_file_addr, !is_arm);
4371
+ if (is_arm && func_start_entry) {
4372
+ // Verify that the function start address is the symbol address
4373
+ // (ARM) or the symbol address + 1 (thumb).
4374
+ if (func_start_entry->addr != symbol_lookup_file_addr &&
4375
+ func_start_entry->addr != (symbol_lookup_file_addr + 1 )) {
4376
+ // Not the right entry, NULL it out...
4377
+ func_start_entry = nullptr ;
4378
+ }
4379
+ }
4380
+ if (func_start_entry) {
4381
+ func_start_entry->data = true ;
4382
+
4383
+ addr_t symbol_file_addr = func_start_entry->addr ;
4384
+ if (is_arm)
4385
+ symbol_file_addr &= THUMB_ADDRESS_BIT_MASK;
4386
+
4387
+ const FunctionStarts::Entry *next_func_start_entry =
4388
+ function_starts.FindNextEntry (func_start_entry);
4389
+ const addr_t section_end_file_addr =
4390
+ section_file_addr + symbol_section->GetByteSize ();
4391
+ if (next_func_start_entry) {
4392
+ addr_t next_symbol_file_addr = next_func_start_entry->addr ;
4393
+ // Be sure the clear the Thumb address bit when we calculate the
4394
+ // size from the current and next address
4395
+ if (is_arm)
4396
+ next_symbol_file_addr &= THUMB_ADDRESS_BIT_MASK;
4397
+ symbol_byte_size = std::min<lldb::addr_t >(
4398
+ next_symbol_file_addr - symbol_file_addr,
4399
+ section_end_file_addr - symbol_file_addr);
4400
+ } else {
4401
+ symbol_byte_size = section_end_file_addr - symbol_file_addr;
4402
+ }
4403
+ }
4404
+ }
4363
4405
symbol_value -= section_file_addr;
4364
4406
}
4365
4407
@@ -4466,6 +4508,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
4466
4508
if (nlist.n_desc & N_WEAK_REF)
4467
4509
sym[sym_idx].SetIsWeak (true );
4468
4510
4511
+ if (symbol_byte_size > 0 )
4512
+ sym[sym_idx].SetByteSize (symbol_byte_size);
4513
+
4469
4514
if (demangled_is_synthesized)
4470
4515
sym[sym_idx].SetDemangledNameIsSynthesized (true );
4471
4516
@@ -4584,7 +4629,23 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
4584
4629
Address symbol_addr;
4585
4630
if (module_sp->ResolveFileAddress (symbol_file_addr, symbol_addr)) {
4586
4631
SectionSP symbol_section (symbol_addr.GetSection ());
4632
+ uint32_t symbol_byte_size = 0 ;
4587
4633
if (symbol_section) {
4634
+ const addr_t section_file_addr = symbol_section->GetFileAddress ();
4635
+ const FunctionStarts::Entry *next_func_start_entry =
4636
+ function_starts.FindNextEntry (func_start_entry);
4637
+ const addr_t section_end_file_addr =
4638
+ section_file_addr + symbol_section->GetByteSize ();
4639
+ if (next_func_start_entry) {
4640
+ addr_t next_symbol_file_addr = next_func_start_entry->addr ;
4641
+ if (is_arm)
4642
+ next_symbol_file_addr &= THUMB_ADDRESS_BIT_MASK;
4643
+ symbol_byte_size = std::min<lldb::addr_t >(
4644
+ next_symbol_file_addr - symbol_file_addr,
4645
+ section_end_file_addr - symbol_file_addr);
4646
+ } else {
4647
+ symbol_byte_size = section_end_file_addr - symbol_file_addr;
4648
+ }
4588
4649
sym[sym_idx].SetID (synthetic_sym_id++);
4589
4650
// Don't set the name for any synthetic symbols, the Symbol
4590
4651
// object will generate one if needed when the name is accessed
@@ -4596,6 +4657,8 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
4596
4657
add_symbol_addr (symbol_addr.GetFileAddress ());
4597
4658
if (symbol_flags)
4598
4659
sym[sym_idx].SetFlags (symbol_flags);
4660
+ if (symbol_byte_size)
4661
+ sym[sym_idx].SetByteSize (symbol_byte_size);
4599
4662
++sym_idx;
4600
4663
}
4601
4664
}
0 commit comments