Skip to content

Commit 54eb75b

Browse files
committed
Report symbol entry address in inline function discovery.
1 parent ff27656 commit 54eb75b

File tree

3 files changed

+17
-21
lines changed

3 files changed

+17
-21
lines changed

‎client/TracyCallstack.cpp‎

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ void InitCallstack()
401401
cb_bts = backtrace_create_state( nullptr, 0, nullptr, nullptr );
402402
}
403403

404-
static int FastCallstackDataCb( void* data, uintptr_t pc, const char* fn, int lineno, const char* function )
404+
static int FastCallstackDataCb( void* data, uintptr_t pc, uintptr_t lowaddr, const char* fn, int lineno, const char* function )
405405
{
406406
if( function )
407407
{
@@ -440,7 +440,7 @@ const char* DecodeCallstackPtrFast( uint64_t ptr )
440440
return ret;
441441
}
442442

443-
static int SymbolAddressDataCb( void* data, uintptr_t pc, const char* fn, int lineno, const char* function )
443+
static int SymbolAddressDataCb( void* data, uintptr_t pc, uintptr_t lowaddr, const char* fn, int lineno, const char* function )
444444
{
445445
auto& sym = *(SymbolData*)data;
446446
if( !fn )
@@ -480,13 +480,13 @@ SymbolData DecodeCodeAddress( uint64_t ptr )
480480
return DecodeSymbolAddress( ptr );
481481
}
482482

483-
static int CallstackDataCb( void* /*data*/, uintptr_t pc, const char* fn, int lineno, const char* function )
483+
static int CallstackDataCb( void* /*data*/, uintptr_t pc, uintptr_t lowaddr, const char* fn, int lineno, const char* function )
484484
{
485485
enum { DemangleBufLen = 64*1024 };
486486
char demangled[DemangleBufLen];
487487

488488
cb_data[cb_num].symLen = 0;
489-
cb_data[cb_num].symAddr = (uint64_t)pc;
489+
cb_data[cb_num].symAddr = (uint64_t)lowaddr;
490490

491491
if( !fn && !function )
492492
{
@@ -597,14 +597,14 @@ static void CallstackErrorCb( void* /*data*/, const char* /*msg*/, int /*errnum*
597597

598598
void SymInfoCallback( void* /*data*/, uintptr_t pc, const char* symname, uintptr_t symval, uintptr_t symsize )
599599
{
600-
cb_data[cb_fixup].symLen = (uint32_t)symsize;
601-
cb_data[cb_fixup].symAddr = (uint64_t)symval;
600+
cb_data[cb_num-1].symLen = (uint32_t)symsize;
601+
cb_data[cb_num-1].symAddr = (uint64_t)symval;
602602
}
603603

604604
void SymInfoError( void* /*data*/, const char* /*msg*/, int /*errnum*/ )
605605
{
606-
cb_data[cb_fixup].symLen = 0;
607-
cb_data[cb_fixup].symAddr = 0;
606+
cb_data[cb_num-1].symLen = 0;
607+
cb_data[cb_num-1].symAddr = 0;
608608
}
609609

610610
CallstackEntryData DecodeCallstackPtr( uint64_t ptr )
@@ -613,11 +613,7 @@ CallstackEntryData DecodeCallstackPtr( uint64_t ptr )
613613
backtrace_pcinfo( cb_bts, ptr, CallstackDataCb, CallstackErrorCb, nullptr );
614614
assert( cb_num > 0 );
615615

616-
for( int i=0; i<cb_num; i++ )
617-
{
618-
cb_fixup = i;
619-
backtrace_syminfo( cb_bts, cb_data[i].symAddr, SymInfoCallback, SymInfoError, nullptr );
620-
}
616+
backtrace_syminfo( cb_bts, ptr, SymInfoCallback, SymInfoError, nullptr );
621617

622618
const char* symloc = nullptr;
623619
Dl_info dlinfo;

‎libbacktrace/backtrace.hpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ extern struct backtrace_state *backtrace_create_state (
9595
continuing tracing. The FILENAME and FUNCTION buffers may become
9696
invalid after this function returns. */
9797

98-
typedef int (*backtrace_full_callback) (void *data, uintptr_t pc,
98+
typedef int (*backtrace_full_callback) (void *data, uintptr_t pc, uintptr_t lowaddr,
9999
const char *filename, int lineno,
100100
const char *function);
101101

‎libbacktrace/dwarf.cpp‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3874,7 +3874,7 @@ report_inlined_functions (uintptr_t pc, struct function *function,
38743874
return ret;
38753875

38763876
/* Report this inlined call. */
3877-
ret = callback (data, pc, *filename, *lineno, inlined->name);
3877+
ret = callback (data, pc, function_addrs->low, *filename, *lineno, inlined->name);
38783878
if (ret != 0)
38793879
return ret;
38803880

@@ -4026,7 +4026,7 @@ dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata,
40264026
if (new_data)
40274027
return dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
40284028
data, found);
4029-
return callback (data, pc, NULL, 0, NULL);
4029+
return callback (data, pc, 0, NULL, 0, NULL);
40304030
}
40314031

40324032
/* Search for PC within this unit. */
@@ -4073,21 +4073,21 @@ dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata,
40734073
entry->u->abs_filename = filename;
40744074
}
40754075

4076-
return callback (data, pc, entry->u->abs_filename, 0, NULL);
4076+
return callback (data, pc, 0, entry->u->abs_filename, 0, NULL);
40774077
}
40784078

40794079
/* Search for function name within this unit. */
40804080

40814081
if (entry->u->function_addrs_count == 0)
4082-
return callback (data, pc, ln->filename, ln->lineno, NULL);
4082+
return callback (data, pc, 0, ln->filename, ln->lineno, NULL);
40834083

40844084
function_addrs = ((struct function_addrs *)
40854085
bsearch (&pc, entry->u->function_addrs,
40864086
entry->u->function_addrs_count,
40874087
sizeof (struct function_addrs),
40884088
function_addrs_search));
40894089
if (function_addrs == NULL)
4090-
return callback (data, pc, ln->filename, ln->lineno, NULL);
4090+
return callback (data, pc, 0, ln->filename, ln->lineno, NULL);
40914091

40924092
/* If there are multiple function ranges that contain PC, use the
40934093
last one, in order to produce predictable results. */
@@ -4108,7 +4108,7 @@ dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata,
41084108
if (ret != 0)
41094109
return ret;
41104110

4111-
return callback (data, pc, filename, lineno, function->name);
4111+
return callback (data, pc, function_addrs->low, filename, lineno, function->name);
41124112
}
41134113

41144114

@@ -4158,7 +4158,7 @@ dwarf_fileline (struct backtrace_state *state, uintptr_t pc,
41584158

41594159
/* FIXME: See if any libraries have been dlopen'ed. */
41604160

4161-
return callback (data, pc, NULL, 0, NULL);
4161+
return callback (data, pc, 0, NULL, 0, NULL);
41624162
}
41634163

41644164
/* Initialize our data structures from the DWARF debug info for a

0 commit comments

Comments
 (0)