# REQUIRES: aarch64

# RUN: rm -rf %t && split-file %s %t && cd %t

# RUN: llvm-mc -filetype=obj -triple=aarch64 %p/Inputs/shared2.s -o a.o
# RUN: ld.lld -shared a.o -soname=so -o a.so
# RUN: llvm-mc -filetype=obj -triple=aarch64 main.s -o main.o

# RUN: ld.lld -pie main.o a.so -o main
# RUN: llvm-readobj -r main | FileCheck --check-prefix=UNPACKED %s

# UNPACKED:          Section ({{.+}}) .rela.dyn {
# UNPACKED-NEXT:       0x30470 R_AARCH64_AUTH_RELATIVE - 0x1
# UNPACKED-NEXT:       0x30478 R_AARCH64_AUTH_RELATIVE - 0x30472
# UNPACKED-NEXT:       0x30480 R_AARCH64_AUTH_RELATIVE - 0xFFFFFFFFFFFFFFFD
# UNPACKED-NEXT:       0x30488 R_AARCH64_AUTH_RELATIVE - 0x12345678
# UNPACKED-NEXT:       0x30490 R_AARCH64_AUTH_RELATIVE - 0x123456789A
# UNPACKED-NEXT:       0x30498 R_AARCH64_AUTH_RELATIVE - 0xFFFFFFEDCBA98766
# UNPACKED-NEXT:       0x304A0 R_AARCH64_AUTH_RELATIVE - 0x8003046F
# UNPACKED-NEXT:       0x304B9 R_AARCH64_AUTH_RELATIVE - 0x4
# UNPACKED-NEXT:       0x304C2 R_AARCH64_AUTH_RELATIVE - 0x30475
# UNPACKED-NEXT:       0x304A8 R_AARCH64_AUTH_ABS64 zed2 0x1111
# UNPACKED-NEXT:       0x304B0 R_AARCH64_AUTH_ABS64 bar2 0x0
# UNPACKED-NEXT:     }

# RUN: ld.lld main.o a.so -o main.nopie
# RUN: llvm-readobj -r main.nopie | FileCheck --check-prefix=NOPIE %s

# NOPIE:      Section ({{.+}}) .rela.dyn {
# NOPIE:        0x230460 R_AARCH64_AUTH_RELATIVE - 0x200001
# NOPIE-NEXT:   0x230468 R_AARCH64_AUTH_RELATIVE - 0x230462
# NOPIE-NEXT:   0x230470 R_AARCH64_AUTH_RELATIVE - 0x1FFFFD
# NOPIE-NEXT:   0x230478 R_AARCH64_AUTH_RELATIVE - 0x12545678
# NOPIE-NEXT:   0x230480 R_AARCH64_AUTH_RELATIVE - 0x123476789A
# NOPIE-NEXT:   0x230488 R_AARCH64_AUTH_RELATIVE - 0xFFFFFFEDCBC98766
# NOPIE-NEXT:   0x230490 R_AARCH64_AUTH_RELATIVE - 0x8023045F
# NOPIE-NEXT:   0x2304A9 R_AARCH64_AUTH_RELATIVE - 0x200004
# NOPIE-NEXT:   0x2304B2 R_AARCH64_AUTH_RELATIVE - 0x230465
# NOPIE-NEXT:   0x230498 R_AARCH64_AUTH_ABS64 zed2 0x1111
# NOPIE-NEXT:   0x2304A0 R_AARCH64_AUTH_ABS64 bar2 0x0
# NOPIE-NEXT: }

# RUN: ld.lld -pie -z pack-relative-relocs main.o a.so -o main.pie
# RUN: llvm-readelf -S -d -r -x .test main.pie | FileCheck --check-prefixes=RELR,HEX %s

# RELR:      Section Headers:
# RELR-NEXT: Name Type Address Off Size ES Flg Lk Inf Al
# RELR:      .rela.dyn RELA {{0*}}[[ADDR1:.+]] {{0*}}[[ADDR1]] 000090 18 A 1 0 8
# RELR:      .relr.auth.dyn AARCH64_AUTH_RELR {{0*}}[[ADDR2:.+]] {{0*}}[[ADDR2]] 000018 08 A 0 0 8

# RELR:      Dynamic section at offset {{.+}} contains 16 entries
# RELR:      0x0000000070000012 (AARCH64_AUTH_RELR) 0x[[ADDR2]]
# RELR-NEXT: 0x0000000070000011 (AARCH64_AUTH_RELRSZ) 24 (bytes)
# RELR-NEXT: 0x0000000070000013 (AARCH64_AUTH_RELRENT) 8 (bytes)

## Decoded SHT_RELR section is same as UNPACKED,
## but contains only the relative relocations.
## Any relative relocations with odd offset or value wider than 32 bits stay in SHT_RELA.

