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

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.

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

llvm-svn: 349800
This commit is contained in:
Eli Friedman 2018-12-20 19:46:14 +00:00
parent 4648209e16
commit 48397102d0
2 changed files with 45 additions and 20 deletions

View File

@ -5434,10 +5434,16 @@ AArch64AsmParser::classifySymbolRef(const MCExpr *Expr,
// 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

View File

@ -1,21 +1,40 @@
// RUN: llvm-mc -triple aarch64--none-eabi -filetype obj < %s -o - | llvm-objdump -d - | FileCheck %s
// CHECK: mov x0, #1311673391471656960
movz x0, #:abs_g3:fourpart
// CHECK: mov x0, #20014547599360
movz x0, #:abs_g2:threepart
// CHECK: movk x0, #22136, lsl #32
movk x0, #:abs_g2_nc:fourpart
// CHECK: mov x0, #305397760
movz x0, #:abs_g1:twopart
// CHECK: movk x0, #37035, lsl #16
movk x0, #:abs_g1_nc:fourpart
// CHECK: mov x0, #4660
movz x0, #:abs_g0:onepart
// CHECK: movk x0, #52719
movk x0, #:abs_g0_nc:fourpart
onepart_before = 0x1234
twopart_before = 0x12345678
threepart_before = 0x1234567890AB
fourpart_before = 0x1234567890ABCDEF
onepart = 0x1234
twopart = 0x12345678
threepart = 0x1234567890AB
fourpart = 0x1234567890ABCDEF
// CHECK: mov x0, #1311673391471656960
// CHECK: mov x0, #1311673391471656960
movz x0, #:abs_g3:fourpart_before
movz x0, #:abs_g3:fourpart_after
// CHECK: mov x0, #20014547599360
// 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_before
movk x0, #:abs_g2_nc:fourpart_after
// CHECK: mov x0, #305397760
// 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_before
movk x0, #:abs_g1_nc:fourpart_after
// CHECK: mov x0, #4660
// 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_before
movk x0, #:abs_g0_nc:fourpart_after
onepart_after = 0x1234
twopart_after = 0x12345678
threepart_after = 0x1234567890AB
fourpart_after = 0x1234567890ABCDEF