[PATCH] D55906: [MC] [AArch64] Correctly resolve ":abs_g1:3" etc.

Eli Friedman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 19 15:53:06 PST 2018


efriedma created this revision.
efriedma added reviewers: mstorsjo, dmgreen, peter.smith, pcc, mgrang.
Herald added subscribers: kristof.beyls, javed.absar.

We have to treat constructs like this as if they were "symbolic", to use the correct codepath to resolve them  This mostly only affects movz etc. because the other uses of classifySymbolRef conservatively treat everything that isn't a constant as if it were a symbol.

Depends on D55896 <https://reviews.llvm.org/D55896>.


Repository:
  rL LLVM

https://reviews.llvm.org/D55906

Files:
  lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
  test/MC/AArch64/fixup-absolute.s


Index: test/MC/AArch64/fixup-absolute.s
===================================================================
--- test/MC/AArch64/fixup-absolute.s
+++ test/MC/AArch64/fixup-absolute.s
@@ -1,21 +1,40 @@
 // RUN: llvm-mc -triple aarch64--none-eabi -filetype obj < %s -o - | llvm-objdump -d - | FileCheck %s
 
+onepart_before = 0x1234
+twopart_before = 0x12345678
+threepart_before = 0x1234567890AB
+fourpart_before = 0x1234567890ABCDEF
+
+// CHECK: mov     x0, #1311673391471656960
 // CHECK: mov     x0, #1311673391471656960
-movz x0, #:abs_g3:fourpart
+movz x0, #:abs_g3:fourpart_before
+movz x0, #:abs_g3:fourpart_after
 // CHECK: mov     x0, #20014547599360
-movz x0, #:abs_g2:threepart
+// CHECK: mov     x0, #20014547599360
+movz x0, #:abs_g2:threepart_before
+movz x0, #:abs_g2:threepart_after
+// CHECK: movk    x0, #22136, lsl #32
 // CHECK: movk    x0, #22136, lsl #32
-movk x0, #:abs_g2_nc:fourpart
+movk x0, #:abs_g2_nc:fourpart_before
+movk x0, #:abs_g2_nc:fourpart_after
 // CHECK: mov     x0, #305397760
-movz x0, #:abs_g1:twopart
+// CHECK: mov     x0, #305397760
+movz x0, #:abs_g1:twopart_before
+movz x0, #:abs_g1:twopart_after
+// CHECK: movk    x0, #37035, lsl #16
 // CHECK: movk    x0, #37035, lsl #16
-movk x0, #:abs_g1_nc:fourpart
+movk x0, #:abs_g1_nc:fourpart_before
+movk x0, #:abs_g1_nc:fourpart_after
 // CHECK: mov     x0, #4660
-movz x0, #:abs_g0:onepart
+// CHECK: mov     x0, #4660
+movz x0, #:abs_g0:onepart_before
+movz x0, #:abs_g0:onepart_after
+// CHECK: movk    x0, #52719
 // CHECK: movk    x0, #52719
-movk x0, #:abs_g0_nc:fourpart
+movk x0, #:abs_g0_nc:fourpart_before
+movk x0, #:abs_g0_nc:fourpart_after
 
-onepart = 0x1234
-twopart = 0x12345678
-threepart = 0x1234567890AB
-fourpart = 0x1234567890ABCDEF
+onepart_after = 0x1234
+twopart_after = 0x12345678
+threepart_after = 0x1234567890AB
+fourpart_after = 0x1234567890ABCDEF
Index: lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
===================================================================
--- lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -5424,10 +5424,16 @@
   // Check that it looks like a symbol + an addend
   MCValue Res;
   bool Relocatable = Expr->evaluateAsRelocatable(Res, nullptr, nullptr);
-  if (!Relocatable || !Res.getSymA() || Res.getSymB())
+  if (!Relocatable || Res.getSymB())
     return false;
 
-  DarwinRefKind = Res.getSymA()->getKind();
+  // Treat expressions with an ELFRefKind (like ":abs_g1:3", or
+  // ":abs_g1:x" where x is constant) as symbolic even if there is no symbol.
+  if (!Res.getSymA() && ELFRefKind == AArch64MCExpr::VK_INVALID)
+    return false;
+
+  if (Res.getSymA())
+    DarwinRefKind = Res.getSymA()->getKind();
   Addend = Res.getConstant();
 
   // It's some symbol reference + a constant addend, but really


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55906.178983.patch
Type: text/x-patch
Size: 2826 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181219/91fcba15/attachment.bin>


More information about the llvm-commits mailing list