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 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