Skip to content

Commit ff41ae8

Browse files
committed
MC: AArch64: Add support for gotpage_lo15
It is not used bt LLVM itself, but it would be used on lld tests to implement R_AARCH64_LD64_GOTPAGE_LO15 support.
1 parent bc9ab9a commit ff41ae8

File tree

5 files changed

+22
-2
lines changed

5 files changed

+22
-2
lines changed

llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,8 @@ class AArch64Operand : public MCParsedAsmOperand {
750750
ELFRefKind == AArch64MCExpr::VK_GOTTPREL_LO12_NC ||
751751
ELFRefKind == AArch64MCExpr::VK_TLSDESC_LO12 ||
752752
ELFRefKind == AArch64MCExpr::VK_SECREL_LO12 ||
753-
ELFRefKind == AArch64MCExpr::VK_SECREL_HI12) {
753+
ELFRefKind == AArch64MCExpr::VK_SECREL_HI12 ||
754+
ELFRefKind == AArch64MCExpr::VK_GOT_PAGE_LO15) {
754755
// Note that we don't range-check the addend. It's adjusted modulo page
755756
// size when converted, so there is no "out of range" condition when using
756757
// @pageoff.
@@ -2569,6 +2570,7 @@ AArch64AsmParser::tryParseAdrpLabel(OperandVector &Operands) {
25692570
DarwinRefKind != MCSymbolRefExpr::VK_TLVPPAGE &&
25702571
ELFRefKind != AArch64MCExpr::VK_ABS_PAGE_NC &&
25712572
ELFRefKind != AArch64MCExpr::VK_GOT_PAGE &&
2573+
ELFRefKind != AArch64MCExpr::VK_GOT_PAGE_LO15 &&
25722574
ELFRefKind != AArch64MCExpr::VK_GOTTPREL_PAGE &&
25732575
ELFRefKind != AArch64MCExpr::VK_TLSDESC_PAGE) {
25742576
// The operand must be an @page or @gotpage qualified symbolref.
@@ -3436,6 +3438,7 @@ bool AArch64AsmParser::parseSymbolicImmVal(const MCExpr *&ImmVal) {
34363438
.Case("tprel_lo12_nc", AArch64MCExpr::VK_TPREL_LO12_NC)
34373439
.Case("tlsdesc_lo12", AArch64MCExpr::VK_TLSDESC_LO12)
34383440
.Case("got", AArch64MCExpr::VK_GOT_PAGE)
3441+
.Case("gotpage_lo15", AArch64MCExpr::VK_GOT_PAGE_LO15)
34393442
.Case("got_lo12", AArch64MCExpr::VK_GOT_LO12)
34403443
.Case("gottprel", AArch64MCExpr::VK_GOTTPREL_PAGE)
34413444
.Case("gottprel_lo12", AArch64MCExpr::VK_GOTTPREL_LO12_NC)

llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,11 @@ unsigned AArch64ELFObjectWriter::getRelocType(MCContext &Ctx,
322322
if (SymLoc == AArch64MCExpr::VK_ABS && IsNC)
323323
return R_CLS(LDST64_ABS_LO12_NC);
324324
if (SymLoc == AArch64MCExpr::VK_GOT && IsNC) {
325+
AArch64MCExpr::VariantKind AddressLoc =
326+
AArch64MCExpr::getAddressFrag(RefKind);
325327
if (!IsILP32) {
328+
if (AddressLoc == AArch64MCExpr::VK_LO15)
329+
return ELF::R_AARCH64_LD64_GOTPAGE_LO15;
326330
return ELF::R_AARCH64_LD64_GOT_LO12_NC;
327331
} else {
328332
Ctx.reportError(Fixup.getLoc(), "ILP32 64-bit load/store "

llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ StringRef AArch64MCExpr::getVariantKindName() const {
7070
case VK_ABS_PAGE_NC: return ":pg_hi21_nc:";
7171
case VK_GOT: return ":got:";
7272
case VK_GOT_PAGE: return ":got:";
73+
case VK_GOT_PAGE_LO15: return ":gotpage_lo15:";
7374
case VK_GOT_LO12: return ":got_lo12:";
7475
case VK_GOTTPREL: return ":gottprel:";
7576
case VK_GOTTPREL_PAGE: return ":gottprel:";

llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class AArch64MCExpr : public MCTargetExpr {
4646
VK_G1 = 0x050,
4747
VK_G2 = 0x060,
4848
VK_G3 = 0x070,
49+
VK_LO15 = 0x080,
4950
VK_AddressFragBits = 0x0f0,
5051

5152
// Whether the final relocation is a checked one (where a linker should
@@ -82,6 +83,7 @@ class AArch64MCExpr : public MCTargetExpr {
8283
VK_PREL_G0_NC = VK_PREL | VK_G0 | VK_NC,
8384
VK_GOT_LO12 = VK_GOT | VK_PAGEOFF | VK_NC,
8485
VK_GOT_PAGE = VK_GOT | VK_PAGE,
86+
VK_GOT_PAGE_LO15 = VK_GOT | VK_LO15 | VK_NC,
8587
VK_DTPREL_G2 = VK_DTPREL | VK_G2,
8688
VK_DTPREL_G1 = VK_DTPREL | VK_G1,
8789
VK_DTPREL_G1_NC = VK_DTPREL | VK_G1 | VK_NC,

llvm/test/MC/AArch64/arm64-elf-relocs.s

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,16 @@ trickQuestion:
245245
// CHECK-OBJ-LP64: R_AARCH64_LD64_GOT_LO12_NC sym
246246
// CHECK-OBJ-LP64: R_AARCH64_LD64_GOT_LO12_NC sym+0x7
247247

248+
ldr x24, [x23, #:gotpage_lo15:sym]
249+
ldr d22, [x21, :gotpage_lo15:sym]
250+
ldr d22, [x23, :gotpage_lo15:sym+7]
251+
// CHECK: ldr x24, [x23, :gotpage_lo15:sym]
252+
// CHECK: ldr d22, [x21, :gotpage_lo15:sym]
253+
// CHECK: ldr d22, [x23, :gotpage_lo15:sym+7]
254+
// CHECK-OBJ-LP64: R_AARCH64_LD64_GOTPAGE_LO15 sym{{$}}
255+
// CHECK-OBJ-LP64: R_AARCH64_LD64_GOTPAGE_LO15 sym{{$}}
256+
// CHECK-OBJ-LP64: R_AARCH64_LD64_GOTPAGE_LO15 sym+0x7
257+
248258
ldr x24, [x23, :dtprel_lo12_nc:sym]
249259
ldr d22, [x21, #:dtprel_lo12:sym]
250260
// CHECK: ldr x24, [x23, :dtprel_lo12_nc:sym]
@@ -305,4 +315,4 @@ trickQuestion:
305315
// CHECK: ldr x24, :got:sym
306316
// CHECK: ldr d22, :got:sym
307317
// CHECK-OBJ-LP64: R_AARCH64_GOT_LD_PREL19 sym
308-
// CHECK-OBJ-LP64: R_AARCH64_GOT_LD_PREL19 sym
318+
// CHECK-OBJ-LP64: R_AARCH64_GOT_LD_PREL19 sym

0 commit comments

Comments
 (0)