# REQUIRES: x86
# RUN: rm -rf %t && split-file %s %t && cd %t
# RUN: llvm-mc -filetype=obj -triple=x86_64 -crel a.s -o a.o
# RUN: llvm-mc -filetype=obj -triple=x86_64 -crel b.s -o b.o
# RUN: ld.lld -r b.o a.o -o out
# RUN: llvm-readobj -r out | FileCheck %s --check-prefixes=CHECK,CRELFOO
# RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a1.o
# RUN: ld.lld -r b.o a1.o -o out1
# RUN: llvm-readobj -r out1 | FileCheck %s --check-prefixes=CHECK,RELAFOO
# RUN: ld.lld -r a1.o b.o -o out2
# RUN: llvm-readobj -r out2 | FileCheck %s --check-prefixes=CHECK2
# CHECK: Relocations [
# CHECK-NEXT: .crel.text {
# CHECK-NEXT: 0x1 R_X86_64_PLT32 fb 0xFFFFFFFFFFFFFFFC
# CHECK-NEXT: 0x9 R_X86_64_PLT32 foo 0xFFFFFFFFFFFFFFFC
# CHECK-NEXT: 0xE R_X86_64_PLT32 .text.foo 0xFFFFFFFFFFFFFFFC
# CHECK-NEXT: }
# CHECK-NEXT: .crel.rodata {
# CHECK-NEXT: 0x0 R_X86_64_PC32 foo 0x0
# CHECK-NEXT: 0xF R_X86_64_PC32 foo 0x3F
# CHECK-NEXT: 0x1F R_X86_64_PC64 foo 0x7F
# CHECK-NEXT: 0x27 R_X86_64_PC32 _start 0xFFFFFFFFFFFFE07F
# CHECK-COUNT-12: R_X86_64_32 _start 0x0
# CHECK-NEXT: }
# CRELFOO-NEXT: .crel.text.foo {
# RELAFOO-NEXT: .rela.text.foo {
# CHECK-NEXT: 0x3 R_X86_64_PC32 .L.str 0xFFFFFFFFFFFFFFFC
# CHECK-NEXT: 0xA R_X86_64_PC32 .L.str1 0xFFFFFFFFFFFFFFFC
# CHECK-NEXT: 0xF R_X86_64_PLT32 g 0xFFFFFFFFFFFFFFFC
# CHECK-NEXT: 0x14 R_X86_64_PLT32 g 0xFFFFFFFFFFFFFFFC
# CHECK-NEXT: }
# CRELFOO-NEXT: .crel.data {
# RELAFOO-NEXT: .rela.data {
# CHECK-NEXT: 0x8 R_X86_64_64 _start 0x8000000000000000
# CHECK-NEXT: 0x18 R_X86_64_64 _start 0xFFFFFFFFFFFFFFFF
# CHECK-NEXT: }
# CHECK-NEXT: ]
# CHECK2: Relocations [
# CHECK2-NEXT: .crel.text {
# CHECK2-NEXT: 0x1 R_X86_64_PLT32 foo 0xFFFFFFFFFFFFFFFC
# CHECK2-NEXT: 0x6 R_X86_64_PLT32 .text.foo 0xFFFFFFFFFFFFFFFC
# CHECK2-NEXT: 0xD R_X86_64_PLT32 fb 0xFFFFFFFFFFFFFFFC
# CHECK2-NEXT: }
# CHECK2-NEXT: .rela.text.foo {
# CHECK2-NEXT: 0x3 R_X86_64_PC32 .L.str 0xFFFFFFFFFFFFFFFC
# CHECK2-NEXT: 0xA R_X86_64_PC32 .L.str1 0xFFFFFFFFFFFFFFFC
# CHECK2-NEXT: 0xF R_X86_64_PLT32 g 0xFFFFFFFFFFFFFFFC
# CHECK2-NEXT: 0x14 R_X86_64_PLT32 g 0xFFFFFFFFFFFFFFFC
# CHECK2-NEXT: }
# CHECK2-NEXT: .rela.data {
# CHECK2-NEXT: 0x8 R_X86_64_64 _start 0x8000000000000000
# CHECK2-NEXT: 0x18 R_X86_64_64 _start 0xFFFFFFFFFFFFFFFF
# CHECK2-NEXT: }
# CHECK2-NEXT: .crel.rodata {
# CHECK2-NEXT: 0x0 R_X86_64_PC32 foo 0x0
# CHECK2-NEXT: 0xF R_X86_64_PC32 foo 0x3F
# CHECK2-NEXT: 0x1F R_X86_64_PC64 foo 0x7F
# CHECK2-NEXT: 0x27 R_X86_64_PC32 _start 0xFFFFFFFFFFFFE07F
# CHECK2-COUNT-12: R_X86_64_32 _start 0x0
# CHECK2-NEXT: }
# CHECK2-NEXT: ]
#--- a.s
.global _start, foo
_start:
call foo
call .text.foo
.section .text.foo,"ax"
foo:
leaq .L.str(%rip), %rsi
leaq .L.str1(%rip), %rsi
call g
call g
.section .rodata.str1.1,"aMS",@progbits,1
.L.str:
.asciz "abc"
.L.str1:
.asciz "def"
.data
.quad 0
.quad _start - 0x8000000000000000
.quad 0
.quad _start - 1
#--- b.s
.globl fb
fb:
call fb
.section .rodata,"a"
.long foo - .
.space 15-4
.long foo - . + 63 # offset+=15
.space 16-4
.quad foo - . + 127 # offset+=16
.long _start - . - 8065
## Ensure .crel.rodata contains 16 relocations so that getULEB128Size(crelHeader) > 1.
.rept 12
.long _start
.endr