Skip to content

Commit

Permalink
[MC] [AArch64] Correctly resolve ":abs_g1:3" etc.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Eli Friedman committed Dec 20, 2018
1 parent 4648209 commit 4839710
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 13 deletions.
10 changes: 8 additions & 2 deletions llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
Expand Up @@ -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
Expand Down
41 changes: 30 additions & 11 deletions llvm/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

0 comments on commit 4839710

Please sign in to comment.