# RELR:      Relocation section '.rela.dyn' at offset 0x[[ADDR1]] contains 6 entries:
# RELR-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
# RELR-NEXT: 0000000000030460  0000000000000411 R_AARCH64_AUTH_RELATIVE           123456789a
# RELR-NEXT: 0000000000030468  0000000000000411 R_AARCH64_AUTH_RELATIVE           ffffffedcba98766
# RELR-NEXT: 0000000000030470  0000000000000411 R_AARCH64_AUTH_RELATIVE           8003043f
# RELR-NEXT: 0000000000030489  0000000000000411 R_AARCH64_AUTH_RELATIVE           4
# RELR-NEXT: 0000000000030478  0000000100000244 R_AARCH64_AUTH_ABS64   0000000000000000 zed2 + 1111
# RELR-NEXT: 0000000000030480  0000000200000244 R_AARCH64_AUTH_ABS64   0000000000000000 bar2 + 0
# RELR-EMPTY:
# RELR-NEXT: Relocation section '.relr.auth.dyn' at offset 0x[[ADDR2]] contains 5 entries:
# RELR-NEXT: Index: Entry Address Symbolic Address
# RELR-NEXT: 0000: 0000000000030440 0000000000030440 $d
# RELR-NEXT: 0001: 000000000000000f 0000000000030448 $d + 0x8
# RELR-NEXT:  0000000000030450 $d + 0x10
# RELR-NEXT:  0000000000030458 $d + 0x18
# RELR-NEXT: 0002: 0000000000030492 0000000000030492 $d + 0x52

# HEX:      Hex dump of section '.test':
# HEX-NEXT: 0x00030440 01000000 2a000020 42040300 2b000000
##                     ^^^^^^^^ Implicit val = 1 = __ehdr_start + 1
##                              ^^^^ Discr = 42
##                                    ^^ Key (bits 5..6) = DA
##                                       ^^^^^^^^ Implicit val = 0x30442 = 0x30440 + 2 = .test + 2
##                                                ^^^^ Discr = 43
##                                                      ^^ Key (bits 5..6) = IA
# HEX-NEXT: 0x00030450 fdffffff 2c000080 78563412 2d000020
##                     ^^^^^^^^ Implicit val = -3 = __ehdr_start - 3
##                              ^^^^ Discr = 44
##                                    ^^ Key (bits 5..6) = IA
##                                    ^^ Addr diversity (bit 7) = true
##                                       ^^^^^^^^ Implicit val = 0x12345678 = __ehdr_start + 0x12345678
##                                                ^^^^ Discr = 45
##                                                      ^^ Key (bits 5..6) = DA
# HEX-NEXT: 0x00030460 00000000 2e000020 00000000 2f000020
##                     ^^^^^^^^ No implicit val (rela reloc due val wider than 32 bits)
##                              ^^^^ Discr = 46
##                                    ^^ Key (bits 5..6) = DA
##                                       ^^^^^^^^ No implicit val (rela reloc due to val wider than 32 bits)
##                                                ^^^^ Discr = 47
##                                                      ^^ Key (bits 5..6) = DA
# HEX-NEXT: 0x00030470 00000000 30000020 00000000 31000020
##                     ^^^^^^^^ No implicit val (rela reloc due val wider than 32 bits)
##                              ^^^^ Discr = 48
##                                    ^^ Key (bits 5..6) = DA
##                                       ^^^^^^^^ No implicit val (rela reloc due to a preemptible symbol)
##                                                ^^^^ Discr = 49
##                                                      ^^ Key (bits 5..6) = DA
# HEX-NEXT: 0x00030480 00000000 32000000 77000000 00330000
##                     ^^^^^^^^ No implicit val (rela reloc due to a preemptible symbol)
##                              ^^^^ Discr = 50
##                                    ^^ Key (bits 5..6) = IA
##                                         ^^^^^^ ^^ No implicit val (rela reloc due to odd offset)
##                                                  ^^^^ Discr = 51
# HEX-NEXT: 0x00030490 20774504 03003400 0020{{\ }}
##                     ^^ Key (bits 5..6) = DA
##                         ^^^^ ^^^^ Implicit val = 0x30445 = 0x30440 + 5 = .test + 5
##                                  ^^^^ Discr = 52
##                                         ^^ Key (bits 5..6) = DA

#--- main.s

.section .test, "aw"
.p2align 3
.quad (__ehdr_start + 1)@AUTH(da,42)
.quad (.test + 2)@AUTH(ia,43)
.quad (__ehdr_start - 3)@AUTH(ia,44,addr)
.quad (__ehdr_start + 0x12345678)@AUTH(da,45)
## Addend wider than 32 bits, not enough room for storing implicitly, would go to rela
.quad (__ehdr_start + 0x123456789A)@AUTH(da,46)
## Negative addend wider than 32 bits, not enough room for storing implicitly, would go to rela
.quad (__ehdr_start - 0x123456789A)@AUTH(da,47)
## INT32_MAX plus non-zero .test is wider than 32 bits, not enough room for storing implicitly, would go to rela
.quad (.test + 0x7FFFFFFF)@AUTH(da,48)
.quad (zed2 + 0x1111)@AUTH(da,49)
.quad bar2@AUTH(ia,50)
.byte 0x77
.quad (__ehdr_start + 4)@AUTH(da,51)
.byte 0x77
.quad (.test + 5)@AUTH(da,52)

