diff options
author | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2022-06-24 18:55:21 +0200 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2022-06-24 19:22:27 +0200 |
commit | a34adc8e005447e7fa44ca3b71db35ceb7facb4c (patch) | |
tree | d1c7308d30254d39694877fceaccb8a168a2660a | |
parent | 44a668fbd81a587a17b680bebecf016519915a69 (diff) | |
download | compcert-a34adc8e005447e7fa44ca3b71db35ceb7facb4c.tar.gz compcert-a34adc8e005447e7fa44ca3b71db35ceb7facb4c.zip |
Expand "j_s symb" to "jump symb, x31" assembly pseudo-instruction
As suggested by Léo Gourdin in #437.
The previous expansion as a plain "j" instruction fails when the jump
offset is too large to be represented (issue #436).
Fixes: #436
Closes: #437
-rw-r--r-- | Changelog | 4 | ||||
-rw-r--r-- | riscV/Asm.v | 2 | ||||
-rw-r--r-- | riscV/Asmgenproof.v | 1 | ||||
-rw-r--r-- | riscV/TargetPrinter.ml | 4 |
4 files changed, 6 insertions, 5 deletions
@@ -18,7 +18,7 @@ Usability: trigger only if parameters were declared.) - Check (and warn if requested) for arguments of struct/union types passed to a variable-argument function. - + Bug fixes: - RISC-V: fixed an error in the modeling of float32 <-> float64 conversions when the argument is a NaN (#428). @@ -29,6 +29,8 @@ Bug fixes: in correct but different allocations.) - Hardened the configure script against Cygwin installations that produce \r\n for end-of-lines (#434). +- RISC-V: tail calls to far-away functions were causing link-time errors + (#436, #437). Coq development: - Updated the Flocq library to version 4.1. diff --git a/riscV/Asm.v b/riscV/Asm.v index a47573a2..cbe3476a 100644 --- a/riscV/Asm.v +++ b/riscV/Asm.v @@ -751,7 +751,7 @@ Definition exec_instr (f: function) (i: instruction) (rs: regset) (m: mem) : out | Pj_l l => goto_label f l rs m | Pj_s s sg => - Next (rs#PC <- (Genv.symbol_address ge s Ptrofs.zero)) m + Next (rs#PC <- (Genv.symbol_address ge s Ptrofs.zero) #X31 <- Vundef) m | Pj_r r sg => Next (rs#PC <- (rs#r)) m | Pjal_s s sg => diff --git a/riscV/Asmgenproof.v b/riscV/Asmgenproof.v index 798dad9f..0d3c8042 100644 --- a/riscV/Asmgenproof.v +++ b/riscV/Asmgenproof.v @@ -816,6 +816,7 @@ Local Transparent destroyed_by_op. (* match states *) econstructor; eauto. apply agree_set_other; auto with asmgen. + apply agree_set_other; auto with asmgen. Simpl. unfold Genv.symbol_address. rewrite symbols_preserved. rewrite H. auto. - (* Mbuiltin *) diff --git a/riscV/TargetPrinter.ml b/riscV/TargetPrinter.ml index d8137f84..366dc02e 100644 --- a/riscV/TargetPrinter.ml +++ b/riscV/TargetPrinter.ml @@ -315,12 +315,10 @@ module Target : TARGET = fprintf oc " sra %a, %a, %a\n" ireg rd ireg0 rs1 ireg0 rs2 (* Unconditional jumps. Links are always to X1/RA. *) - (* TODO: fix up arguments for calls to variadics, to move *) - (* floating point arguments to integer registers. How? *) | Pj_l(l) -> fprintf oc " j %a\n" print_label l | Pj_s(s, sg) -> - fprintf oc " j %a\n" symbol s + fprintf oc " jump %a, x31\n" symbol s | Pj_r(r, sg) -> fprintf oc " jr %a\n" ireg r | Pjal_s(s, sg) -> |