*/
static void search_all_symtabs ( Addr ptr, /*OUT*/DebugInfo** pdi,
/*OUT*/Word* symno,
- Bool match_anywhere_in_sym,
Bool findText )
{
Word sno;
if (!inRange) continue;
- sno = ML_(search_one_symtab) (
- di, ptr, match_anywhere_in_sym, findText );
+ sno = ML_(search_one_symtab) ( di, ptr, findText );
if (sno == -1) goto not_found;
*symno = sno;
*pdi = di;
#define N_SYM_NAME_CACHE 509
typedef
- struct { Addr sym_avma; const HChar* sym_name; PtrdiffT offset; }
+ struct {
+ Addr sym_avma;
+ const HChar* sym_name;
+ PtrdiffT offset : (sizeof(PtrdiffT)*8)-1;
+ Bool isText : 1;
+ }
Sym_Name_CacheEnt;
/* Sym_Name_CacheEnt associates a queried address to the sym name found.
By nature, if a sym name was found, it means the searched address
UWord hash = a % N_SYM_NAME_CACHE;
Sym_Name_CacheEnt* se = &sym_name_cache[hash];
- if (UNLIKELY(se->sym_avma != a)) {
+ if (UNLIKELY(se->sym_avma != a || se->isText != findText)) {
DebugInfo* di;
Word sno;
- search_all_symtabs ( a, &di, &sno, match_anywhere_in_sym, findText );
+ search_all_symtabs ( a, &di, &sno, findText );
se->sym_avma = a;
+ se->isText = findText;
if (di == NULL || a == 0)
se->sym_name = no_sym_name;
else {
}
}
- if (se->sym_name == no_sym_name) {
+ if (se->sym_name == no_sym_name
+ || (!match_anywhere_in_sym && se->offset != 0)) {
*buf = "";
return False;
}
VG_(strcpy)(bufwo, *buf);
VG_(sprintf)(bufwo + len, "%c%ld",
se->offset < 0 ? '-' : '+',
- se->offset < 0 ? -se->offset : se->offset);
+ (PtrdiffT) (se->offset < 0 ? -se->offset : se->offset));
*buf = bufwo;
}
Word sno;
search_all_symtabs ( guest_code_addr,
&si, &sno,
- True/*match_anywhere_in_fun*/,
True/*consider text symbols only*/ );
if (si == NULL)
return 0;
a, buf,
/*match_anywhere_in_fun*/True,
/*show offset?*/False,
- /*text syms only*/True,
+ /*text sym*/True,
/*offsetP*/NULL );
}
a, buf,
/*match_anywhere_in_fun*/True,
/*show offset?*/True,
- /*text syms only*/True,
+ /*text sym*/True,
/*offsetP*/NULL );
}
a, &tmp,
/*match_anywhere_in_fun*/False,
/*show offset?*/False,
- /*text syms only*/True,
+ /*text sym*/True,
/*offsetP*/NULL );
if (res)
*buf = tmp;
a, buf,
/*match_anywhere_in_fun*/True,
/*show offset?*/False,
- /*text syms only*/True,
+ /*text sym*/True,
/*offsetP*/NULL );
}
a, buf,
/*match_anywhere_in_fun*/True,
/*show offset?*/False,
- /*text syms only*/True,
+ /*text sym*/True,
/*offsetP*/NULL );
} else {
const DiInlLoc *next_inl = iipc && iipc->next_inltab >= 0
a, &fnname,
/*match_anywhere_in_sym*/True,
/*show offset?*/False,
- /*text syms only*/True,
+ /*text sym*/True,
offset );
}
data_addr, dname,
/*match_anywhere_in_sym*/True,
/*show offset?*/False,
- /*data syms only please*/False,
+ /*text sym*/False,
offset );
}
if not found. Binary search. */
Word ML_(search_one_symtab) ( const DebugInfo* di, Addr ptr,
- Bool match_anywhere_in_sym,
Bool findText )
{
Addr a_mid_lo, a_mid_hi;
- Word mid, size,
+ Word mid,
lo = 0,
hi = di->symtab_used-1;
while (True) {
if (lo > hi) return -1; /* not found */
mid = (lo + hi) / 2;
a_mid_lo = di->symtab[mid].avmas.main;
- size = ( match_anywhere_in_sym
- ? di->symtab[mid].size
- : 1);
- a_mid_hi = ((Addr)di->symtab[mid].avmas.main) + size - 1;
+ a_mid_hi = ((Addr)di->symtab[mid].avmas.main) + di->symtab[mid].size - 1;
if (ptr < a_mid_lo) { hi = mid-1; continue; }
if (ptr > a_mid_hi) { lo = mid+1; continue; }