#--- empty-relr.s

## .relr.auth.dyn relocations that do not fit 32 bits are moved to .rela.dyn.
## In this case .relr.auth.dyn will be made empty, but
## removeUnusedSyntheticSections fails to remove the section.

# RUN: llvm-mc -filetype=obj -triple=aarch64 empty-relr.s -o empty-relr.o
# RUN: ld.lld -pie -z pack-relative-relocs empty-relr.o -o empty-relr
# RUN: llvm-readelf -S -d -r empty-relr | FileCheck --check-prefixes=EMPTY-RELR %s

# EMPTY-RELR:      Section Headers:
# EMPTY-RELR-NEXT: Name Type Address Off Size ES Flg Lk Inf Al
# EMPTY-RELR:      .rela.dyn RELA {{0*}}[[ADDR1:.+]] {{0*}}[[ADDR1]] 000018 18 A 0 0 8
# EMPTY-RELR:      .relr.auth.dyn AARCH64_AUTH_RELR {{0*}}[[ADDR2:.+]] {{0*}}[[ADDR2]] 000000 08 A 0 0 8

# EMPTY-RELR:      Dynamic section at offset {{.+}} contains 12 entries
# EMPTY-RELR-NOT:  (AARCH64_AUTH_RELR)
# EMPTY-RELR-NOT:  (AARCH64_AUTH_RELRSZ)
# EMPTY-RELR-NOT:  (AARCH64_AUTH_RELRENT)
# EMPTY-RELR:      0x0000000000000007 (RELA) 0x[[ADDR1]]
# EMPTY-RELR-NEXT: 0x0000000000000008 (RELASZ) 24 (bytes)
# EMPTY-RELR-NEXT: 0x0000000000000009 (RELAENT) 24 (bytes)

# EMPTY-RELR:      Relocation section '.rela.dyn' at offset {{.+}} contains 1 entries:
# EMPTY-RELR-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
# EMPTY-RELR-NEXT: 0000000000030320  0000000000000411 R_AARCH64_AUTH_RELATIVE           8003031f
# EMPTY-RELR-EMPTY:
# EMPTY-RELR-NEXT: Relocation section '.relr.auth.dyn' at offset {{.+}} contains 0 entries:
# EMPTY-RELR-NEXT: Index: Entry Address Symbolic Address

.section .test, "aw"
.p2align 3
.quad (.test + 0x7FFFFFFF)@AUTH(da,42)

#--- empty-rela.s

## .relr.auth.dyn relocations that do not fit 32 bits are moved to .rela.dyn.
## If this scenario does not happen, .rela.dyn will remain empty,
## but removeUnusedSyntheticSections fails to remove the section.

# RUN: llvm-mc -filetype=obj -triple=aarch64 empty-rela.s -o empty-rela.o
# RUN: ld.lld -pie -z pack-relative-relocs empty-rela.o -o empty-rela
# RUN: llvm-readelf -S -d -r empty-rela | FileCheck --check-prefixes=EMPTY-RELA %s
# RUN: ld.lld -r -z pack-relative-relocs empty-rela.o -o empty-rela.ro
# RUN: llvm-readelf -S empty-rela.ro | FileCheck --check-prefixes=EMPTY-RELA-RO %s

# EMPTY-RELA:      Section Headers:
# EMPTY-RELA-NEXT: Name Type Address Off Size ES Flg Lk Inf Al
# EMPTY-RELA:      .rela.dyn RELA {{0*}}[[ADDR1:.+]] {{0*}}[[ADDR1]] 000000 18 A 0 0 8
# EMPTY-RELA:      .relr.auth.dyn AARCH64_AUTH_RELR {{0*}}[[ADDR2:.+]] {{0*}}[[ADDR2]] 000008 08 A 0 0 8

# EMPTY-RELA:      Dynamic section at offset {{.+}} contains 12 entries
# EMPTY-RELA-NOT:  (RELR)
# EMPTY-RELA-NOT:  (RELRSZ)
# EMPTY-RELA-NOT:  (RELRENT)
# EMPTY-RELA:      0x0000000070000012 (AARCH64_AUTH_RELR) 0x[[ADDR2]]
# EMPTY-RELA-NEXT: 0x0000000070000011 (AARCH64_AUTH_RELRSZ) 8 (bytes)
# EMPTY-RELA-NEXT: 0x0000000070000013 (AARCH64_AUTH_RELRENT) 8 (bytes)

# EMPTY-RELA:      Relocation section '.rela.dyn' at offset {{.+}} contains 0 entries:
# EMPTY-RELA-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name
# EMPTY-RELA-EMPTY:
# EMPTY-RELA-NEXT: Relocation section '.relr.auth.dyn' at offset {{.+}} contains 1 entries:
# EMPTY-RELA-NEXT: Index: Entry Address Symbolic Address
# EMPTY-RELA-NEXT: 0000: 0000000000030310 0000000000030310 $d

# EMPTY-RELA-RO-NOT: .rela.dyn

.section .test, "aw"
.p2align 3
.quad (.test + 0x12345678)@AUTH(da,42)
