mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-05 15:15:42 +00:00
Convert disasm.c to new hash table
This converts disasm.c to use the new hash table. Change-Id: I2efbe7ecc2964ec49e0b726ad4674e8eafc929f7 Co-Authored-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
83
gdb/disasm.c
83
gdb/disasm.c
@@ -19,6 +19,7 @@
|
||||
|
||||
#include "arch-utils.h"
|
||||
#include "event-top.h"
|
||||
#include "gdbsupport/unordered_set.h"
|
||||
#include "target.h"
|
||||
#include "value.h"
|
||||
#include "ui-out.h"
|
||||
@@ -122,73 +123,25 @@ struct deprecated_dis_line_entry
|
||||
|
||||
struct dis_line_entry
|
||||
{
|
||||
dis_line_entry (struct symtab *symtab, int line) noexcept
|
||||
: symtab (symtab),
|
||||
line (line)
|
||||
{}
|
||||
|
||||
bool operator== (const dis_line_entry &other) const noexcept
|
||||
{ return this->symtab == other.symtab && this->line == other.line; }
|
||||
|
||||
struct symtab *symtab;
|
||||
int line;
|
||||
};
|
||||
|
||||
/* Hash function for dis_line_entry. */
|
||||
|
||||
static hashval_t
|
||||
hash_dis_line_entry (const void *item)
|
||||
struct dis_line_entry_hash
|
||||
{
|
||||
const struct dis_line_entry *dle = (const struct dis_line_entry *) item;
|
||||
|
||||
return htab_hash_pointer (dle->symtab) + dle->line;
|
||||
}
|
||||
|
||||
/* Equal function for dis_line_entry. */
|
||||
|
||||
static int
|
||||
eq_dis_line_entry (const void *item_lhs, const void *item_rhs)
|
||||
{
|
||||
const struct dis_line_entry *lhs = (const struct dis_line_entry *) item_lhs;
|
||||
const struct dis_line_entry *rhs = (const struct dis_line_entry *) item_rhs;
|
||||
|
||||
return (lhs->symtab == rhs->symtab
|
||||
&& lhs->line == rhs->line);
|
||||
}
|
||||
|
||||
/* Create the table to manage lines for mixed source/disassembly. */
|
||||
|
||||
static htab_t
|
||||
allocate_dis_line_table (void)
|
||||
{
|
||||
return htab_create_alloc (41,
|
||||
hash_dis_line_entry, eq_dis_line_entry,
|
||||
xfree, xcalloc, xfree);
|
||||
}
|
||||
|
||||
/* Add a new dis_line_entry containing SYMTAB and LINE to TABLE. */
|
||||
|
||||
static void
|
||||
add_dis_line_entry (htab_t table, struct symtab *symtab, int line)
|
||||
{
|
||||
void **slot;
|
||||
struct dis_line_entry dle, *dlep;
|
||||
|
||||
dle.symtab = symtab;
|
||||
dle.line = line;
|
||||
slot = htab_find_slot (table, &dle, INSERT);
|
||||
if (*slot == NULL)
|
||||
{
|
||||
dlep = XNEW (struct dis_line_entry);
|
||||
dlep->symtab = symtab;
|
||||
dlep->line = line;
|
||||
*slot = dlep;
|
||||
}
|
||||
}
|
||||
|
||||
/* Return non-zero if SYMTAB, LINE are in TABLE. */
|
||||
|
||||
static int
|
||||
line_has_code_p (htab_t table, struct symtab *symtab, int line)
|
||||
{
|
||||
struct dis_line_entry dle;
|
||||
|
||||
dle.symtab = symtab;
|
||||
dle.line = line;
|
||||
return htab_find (table, &dle) != NULL;
|
||||
}
|
||||
uint64_t operator() (const dis_line_entry &x) const noexcept
|
||||
{ return std::hash<symtab *> () (x.symtab) + std::hash<int> () (x.line); }
|
||||
};
|
||||
|
||||
/* Wrapper of target_read_code. */
|
||||
|
||||
@@ -747,7 +700,7 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch,
|
||||
but if that text is for code that will be disassembled later, then
|
||||
we'll want to defer printing it until later with its associated code. */
|
||||
|
||||
htab_up dis_line_table (allocate_dis_line_table ());
|
||||
gdb::unordered_set<dis_line_entry, dis_line_entry_hash> dis_line_table;
|
||||
|
||||
struct objfile *objfile = main_symtab->compunit ()->objfile ();
|
||||
|
||||
@@ -786,7 +739,7 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch,
|
||||
pc += length;
|
||||
|
||||
if (sal.symtab != NULL)
|
||||
add_dis_line_entry (dis_line_table.get (), sal.symtab, sal.line);
|
||||
dis_line_table.emplace (sal.symtab, sal.line);
|
||||
}
|
||||
|
||||
/* Second pass: print the disassembly.
|
||||
@@ -859,11 +812,9 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch,
|
||||
/* Several preceding source lines. Print the trailing ones
|
||||
not associated with code that we'll print later. */
|
||||
for (l = sal.line - 1; l > last_line; --l)
|
||||
{
|
||||
if (line_has_code_p (dis_line_table.get (),
|
||||
sal.symtab, l))
|
||||
if (dis_line_table.contains ({sal.symtab, l}))
|
||||
break;
|
||||
}
|
||||
|
||||
if (l < sal.line - 1)
|
||||
{
|
||||
start_preceding_line_to_display = l + 1;
|
||||
|
||||
Reference in New Issue
Block a user