forked from OSchip/llvm-project
[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:
parent
4648209e16
commit
48397102d0
|
@ -5434,9 +5434,15 @@ AArch64AsmParser::classifySymbolRef(const MCExpr *Expr,
|
||||||
// Check that it looks like a symbol + an addend
|
// Check that it looks like a symbol + an addend
|
||||||
MCValue Res;
|
MCValue Res;
|
||||||
bool Relocatable = Expr->evaluateAsRelocatable(Res, nullptr, nullptr);
|
bool Relocatable = Expr->evaluateAsRelocatable(Res, nullptr, nullptr);
|
||||||
if (!Relocatable || !Res.getSymA() || Res.getSymB())
|
if (!Relocatable || Res.getSymB())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// 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();
|
DarwinRefKind = Res.getSymA()->getKind();
|
||||||
Addend = Res.getConstant();
|
Addend = Res.getConstant();
|
||||||
|
|
||||||
|
|
|
@ -1,21 +1,40 @@
|
||||||
// RUN: llvm-mc -triple aarch64--none-eabi -filetype obj < %s -o - | llvm-objdump -d - | FileCheck %s
|
// RUN: llvm-mc -triple aarch64--none-eabi -filetype obj < %s -o - | llvm-objdump -d - | FileCheck %s
|
||||||
|
|
||||||
// CHECK: mov x0, #1311673391471656960
|
onepart_before = 0x1234
|
||||||
movz x0, #:abs_g3:fourpart
|
twopart_before = 0x12345678
|
||||||
// CHECK: mov x0, #20014547599360
|
threepart_before = 0x1234567890AB
|
||||||
movz x0, #:abs_g2:threepart
|
fourpart_before = 0x1234567890ABCDEF
|
||||||
// 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 = 0x1234
|
// CHECK: mov x0, #1311673391471656960
|
||||||
twopart = 0x12345678
|
// CHECK: mov x0, #1311673391471656960
|
||||||
threepart = 0x1234567890AB
|
movz x0, #:abs_g3:fourpart_before
|
||||||
fourpart = 0x1234567890ABCDEF
|
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
|
||||||
|
|
Loading…
Reference in New Issue