diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp index b0e2c81fc7900..b4c5cde5fd888 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp @@ -206,7 +206,10 @@ unsigned AArch64ELFObjectWriter::getRelocType(MCContext &Ctx, case FK_Data_2: return R_CLS(ABS16); case FK_Data_4: - return R_CLS(ABS32); + return (!IsILP32 && + Target.getAccessVariant() == MCSymbolRefExpr::VK_GOTPCREL) + ? ELF::R_AARCH64_GOTPCREL32 + : R_CLS(ABS32); case FK_Data_8: { bool IsAuth = (RefKind == AArch64MCExpr::VK_AUTH || RefKind == AArch64MCExpr::VK_AUTHADDR); diff --git a/llvm/test/MC/AArch64/elf-reloc-gotpcrel32.s b/llvm/test/MC/AArch64/elf-reloc-gotpcrel32.s index 4115717fc1a57..afbcaad9e1dfd 100644 --- a/llvm/test/MC/AArch64/elf-reloc-gotpcrel32.s +++ b/llvm/test/MC/AArch64/elf-reloc-gotpcrel32.s @@ -1,5 +1,3 @@ -// XFAIL: !rdar135050296 - // RUN: llvm-mc -triple=aarch64 -filetype=obj %s -o - | \ // RUN: llvm-readobj -r - | FileCheck %s