aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/aarch64-linux-tdep.c5
-rw-r--r--gdb/aarch64-tdep.c5
-rw-r--r--gdb/utils.c14
4 files changed, 23 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 728ed8c..300e90c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+2018-05-10 Omair Javaid <omair.javaid@linaro.org>
+
+ PR gdb/23127
+ * aarch64-linux-tdep.c (aarch64_linux_init_abi): Add call to
+ set_gdbarch_significant_addr_bit.
+ * aarch64-tdep.c (aarch64_gdbarch_init): Remove call to
+ set_gdbarch_significant_addr_bit.
+ * utils.c (address_significant): Update to sign extend addr.
+
2018-05-09 Max Filippov <jcmvbkbc@gmail.com>
* xtensa-linux-tdep.c (xtensa-tdep.h): New include.
diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c
index 1f3e888..ba5757d 100644
--- a/gdb/aarch64-linux-tdep.c
+++ b/gdb/aarch64-linux-tdep.c
@@ -1062,6 +1062,11 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
/* Syscall record. */
tdep->aarch64_syscall_record = aarch64_linux_syscall_record;
+ /* The top byte of a user space address known as the "tag",
+ is ignored by the kernel and can be regarded as additional
+ data associated with the address. */
+ set_gdbarch_significant_addr_bit (gdbarch, 56);
+
/* Initialize the aarch64_linux_record_tdep. */
/* These values are the size of the type that will be used in a system
call. They are obtained from Linux Kernel source. */
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
index 01566b4..3c1f389 100644
--- a/gdb/aarch64-tdep.c
+++ b/gdb/aarch64-tdep.c
@@ -2972,11 +2972,6 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_tdesc_pseudo_register_reggroup_p (gdbarch,
aarch64_pseudo_register_reggroup_p);
- /* The top byte of an address is known as the "tag" and is
- ignored by the kernel, the hardware, etc. and can be regarded
- as additional data associated with the address. */
- set_gdbarch_significant_addr_bit (gdbarch, 56);
-
/* ABI */
set_gdbarch_short_bit (gdbarch, 16);
set_gdbarch_int_bit (gdbarch, 32);
diff --git a/gdb/utils.c b/gdb/utils.c
index 63929b2..9c5bf68 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -2705,14 +2705,18 @@ When set, debugging messages will be marked with seconds and microseconds."),
CORE_ADDR
address_significant (gdbarch *gdbarch, CORE_ADDR addr)
{
- /* Truncate address to the significant bits of a target address,
- avoiding shifts larger or equal than the width of a CORE_ADDR.
- The local variable ADDR_BIT stops the compiler reporting a shift
- overflow when it won't occur. */
+ /* Clear insignificant bits of a target address and sign extend resulting
+ address, avoiding shifts larger or equal than the width of a CORE_ADDR.
+ The local variable ADDR_BIT stops the compiler reporting a shift overflow
+ when it won't occur. */
int addr_bit = gdbarch_significant_addr_bit (gdbarch);
if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
- addr &= ((CORE_ADDR) 1 << addr_bit) - 1;
+ {
+ CORE_ADDR sign = (CORE_ADDR) 1 << (addr_bit - 1);
+ addr &= ((CORE_ADDR) 1 << addr_bit) - 1;
+ addr = (addr ^ sign) - sign;
+ }
return addr;
}