Bug #17052 » ruby-addr2line-abbrev_table.patch
| addr2line.c | ||
|---|---|---|
|
static void
|
||
|
di_read_debug_abbrev_cu(DebugInfoReader *reader)
|
||
|
{
|
||
|
uint64_t prev = 0;
|
||
|
const char *p = reader->q0;
|
||
|
size_t i;
|
||
|
for (i = 0; i < ABBREV_TABLE_SIZE; i++)
|
||
|
reader->abbrev_table[i] = NULL;
|
||
|
for (;;) {
|
||
|
uint64_t abbrev_number = uleb128(&p);
|
||
|
if (abbrev_number <= prev) break;
|
||
|
if (abbrev_number == 0) break;
|
||
|
if (abbrev_number < ABBREV_TABLE_SIZE) {
|
||
|
reader->abbrev_table[abbrev_number] = p;
|
||
|
}
|
||
|
prev = abbrev_number;
|
||
|
uleb128(&p); /* tag */
|
||
|
p++; /* has_children */
|
||
|
di_skip_die_attributes(&p);
|
||
| ... | ... | |
|
exit(1);
|
||
|
}
|
||
|
static const char *
|
||
|
di_abbrev_table(DebugInfoReader *reader, uint64_t abbrev_number)
|
||
|
{
|
||
|
const char *p = reader->abbrev_table[abbrev_number];
|
||
|
if (!p) {
|
||
|
fprintf(stderr,"%d: Abbrev Number %"PRId64" not found\n",__LINE__, abbrev_number);
|
||
|
abort();
|
||
|
}
|
||
|
return p;
|
||
|
}
|
||
|
/* find abbrev in current compilation unit */
|
||
|
static const char *
|
||
|
di_find_abbrev(DebugInfoReader *reader, uint64_t abbrev_number)
|
||
|
{
|
||
|
const char *p;
|
||
|
if (abbrev_number < ABBREV_TABLE_SIZE) {
|
||
|
return reader->abbrev_table[abbrev_number];
|
||
|
return di_abbrev_table(reader, abbrev_number);
|
||
|
}
|
||
|
p = reader->abbrev_table[ABBREV_TABLE_SIZE-1];
|
||
|
p = di_abbrev_table(reader, ABBREV_TABLE_SIZE-1);
|
||
|
/* skip 255th record */
|
||
|
uleb128(&p); /* tag */
|
||
|
p++; /* has_children */
|
||