diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp --- a/llvm/lib/MC/MCExpr.cpp +++ b/llvm/lib/MC/MCExpr.cpp @@ -435,6 +435,7 @@ .Case("got@tlsld@l", VK_PPC_GOT_TLSLD_LO) .Case("got@tlsld@h", VK_PPC_GOT_TLSLD_HI) .Case("got@tlsld@ha", VK_PPC_GOT_TLSLD_HA) + .Case("got@pcrel", VK_PPC_GOT_PCREL) .Case("notoc", VK_PPC_NOTOC) .Case("gdgot", VK_Hexagon_GD_GOT) .Case("gdplt", VK_Hexagon_GD_PLT) diff --git a/llvm/test/MC/PowerPC/future-reloc.s b/llvm/test/MC/PowerPC/future-reloc.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/PowerPC/future-reloc.s @@ -0,0 +1,53 @@ +# RUN: llvm-mc -triple=powerpc64le-unknown-unknown -filetype=obj %s 2>&1 | \ +# RUN: FileCheck %s -check-prefix=MC +# RUN: llvm-mc -triple=powerpc64le-unknown-unknown -filetype=obj %s | \ +# RUN: llvm-readobj -r | FileCheck %s -check-prefix=READOBJ + +# This test checks that on Power PC we can correctly convert @pcrel and +# @got@pcrel into R_PPC64_PCREL34 and R_PPC64_GOT_PCREL34. + +# MC-NOT: error: invalid variant + +# READOBJ: 0x0 R_PPC64_PCREL34 locvalue 0x0 +# READOBJ-NEXT: 0x20 R_PPC64_GOT_PCREL34 evalue 0x0 + + .text + .abiversion 2 + .globl local # -- Begin function local + .p2align 4 + .type local,@function +local: # @local +.Llocal$local: +.Lfunc_begin0: +# %bb.0: # %entry + plwa 3, locvalue@PCREL(0), 1 + blr + .long 0 + .quad 0 +.Lfunc_end0: + .size local, .Lfunc_end0-.Lfunc_begin0 + # -- End function + .globl external # -- Begin function external + .p2align 4 + .type external,@function +external: # @external +.Lexternal$local: +.Lfunc_begin1: +# %bb.0: # %entry + pld 3, evalue@got@pcrel(0), 1 + lwa 3, 0(3) + blr + .long 0 + .quad 0 +.Lfunc_end1: + .size external, .Lfunc_end1-.Lfunc_begin1 + # -- End function + .type locvalue,@object # @locvalue + .section .bss,"aw",@nobits + .globl locvalue + .p2align 2 +locvalue: +.Llocvalue$local: + .long 0 # 0x0 + .size locvalue, 4 +