gdb/gdb-archer-pie-0315-breakpoint_address_match.patch
Jan Kratochvil 8c4c91efd9 - Upgrade to the FSF GDB snapshot: 7.0.50.20100116
- archer-jankratochvil-fedora13 commit:
    81810a20b2d2c3bf18e151de3cddfc96445b3c46
- [expr-cumulative] Archer branch is missing in this release.
- Update rpm.org#76 workaround for rpm-4.8 using librpm.so.1.
- Dissect archer-jankratochvil-misc into Patch403...Patch408.
- Some regressions exist in this release.
2010-01-16 22:32:10 +00:00

78 lines
2.6 KiB
Diff

[ Forward-ported context. ]
http://sourceware.org/ml/gdb-patches/2009-11/msg00170.html
Subject: [patch 03/15] PIE: breakpoint_address_match gdbarch_addr_bit workaround
Hi,
there are already multiple cases of CORE_ADDR being masked by the width of
gdbarch_addr_bit. This specific new case was required the PIE support.
Please read the C comment in attached patch.
Checked that CORE_ADDR math operations are present on 6000+ lines of code of
GDB sources which makes it impossible to do some general fix by replacing all
a->addr < b->addr
by
addr_less_than (a->addr, b->addr)
etc.
Even with this patch I think there are still many bugs left in the operation
of x86_64 gdb debugging i386 targets. Do you find the C++ way as a viable
one?
Thanks,
Jan
gdb/
* breakpoint.c (breakpoint_address_match): New variables addr_bit and
addr_mask, initialize it. Mask addresses by ADDR_MASK.
* defs.h (CORE_ADDR): Extend the comment.
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -4559,9 +4559,15 @@ static int
breakpoint_address_match (struct address_space *aspace1, CORE_ADDR addr1,
struct address_space *aspace2, CORE_ADDR addr2)
{
+ int addr_bit = gdbarch_addr_bit (target_gdbarch);
+ CORE_ADDR addr_mask = CORE_ADDR_MAX;
+
+ if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
+ addr_mask = ((CORE_ADDR) 1 << addr_bit) - 1;
+
return ((gdbarch_has_global_breakpoints (target_gdbarch)
|| aspace1 == aspace2)
- && addr1 == addr2);
+ && (addr1 & addr_mask) == (addr2 & addr_mask));
}
/* Assuming LOC1 and LOC2's types' have meaningful target addresses
--- a/gdb/defs.h
+++ b/gdb/defs.h
@@ -98,7 +98,20 @@
/* A byte from the program being debugged. */
typedef bfd_byte gdb_byte;
-/* An address in the program being debugged. Host byte order. */
+/* An address in the program being debugged. Host byte order.
+
+ Its width is the maximum width of all the supported targets. That means
+ 32-bit target will run on such GDB using 64-bit CORE_ADDR cluttering the
+ bits 32...63 with random data from internal GDB calculations. GDB currently
+ in general truncates the address width only when it is being presented/used
+ externally (such as by the paddress function).
+
+ FIXME: This is still not right as any GDB internal comparisons (such as >=)
+ of CORE_ADDR do not use the properly truncated width. As converting all the
+ CORE_ADDR operations to width-aware functions is not feasible the way out
+ could be a width-aware C++ class CORE_ADDR referencing gdbarch as its
+ constructor parameter. */
+
typedef bfd_vma CORE_ADDR;
/* The largest CORE_ADDR value. */