aboutsummaryrefslogtreecommitdiff
path: root/gdb/symtab.h
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2023-03-16 14:41:31 -0600
committerTom Tromey <tom@tromey.com>2023-03-17 16:17:43 -0600
commit48e0f38c30a153855e1adc9dc76614f3f88d686a (patch)
treefd93b0e93df5852cd5bfcb81e7854fa418234ffb /gdb/symtab.h
parent152d9c48a29685752ce06a0248a3f0f490c5660a (diff)
downloadbinutils-48e0f38c30a153855e1adc9dc76614f3f88d686a.zip
binutils-48e0f38c30a153855e1adc9dc76614f3f88d686a.tar.gz
binutils-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.h12
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