188 lines
7.2 KiB
ArmAsm
188 lines
7.2 KiB
ArmAsm
|
# REQUIRES: riscv
|
||
|
# RUN: rm -rf %t && split-file %s %t && cd %t
|
||
|
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax a.s -o a.o
|
||
|
# RUN: llvm-readobj -r -x .gcc_except_table -x .debug_rnglists -x .debug_loclists a.o | FileCheck %s --check-prefix=REL
|
||
|
# RUN: ld.lld -shared --gc-sections --noinhibit-exec a.o -o a.so
|
||
|
# RUN: llvm-readelf -x .gcc_except_table -x .debug_rnglists -x .debug_loclists a.so | FileCheck %s
|
||
|
|
||
|
# REL: .rela.debug_rnglists {
|
||
|
# REL-NEXT: 0x0 R_RISCV_SET_ULEB128 w1 0x82
|
||
|
# REL-NEXT: 0x0 R_RISCV_SUB_ULEB128 w2 0xFFFFFFFFFFFFFFFF
|
||
|
# REL-NEXT: 0x1 R_RISCV_SET_ULEB128 w2 0x78
|
||
|
# REL-NEXT: 0x1 R_RISCV_SUB_ULEB128 w1 0x0
|
||
|
# REL-NEXT: 0x3 R_RISCV_SET_ULEB128 w1 0x89
|
||
|
# REL-NEXT: 0x3 R_RISCV_SUB_ULEB128 w2 0x0
|
||
|
# REL-NEXT: 0x5 R_RISCV_SET_ULEB128 w2 0x3FF8
|
||
|
# REL-NEXT: 0x5 R_RISCV_SUB_ULEB128 w1 0x0
|
||
|
# REL-NEXT: 0x8 R_RISCV_SET_ULEB128 w1 0x4009
|
||
|
# REL-NEXT: 0x8 R_RISCV_SUB_ULEB128 w2 0x0
|
||
|
# REL-NEXT: 0xB R_RISCV_SET_ULEB128 w2 0x1FFFF8
|
||
|
# REL-NEXT: 0xB R_RISCV_SUB_ULEB128 w1 0x0
|
||
|
# REL-NEXT: 0xF R_RISCV_SET_ULEB128 w1 0x200009
|
||
|
# REL-NEXT: 0xF R_RISCV_SUB_ULEB128 w2 0x0
|
||
|
# REL-NEXT: }
|
||
|
# REL: .rela.debug_loclists {
|
||
|
# REL-NEXT: 0x0 R_RISCV_SET_ULEB128 w2 0x3
|
||
|
# REL-NEXT: 0x0 R_RISCV_SUB_ULEB128 w1 0x4
|
||
|
# REL-NEXT: 0x1 R_RISCV_SET_ULEB128 x2 0x0
|
||
|
# REL-NEXT: 0x1 R_RISCV_SUB_ULEB128 x1 0x0
|
||
|
# REL-NEXT: }
|
||
|
|
||
|
# REL: Hex dump of section '.gcc_except_table':
|
||
|
# REL-NEXT: 0x00000000 7b800181 01808001 81800180 80800181 {
|
||
|
# REL-NEXT: 0x00000010 808001 .
|
||
|
# REL: Hex dump of section '.debug_rnglists':
|
||
|
# REL-NEXT: 0x00000000 7b800181 01808001 81800180 80800181 {
|
||
|
# REL-NEXT: 0x00000010 808001 .
|
||
|
# REL: Hex dump of section '.debug_loclists':
|
||
|
# REL-NEXT: 0x00000000 0008 .
|
||
|
|
||
|
# CHECK: Hex dump of section '.gcc_except_table':
|
||
|
# CHECK-NEXT: 0x[[#%x,]] 7ffc0085 01fcff00 858001fc ffff0085 .
|
||
|
# CHECK-NEXT: 0x[[#%x,]] 808001 .
|
||
|
# CHECK: Hex dump of section '.debug_rnglists':
|
||
|
# CHECK-NEXT: 0x00000000 7ffc0085 01fcff00 858001fc ffff0085 .
|
||
|
# CHECK-NEXT: 0x00000010 808001 .
|
||
|
# CHECK: Hex dump of section '.debug_loclists':
|
||
|
# CHECK-NEXT: 0x00000000 0300 .
|
||
|
|
||
|
# RUN: ld.lld -shared --gc-sections -z dead-reloc-in-nonalloc=.debug_loclists=0x7f a.o -o a127.so
|
||
|
# RUN: llvm-readelf -x .debug_loclists a127.so | FileCheck %s --check-prefix=CHECK127
|
||
|
# CHECK127: Hex dump of section '.debug_loclists':
|
||
|
# CHECK127-NEXT: 0x00000000 037f .
|
||
|
|
||
|
# RUN: not ld.lld -shared --gc-sections -z dead-reloc-in-nonalloc=.debug_loclists=0x80 a.o 2>&1 | FileCheck %s --check-prefix=CHECK128
|
||
|
# CHECK128: error: a.o:(.debug_loclists+0x1): ULEB128 value 128 exceeds available space; references 'x2'
|
||
|
|
||
|
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax sub.s -o sub.o
|
||
|
# RUN: not ld.lld -shared sub.o 2>&1 | FileCheck %s --check-prefix=SUB
|
||
|
# SUB: error: sub.o:(.debug_rnglists+0x8): has non-ABS relocation R_RISCV_SUB_ULEB128 against symbol 'w2'
|
||
|
|
||
|
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax unpaired1.s -o unpaired1.o
|
||
|
# RUN: not ld.lld -shared --threads=1 unpaired1.o 2>&1 | FileCheck %s --check-prefix=UNPAIRED
|
||
|
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax unpaired2.s -o unpaired2.o
|
||
|
# RUN: not ld.lld -shared --threads=1 unpaired2.o 2>&1 | FileCheck %s --check-prefix=UNPAIRED
|
||
|
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax unpaired3.s -o unpaired3.o
|
||
|
# RUN: not ld.lld -shared --threads=1 unpaired3.o 2>&1 | FileCheck %s --check-prefix=UNPAIRED
|
||
|
# UNPAIRED: error: {{.*}}.o:(.alloc+0x8): R_RISCV_SET_ULEB128 not paired with R_RISCV_SUB_SET128
|
||
|
# UNPAIRED: error: {{.*}}.o:(.debug_rnglists+0x8): R_RISCV_SET_ULEB128 not paired with R_RISCV_SUB_SET128
|
||
|
|
||
|
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax overflow.s -o overflow.o
|
||
|
# RUN: not ld.lld -shared --threads=1 overflow.o 2>&1 | FileCheck %s --check-prefix=OVERFLOW
|
||
|
# OVERFLOW: error: overflow.o:(.alloc+0x8): ULEB128 value 128 exceeds available space; references 'w2'
|
||
|
# OVERFLOW: error: overflow.o:(.debug_rnglists+0x8): ULEB128 value 128 exceeds available space; references 'w2'
|
||
|
|
||
|
# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax preemptable.s -o preemptable.o
|
||
|
# RUN: not ld.lld -shared --threads=1 preemptable.o 2>&1 | FileCheck %s --check-prefix=PREEMPTABLE --implicit-check-not=error:
|
||
|
# PREEMPTABLE: error: relocation R_RISCV_SET_ULEB128 cannot be used against symbol 'w2'; recompile with -fPIC
|
||
|
# PREEMPTABLE: error: relocation R_RISCV_SUB_ULEB128 cannot be used against symbol 'w1'; recompile with -fPIC
|
||
|
|
||
|
#--- a.s
|
||
|
.cfi_startproc
|
||
|
.cfi_lsda 0x1b,.LLSDA0
|
||
|
.cfi_endproc
|
||
|
|
||
|
.section .text.w,"axR"
|
||
|
w1:
|
||
|
call foo # 4 bytes after relaxation
|
||
|
w2:
|
||
|
|
||
|
.section .text.x,"ax"
|
||
|
x1:
|
||
|
call foo # 4 bytes after relaxation
|
||
|
x2:
|
||
|
|
||
|
.section .gcc_except_table,"a"
|
||
|
.LLSDA0:
|
||
|
.reloc ., R_RISCV_SET_ULEB128, w1+130
|
||
|
.reloc ., R_RISCV_SUB_ULEB128, w2-1 # non-zero addend for SUB
|
||
|
.byte 0x7b
|
||
|
.uleb128 w2-w1+120 # initial value: 0x0180
|
||
|
.uleb128 w1-w2+137 # initial value: 0x0181
|
||
|
.uleb128 w2-w1+16376 # initial value: 0x018080
|
||
|
.uleb128 w1-w2+16393 # initial value: 0x018081
|
||
|
.uleb128 w2-w1+2097144 # initial value: 0x01808080
|
||
|
.uleb128 w1-w2+2097161 # initial value: 0x01808081
|
||
|
|
||
|
.section .debug_rnglists
|
||
|
.reloc ., R_RISCV_SET_ULEB128, w1+130
|
||
|
.reloc ., R_RISCV_SUB_ULEB128, w2-1 # non-zero addend for SUB
|
||
|
.byte 0x7b
|
||
|
.uleb128 w2-w1+120 # initial value: 0x0180
|
||
|
.uleb128 w1-w2+137 # initial value: 0x0181
|
||
|
.uleb128 w2-w1+16376 # initial value: 0x018080
|
||
|
.uleb128 w1-w2+16393 # initial value: 0x018081
|
||
|
.uleb128 w2-w1+2097144 # initial value: 0x01808080
|
||
|
.uleb128 w1-w2+2097161 # initial value: 0x01808081
|
||
|
|
||
|
.section .debug_loclists
|
||
|
.reloc ., R_RISCV_SET_ULEB128, w2+3
|
||
|
.reloc ., R_RISCV_SUB_ULEB128, w1+4 # SUB with a non-zero addend
|
||
|
.byte 0
|
||
|
.uleb128 x2-x1 # references discarded symbols
|
||
|
|
||
|
#--- sub.s
|
||
|
w1: call foo; w2:
|
||
|
.section .debug_rnglists
|
||
|
.quad 0;
|
||
|
.reloc ., R_RISCV_SUB_ULEB128, w2+120
|
||
|
.byte 0x7f
|
||
|
|
||
|
#--- unpaired1.s
|
||
|
w1: call foo; w2:
|
||
|
.section .alloc,"a"
|
||
|
.quad 0
|
||
|
.reloc ., R_RISCV_SET_ULEB128, w2+120
|
||
|
.byte 0x7f
|
||
|
.section .debug_rnglists
|
||
|
.quad 0;
|
||
|
.reloc ., R_RISCV_SET_ULEB128, w2+120
|
||
|
.byte 0x7f
|
||
|
|
||
|
#--- unpaired2.s
|
||
|
w1: call foo; w2:
|
||
|
.section .alloc,"a"
|
||
|
.quad 0
|
||
|
.reloc ., R_RISCV_SET_ULEB128, w2+120
|
||
|
.reloc .+1, R_RISCV_SUB_ULEB128, w1
|
||
|
.byte 0x7f
|
||
|
.section .debug_rnglists
|
||
|
.quad 0
|
||
|
.reloc ., R_RISCV_SET_ULEB128, w2+120
|
||
|
.reloc .+1, R_RISCV_SUB_ULEB128, w1
|
||
|
.byte 0x7f
|
||
|
|
||
|
#--- unpaired3.s
|
||
|
w1: call foo; w2:
|
||
|
.section .alloc,"a"
|
||
|
.quad 0
|
||
|
.reloc ., R_RISCV_SET_ULEB128, w2+120
|
||
|
.reloc ., R_RISCV_SUB64, w1
|
||
|
.byte 0x7f
|
||
|
.section .debug_rnglists
|
||
|
.quad 0
|
||
|
.reloc ., R_RISCV_SET_ULEB128, w2+120
|
||
|
.reloc ., R_RISCV_SUB64, w1
|
||
|
.byte 0x7f
|
||
|
|
||
|
#--- overflow.s
|
||
|
w1: call foo; w2:
|
||
|
.section .alloc,"a"
|
||
|
.quad 0
|
||
|
.reloc ., R_RISCV_SET_ULEB128, w2+124
|
||
|
.reloc ., R_RISCV_SUB_ULEB128, w1
|
||
|
.byte 0x7f
|
||
|
.section .debug_rnglists
|
||
|
.quad 0
|
||
|
.reloc ., R_RISCV_SET_ULEB128, w2+124
|
||
|
.reloc ., R_RISCV_SUB_ULEB128, w1
|
||
|
.byte 0x7f
|
||
|
|
||
|
#--- preemptable.s
|
||
|
.globl w1, w2
|
||
|
w1: call foo; w2:
|
||
|
.section .alloc,"a"
|
||
|
.uleb128 w2-w1
|
||
|
.section .debug_rnglists
|
||
|
.uleb128 w2-w1
|