diff options
author | Tom Tromey <tom@tromey.com> | 2023-03-16 14:41:31 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2023-03-17 16:17:43 -0600 |
commit | 48e0f38c30a153855e1adc9dc76614f3f88d686a (patch) | |
tree | fd93b0e93df5852cd5bfcb81e7854fa418234ffb /gdb/symtab.h | |
parent | 152d9c48a29685752ce06a0248a3f0f490c5660a (diff) | |
download | fsf-binutils-gdb-48e0f38c30a153855e1adc9dc76614f3f88d686a.zip fsf-binutils-gdb-48e0f38c30a153855e1adc9dc76614f3f88d686a.tar.gz fsf-binutils-gdb-48e0f38c30a153855e1adc9dc76614f3f88d686a.tar.bz2 |
Fix line table regression
Simon pointed out a line table regression, and after a couple of false
starts, I was able to reproduce it by hand using his instructions.
The bug is that most of the code in do_mixed_source_and_assembly uses
unrelocated addresses, but one spot does:
pc = low;
... after the text offset has been removed.
This patch fixes the problem by introducing a new type to represent
unrelocated addresses in the line table. This prevents this sort of
bug to some degree (it's still possible to manipulate a CORE_ADDR in a
bad way, this is unavoidable).
However, this did let the compiler flag a few spots in that function,
and now it's not possible to compare an unrelocated address from a
line table with an ordinary CORE_ADDR.
Regression tested on x86-64 Fedora 36, though note this setup never
reproduced the bug in the first place. I also tested it by hand on
the disasm-optim test program.
Diffstat (limited to 'gdb/symtab.h')
-rw-r--r-- | gdb/symtab.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gdb/symtab.h b/gdb/symtab.h index 005b64b..2fd56ce 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1540,6 +1540,12 @@ struct rust_vtable_symbol : public symbol }; +/* Like a CORE_ADDR, but not directly convertible. This is used to + represent an unrelocated CORE_ADDR. DEFINE_OFFSET_TYPE is not used + here because there's no need to add or subtract values of this + type. */ +enum class unrelocated_addr : CORE_ADDR { }; + /* Each item represents a line-->pc (or the reverse) mapping. This is somewhat more wasteful of space than one might wish, but since only the files which are actually debugged are read in to core, we don't @@ -1548,11 +1554,11 @@ struct rust_vtable_symbol : public symbol struct linetable_entry { /* Set the (unrelocated) PC for this entry. */ - void set_raw_pc (CORE_ADDR pc) + void set_raw_pc (unrelocated_addr pc) { m_pc = pc; } /* Return the unrelocated PC for this entry. */ - CORE_ADDR raw_pc () const + unrelocated_addr raw_pc () const { return m_pc; } /* Return the relocated PC for this entry. */ @@ -1582,7 +1588,7 @@ struct linetable_entry bool prologue_end : 1; /* The address for this entry. */ - CORE_ADDR m_pc; + unrelocated_addr m_pc; }; /* The order of entries in the linetable is significant. They should |