|
| 1 | +## Linker relaxation imposes restrictions on .eh_frame/.debug_frame, .debug_line, |
| 2 | +## and LEB128 uses. |
| 3 | + |
| 4 | +## CFI instructions can be preceded by relaxable instructions. We must use |
| 5 | +## DW_CFA_advance_loc* opcodes with relocations. |
| 6 | + |
| 7 | +## For .debug_line, emit DW_LNS_fixed_advance_pc with ADD16/SUB16 relocations so |
| 8 | +## that .debug_line can be fixed by the linker. Without linker relaxation, we can |
| 9 | +## emit special opcodes to make .debug_line smaller, but we don't do this for |
| 10 | +## consistency. |
| 11 | + |
| 12 | +# RUN: llvm-mc -filetype=obj -triple=riscv64 -g -dwarf-version=5 -mattr=+relax < %s -o %t |
| 13 | +# RUN: llvm-dwarfdump -eh-frame -debug-line -debug-rnglists -v %t | FileCheck %s |
| 14 | +# RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=RELOC |
| 15 | + |
| 16 | +# CHECK: FDE |
| 17 | +# CHECK-NEXT: Format: DWARF32 |
| 18 | +# CHECK-NEXT: DW_CFA_advance_loc: 16 |
| 19 | +# CHECK-NEXT: DW_CFA_def_cfa_offset: +32 |
| 20 | +# CHECK-NEXT: DW_CFA_advance_loc: 4 |
| 21 | +# CHECK-NEXT: DW_CFA_offset: X1 -8 |
| 22 | +# CHECK-NEXT: DW_CFA_nop: |
| 23 | + |
| 24 | +# CHECK: DW_LNE_set_address |
| 25 | +# CHECK-NEXT: DW_LNS_advance_line ([[#]]) |
| 26 | +# CHECK-NEXT: DW_LNS_copy |
| 27 | +# CHECK-NEXT: is_stmt |
| 28 | +# CHECK-NEXT: DW_LNS_advance_line |
| 29 | +# CHECK-NEXT: DW_LNS_fixed_advance_pc (0x0004) |
| 30 | +# CHECK-NEXT: DW_LNS_copy |
| 31 | +# CHECK-NEXT: is_stmt |
| 32 | +# CHECK-NEXT: DW_LNS_advance_line |
| 33 | +# CHECK-NEXT: DW_LNS_fixed_advance_pc (0x0004) |
| 34 | +# CHECK-NEXT: DW_LNS_copy |
| 35 | + |
| 36 | +# CHECK: 0x00000000: range list header: length = 0x0000001d, format = DWARF32, version = 0x0005 |
| 37 | +# CHECK-NEXT: ranges: |
| 38 | +# CHECK-NEXT: 0x0000000c: [DW_RLE_start_length]: 0x0000000000000000, 0x0000000000000034 |
| 39 | +# CHECK-NEXT: 0x00000016: [DW_RLE_start_length]: 0x0000000000000000, 0x0000000000000004 |
| 40 | +# CHECK-NEXT: 0x00000020: [DW_RLE_end_of_list ] |
| 41 | + |
| 42 | +# RELOC: Section ([[#]]) .rela.eh_frame { |
| 43 | +# RELOC-NEXT: 0x1C R_RISCV_32_PCREL - 0x0 |
| 44 | +# RELOC-NEXT: 0x20 R_RISCV_ADD32 - 0x0 |
| 45 | +# RELOC-NEXT: 0x20 R_RISCV_SUB32 - 0x0 |
| 46 | +# RELOC-NEXT: 0x25 R_RISCV_SET6 - 0x0 |
| 47 | +# RELOC-NEXT: 0x25 R_RISCV_SUB6 - 0x0 |
| 48 | +# RELOC-NEXT: 0x28 R_RISCV_SET6 - 0x0 |
| 49 | +# RELOC-NEXT: 0x28 R_RISCV_SUB6 - 0x0 |
| 50 | +# RELOC-NEXT: 0x34 R_RISCV_32_PCREL - 0x0 |
| 51 | +# RELOC-NEXT: 0x38 R_RISCV_ADD32 - 0x0 |
| 52 | +# RELOC-NEXT: 0x38 R_RISCV_SUB32 - 0x0 |
| 53 | +# RELOC-NEXT: } |
| 54 | + |
| 55 | +## TODO A section needs two relocations. |
| 56 | +# RELOC: Section ([[#]]) .rela.debug_rnglists { |
| 57 | +# RELOC-NEXT: 0xD R_RISCV_64 .text.foo 0x0 |
| 58 | +# RELOC-NEXT: 0x17 R_RISCV_64 .text.bar 0x0 |
| 59 | +# RELOC-NEXT: } |
| 60 | + |
| 61 | +# RELOC: Section ([[#]]) .rela.debug_line { |
| 62 | +# RELOC: R_RISCV_ADD16 - 0x0 |
| 63 | +# RELOC-NEXT: R_RISCV_SUB16 - 0x0 |
| 64 | +# RELOC-NEXT: R_RISCV_ADD16 - 0x0 |
| 65 | +# RELOC-NEXT: R_RISCV_SUB16 - 0x0 |
| 66 | +# RELOC-NEXT: R_RISCV_ADD16 - 0x0 |
| 67 | +# RELOC-NEXT: R_RISCV_SUB16 - 0x0 |
| 68 | +# RELOC: } |
| 69 | + |
| 70 | +.section .text.foo,"ax" |
| 71 | +.globl foo |
| 72 | +foo: |
| 73 | +.cfi_startproc |
| 74 | +.Lpcrel_hi0: |
| 75 | + auipc a1, %pcrel_hi(g) |
| 76 | + lw a1, %pcrel_lo(.Lpcrel_hi0)(a1) |
| 77 | + bge a1, a0, .LBB0_2 |
| 78 | + addi sp, sp, -32 |
| 79 | + .cfi_def_cfa_offset 32 |
| 80 | + sd ra, 24(sp) |
| 81 | + .cfi_offset ra, -8 |
| 82 | + addi a0, sp, 8 |
| 83 | + call ext@plt |
| 84 | + ld ra, 24(sp) |
| 85 | + addi sp, sp, 32 |
| 86 | + ret |
| 87 | +.LBB0_2: |
| 88 | + li a0, 0 |
| 89 | + ret |
| 90 | + .cfi_endproc |
| 91 | + .size foo, .-foo |
| 92 | + |
| 93 | +.section .text.bar,"ax" |
| 94 | +bar: |
| 95 | +.cfi_startproc |
| 96 | + nop |
| 97 | +.cfi_endproc |
0 commit comments