# 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