# REQUIRES: ppc
# RUN: echo 'SECTIONS { \
# RUN:   .text_start 0x10010300 : { *(.text_start) } \
# RUN:   }' > %t.script

# RUN: llvm-mc -filetype=obj -triple=powerpc64le %s --defsym T1=1 -o %t1.o
# RUN: llvm-mc -filetype=obj -triple=powerpc64le %s --defsym T2=1 -o %t2.o
# RUN: llvm-mc -filetype=obj -triple=powerpc64le %s --defsym T3=1 -o %t3.o
# RUN: ld.lld --shared %t1.o -o %t1.so
# RUN: ld.lld -T %t.script %t1.so %t2.o -o %t2
# RUN: ld.lld -T %t.script %t1.so %t3.o -o %t3
# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t2 | FileCheck %s --check-prefix=T2
# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t3 | FileCheck %s --check-prefix=T3

# RUN: llvm-mc -filetype=obj -triple=powerpc64 %s --defsym T1=1 -o %t1.o
# RUN: llvm-mc -filetype=obj -triple=powerpc64 %s --defsym T2=1 -o %t2.o
# RUN: llvm-mc -filetype=obj -triple=powerpc64 %s --defsym T3=1 -o %t3.o
# RUN: ld.lld --shared %t1.o -o %t1.so
# RUN: ld.lld -T %t.script %t1.so %t2.o -o %t2
# RUN: ld.lld -T %t.script %t1.so %t3.o -o %t3
# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t2 | FileCheck %s --check-prefix=T2
# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t3 | FileCheck %s --check-prefix=T3

.ifdef T1
.globl callee
callee:
  blr
.endif

# T2-LABEL: <p9codegen>:
# T2-NEXT:    10010300: addis 2, 12, 1
# T2-NEXT:    10010304: addi 2, 2, -32384
# T2-NEXT:    10010308: addis 4, 2, -1
# T2-NEXT:    1001030c: lwa 3, 32428(4)
# T2-NEXT:    10010310: bl 0x10010330
# T2-NEXT:    10010314: ld 2, 24(1)
# T2-NEXT:    10010318: blr

# T2-LABEL: <p10codegen>:
# T2-NEXT:    1001031c: plwa 3, 16(0), 1
# T2-NEXT:    10010324: bl 0x10010350
# T2-NEXT:    10010328: blr

# T2-LABEL: <__plt_callee>:
# T2-NEXT:    10010330: std 2, 24(1)
# T2-NEXT:    10010334: addis 12, 2, 0
# T2-NEXT:    10010338: ld 12, -32744(12)
# T2-NEXT:    1001033c: mtctr 12
# T2-NEXT:    10010340: bctr

# T2-LABEL: <__plt_pcrel_callee>:
# T2-NEXT:    10010350: pld 12, 328(0), 1
# T2-NEXT:    10010358: mtctr 12
# T2-NEXT:    1001035c: bctr
.ifdef T2
.section .text_start, "ax", %progbits
p9codegen:
.Lfunc_gep0:
  addis 2, 12, .TOC.-.Lfunc_gep0@ha
  addi 2, 2, .TOC.-.Lfunc_gep0@l
.Lfunc_lep0:
  .localentry	p9codegen, .Lfunc_lep0-.Lfunc_gep0
  addis 4, 2, Global@toc@ha
  lwa 3, Global@toc@l(4)
  bl callee
  nop
  blr
p10codegen:
  .localentry	main, 1
  plwa 3, Global@PCREL(0), 1
  bl callee@notoc
  blr
.globl Global
Global:
  .long	10
  .size	Global, 4
.endif

# T3-LABEL: <p10codegen>:
# T3-NEXT:    10010300: plwa 3, 44(0), 1
# T3-NEXT:    10010308: bl 0x10010330
# T3-NEXT:    1001030c: blr

# T3-LABEL: <p9codegen>:
# T3-NEXT:    10010310: addis 2, 12, 1
# T3-NEXT:    10010314: addi 2, 2, -32408
# T3-NEXT:    10010318: addis 4, 2, -1
# T3-NEXT:    1001031c: lwa 3, 32436(4)
# T3-NEXT:    10010320: bl 0x10010340
# T3-NEXT:    10010324: ld 2, 24(1)
# T3-NEXT:    10010328: blr

# T3-LABEL: <__plt_pcrel_callee>:
# T3-NEXT:    10010330: pld 12, 352(0), 1
# T3-NEXT:    10010338: mtctr 12
# T3-NEXT:    1001033c: bctr

# T3-LABEL: <__plt_callee>:
# T3-NEXT:    10010340: std 2, 24(1)
# T3-NEXT:    10010344: addis 12, 2, 0
# T3-NEXT:    10010348: ld 12, -32744(12)
# T3-NEXT:    1001034c: mtctr 12
# T3-NEXT:    10010350: bctr
.ifdef T3
.section .text_start, "ax", %progbits
p10codegen:
  .localentry   main, 1
  plwa 3, Global@PCREL(0), 1
  bl callee@notoc
  blr
p9codegen:
.Lfunc_gep0:
  addis 2, 12, .TOC.-.Lfunc_gep0@ha
  addi 2, 2, .TOC.-.Lfunc_gep0@l
.Lfunc_lep0:
  .localentry   p9codegen, .Lfunc_lep0-.Lfunc_gep0
  addis 4, 2, Global@toc@ha
  lwa 3, Global@toc@l(4)
  bl callee
  nop
  blr
.globl Global
Global:
  .long 10
  .size Global, 4
.endif
