[llvm] c964afb - [AArch64] Diagnose large adrp offset on Windows.

Eli Friedman via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 2 15:11:37 PDT 2021


Author: Eli Friedman
Date: 2021-11-02T15:11:22-07:00
New Revision: c964afb2c8b540a8579c18d3a05379ceee704844

URL: https://github.com/llvm/llvm-project/commit/c964afb2c8b540a8579c18d3a05379ceee704844
DIFF: https://github.com/llvm/llvm-project/commit/c964afb2c8b540a8579c18d3a05379ceee704844.diff

LOG: [AArch64] Diagnose large adrp offset on Windows.

On Windows, this relocation can only encode a 21-bit offset. Make sure
we emit an error, instead of silently truncating the offset.

Found investigating https://bugs.llvm.org/show_bug.cgi?id=52378

Differential Revision: https://reviews.llvm.org/D113051

Added: 
    

Modified: 
    llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
    llvm/test/MC/AArch64/fixup-out-of-range.s

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
index 70a0e9da6af3d..dbb8e85713cba 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
@@ -160,8 +160,11 @@ static uint64_t adjustFixupValue(const MCFixup &Fixup, const MCValue &Target,
     return AdrImmBits(Value & 0x1fffffULL);
   case AArch64::fixup_aarch64_pcrel_adrp_imm21:
     assert(!IsResolved);
-    if (TheTriple.isOSBinFormatCOFF())
+    if (TheTriple.isOSBinFormatCOFF()) {
+      if (!isInt<21>(SignedValue))
+        Ctx.reportError(Fixup.getLoc(), "fixup value out of range");
       return AdrImmBits(Value & 0x1fffffULL);
+    }
     return AdrImmBits((Value & 0x1fffff000ULL) >> 12);
   case AArch64::fixup_aarch64_ldr_pcrel_imm19:
   case AArch64::fixup_aarch64_pcrel_branch19:

diff  --git a/llvm/test/MC/AArch64/fixup-out-of-range.s b/llvm/test/MC/AArch64/fixup-out-of-range.s
index 500c1d1d1f9af..05d07b654fa8b 100644
--- a/llvm/test/MC/AArch64/fixup-out-of-range.s
+++ b/llvm/test/MC/AArch64/fixup-out-of-range.s
@@ -1,5 +1,5 @@
 // RUN: not llvm-mc -triple aarch64--none-eabi -filetype obj < %s -o /dev/null 2>&1 | FileCheck %s
-// RUN: not llvm-mc -triple aarch64-windows -filetype obj < %s -o /dev/null 2>&1 | FileCheck %s
+// RUN: not llvm-mc -triple aarch64-windows -filetype obj < %s -o /dev/null 2>&1 | FileCheck %s -check-prefixes=CHECK,CHECK-WIN
 
 // CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: fixup value out of range
   adr x0, distant
@@ -70,6 +70,8 @@
 // CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: relocation for a thread-local variable points to an absolute symbol
   movz x0, #:tprel_g0:value1
 
+// CHECK-WIN: :[[@LINE+1]]:{{[0-9]+}}: error: fixup value out of range
+  adrp x0, external+0x1000000
 
   .byte 0
 unaligned:


        


More information about the llvm-commits mailing list