[PATCH] gold/aarch64: Fix adrp distance check

Vladislav Khmelevsky och95@yandex.ru
Mon Aug 8 19:18:46 GMT 2022

Hello Cary, Andreas! Thank you for the review.

>> Do you have a test case to illustrate the problem?

Actually not, since we will need far call and add128+ mb binary to test that the gold properly calculates the distance. Or we might add union test, but AFAIK there are no such tests in binutils.

>> adrp_imm >>= 12;

As it was already said this is implementation defined, although usually it's true that it would result in arithmetic shift and would work.

As for the formatting I've add sign conversion since it might trigger the compiler warning, but if it is not needed I will remove it. As for the extra offset variable it looks equal to me so I don't have any problems with reformatting the patch as you've wrote :)

 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;

More information about the Binutils mailing list