public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] gold/aarch64: Fix adrp distance check
@ 2022-06-25 17:52 Vladislav Khmelevsky
  2022-07-29 20:14 ` Cary Coutant
  0 siblings, 1 reply; 7+ messages in thread
From: Vladislav Khmelevsky @ 2022-06-25 17:52 UTC (permalink / raw)
  To: binutils; +Cc: Vladislav Khmelevsky

The offset between destination and location is a signed number,
currently the offset is treated as unsigned number, thus mathematical
shifting of negative value is performed incorrectly.
---
 gold/aarch64.cc | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/gold/aarch64.cc b/gold/aarch64.cc
index d2b0747ffdc..e3ab5f10faa 100644
--- a/gold/aarch64.cc
+++ b/gold/aarch64.cc
@@ -1182,7 +1182,9 @@ class Reloc_stub : public Stub_base<size, big_endian>
   aarch64_valid_for_adrp_p(AArch64_address location, AArch64_address dest)
   {
     typedef AArch64_relocate_functions<size, big_endian> Reloc;
-    int64_t adrp_imm = (Reloc::Page(dest) - Reloc::Page(location)) >> 12;
+    int64_t offset
+        = static_cast<int64_t> (Reloc::Page (dest) - Reloc::Page (location));
+    int64_t adrp_imm = offset < 0 ? ~(~offset >> 12) : offset >> 12;
     return adrp_imm >= MIN_ADRP_IMM && adrp_imm <= MAX_ADRP_IMM;
   }
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 7+ messages in thread
* [PATCH] gold/aarch64: Fix adrp distance check
@ 2022-11-07 11:28 Vladislav Khmelevsky
  2022-11-11  0:49 ` Cary Coutant
  0 siblings, 1 reply; 7+ messages in thread
From: Vladislav Khmelevsky @ 2022-11-07 11:28 UTC (permalink / raw)
  To: binutils; +Cc: Vladislav Khmelevsky

The offset between destination and location is a signed number,
currently the offset is treated as unsigned number, thus mathematical
shift of a negative value is performed incorrectly.
---
 gold/aarch64.cc | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/gold/aarch64.cc b/gold/aarch64.cc
index d2b0747ffdc..514fad96789 100644
--- a/gold/aarch64.cc
+++ b/gold/aarch64.cc
@@ -1182,7 +1182,8 @@ class Reloc_stub : public Stub_base<size, big_endian>
   aarch64_valid_for_adrp_p(AArch64_address location, AArch64_address dest)
   {
     typedef AArch64_relocate_functions<size, big_endian> Reloc;
-    int64_t adrp_imm = (Reloc::Page(dest) - Reloc::Page(location)) >> 12;
+    int64_t adrp_imm = Reloc::Page (dest) - Reloc::Page (location);
+    adrp_imm = adrp_imm < 0 ? ~(~adrp_imm >> 12) : adrp_imm >> 12;
     return adrp_imm >= MIN_ADRP_IMM && adrp_imm <= MAX_ADRP_IMM;
   }
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-11-11  0:50 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-25 17:52 [PATCH] gold/aarch64: Fix adrp distance check Vladislav Khmelevsky
2022-07-29 20:14 ` Cary Coutant
2022-07-29 20:44   ` Andreas Schwab
2022-07-29 22:14     ` Cary Coutant
2022-08-08 19:18       ` Vladislav Khmelevsky
2022-11-07 11:28 Vladislav Khmelevsky
2022-11-11  0:49 ` Cary Coutant

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).