diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp @@ -412,8 +412,11 @@ const auto &Desc = Info->get(Inst.getOpcode()); for (unsigned i = 0, e = Inst.getNumOperands(); i != e; i++) { if (Desc.OpInfo[i].OperandType == MCOI::OPERAND_PCREL) { - int64_t Imm = Inst.getOperand(i).getImm() * 4; - Target = Addr + Imm; + int64_t Imm = Inst.getOperand(i).getImm(); + if (Inst.getOpcode() == AArch64::ADRP) + Target = (Addr & -4096) + Imm * 4096; + else + Target = Addr + Imm * 4; return true; } } diff --git a/llvm/test/tools/llvm-objdump/ELF/AArch64/pcrel-address.yaml b/llvm/test/tools/llvm-objdump/ELF/AArch64/pcrel-address.yaml --- a/llvm/test/tools/llvm-objdump/ELF/AArch64/pcrel-address.yaml +++ b/llvm/test/tools/llvm-objdump/ELF/AArch64/pcrel-address.yaml @@ -2,7 +2,8 @@ # RUN: llvm-objdump %t -d --no-show-raw-insn --no-leading-addr | FileCheck %s # CHECK-LABEL: <_start>: -# CHECK-NEXT: adrp x2, 0x220000 <_start+0x80> +# CHECK-NEXT: adrp x2, 0x220000 +# CHECK-NEXT: adrp x2, 0x201000 <_start+0xf00> --- !ELF FileHeader: @@ -15,7 +16,7 @@ Type: SHT_PROGBITS Address: 0x200100 Flags: [SHF_ALLOC, SHF_EXECINSTR] - Content: '02010090' + Content: '02010090020000B0' - Name: .data Type: SHT_PROGBITS Flags: [SHF_ALLOC, SHF_WRITE]