Browse Source
This fixes some EH failures for the medany code model in the g++ testsuite. The problem is that the assembler is computing some values in the eh_frame section as constants, that instead should have had relocs to be resolved by the linker. This happens in output_cfi_insn in the DW_CFA_advance_loc case where it compares label frags and immediately simplifies if they are the same. We can fix that by forcing a new frag after every instruction that the linker can reduce in size. I've also added a testcase to verify the fix. This was tested with binutils make check, and gcc/g++ make checks on qemu for medlow and medany code models. gas/ * config/tc-riscv.c (append_insn): Call frag_wane and frag_new at end for linker optimizable relocs. * testsuite/gas/riscv/eh-relocs.d: New. * testsuite/gas/riscv/eh-relocs.s: New. * testsuite/gas/riscv/riscv.exp: Run eh-relocs test.gdb-8.1-branch
committed by
Palmer Dabbelt
5 changed files with 47 additions and 0 deletions
@ -0,0 +1,12 @@ |
|||
#as: |
|||
#objdump: --section=.eh_frame -r |
|||
|
|||
.*:[ ]+file format .* |
|||
|
|||
RELOCATION RECORDS FOR .* |
|||
.* |
|||
0+1c R_RISCV_32_PCREL.* |
|||
0+20 R_RISCV_ADD32.* |
|||
0+20 R_RISCV_SUB32.* |
|||
0+25 R_RISCV_SET6.* |
|||
0+25 R_RISCV_SUB6.* |
|||
@ -0,0 +1,11 @@ |
|||
.text |
|||
.align 2 |
|||
.globl _func1 |
|||
.type _func1, @function |
|||
_func1: |
|||
.cfi_startproc |
|||
lla a1,_func2 |
|||
add sp,sp,-16 |
|||
.cfi_def_cfa_offset 16 |
|||
.cfi_endproc |
|||
.size _func1, .-_func1 |
|||
Loading…
Reference in new issue