Skip to content

Commit d2a9da6

Browse files
committed
Fix PR#6878: AArch64 conditional branches out of range. (Introduces new, generic branch relaxation module.)
git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16168 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
1 parent ef0c79a commit d2a9da6

File tree

10 files changed

+614
-141
lines changed

10 files changed

+614
-141
lines changed

.depend

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,8 @@ asmcomp/asmgen.cmi : bytecomp/lambda.cmi asmcomp/cmm.cmi
597597
asmcomp/asmlibrarian.cmi :
598598
asmcomp/asmlink.cmi : asmcomp/cmx_format.cmi
599599
asmcomp/asmpackager.cmi : typing/env.cmi
600+
asmcomp/branch_relaxation.cmi : asmcomp/linearize.cmi \
601+
asmcomp/branch_relaxation_intf.cmo
600602
asmcomp/clambda.cmi : bytecomp/lambda.cmi typing/ident.cmi \
601603
asmcomp/debuginfo.cmi parsing/asttypes.cmi
602604
asmcomp/closure.cmi : bytecomp/lambda.cmi asmcomp/clambda.cmi
@@ -686,6 +688,14 @@ asmcomp/asmpackager.cmx : typing/typemod.cmx bytecomp/translmod.cmx \
686688
utils/config.cmx asmcomp/compilenv.cmx asmcomp/cmx_format.cmi \
687689
utils/clflags.cmx utils/ccomp.cmx asmcomp/asmlink.cmx asmcomp/asmgen.cmx \
688690
asmcomp/asmpackager.cmi
691+
asmcomp/branch_relaxation_intf.cmo : asmcomp/linearize.cmi asmcomp/arch.cmo
692+
asmcomp/branch_relaxation_intf.cmx : asmcomp/linearize.cmx asmcomp/arch.cmx
693+
asmcomp/branch_relaxation.cmo : utils/misc.cmi asmcomp/mach.cmi \
694+
asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/branch_relaxation_intf.cmo \
695+
asmcomp/branch_relaxation.cmi
696+
asmcomp/branch_relaxation.cmx : utils/misc.cmx asmcomp/mach.cmx \
697+
asmcomp/linearize.cmx asmcomp/cmm.cmx asmcomp/branch_relaxation_intf.cmx \
698+
asmcomp/branch_relaxation.cmi
689699
asmcomp/clambda.cmo : bytecomp/lambda.cmi typing/ident.cmi \
690700
asmcomp/debuginfo.cmi parsing/asttypes.cmi asmcomp/clambda.cmi
691701
asmcomp/clambda.cmx : bytecomp/lambda.cmx typing/ident.cmx \
@@ -759,13 +769,13 @@ asmcomp/emitaux.cmx : asmcomp/linearize.cmx asmcomp/debuginfo.cmx \
759769
asmcomp/emit.cmo : asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \
760770
asmcomp/mach.cmi asmcomp/linearize.cmi bytecomp/lambda.cmi \
761771
asmcomp/emitaux.cmi asmcomp/debuginfo.cmi utils/config.cmi \
762-
asmcomp/compilenv.cmi asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo \
763-
asmcomp/emit.cmi
772+
asmcomp/compilenv.cmi asmcomp/cmm.cmi utils/clflags.cmi \
773+
asmcomp/branch_relaxation.cmi asmcomp/arch.cmo asmcomp/emit.cmi
764774
asmcomp/emit.cmx : asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \
765775
asmcomp/mach.cmx asmcomp/linearize.cmx bytecomp/lambda.cmx \
766776
asmcomp/emitaux.cmx asmcomp/debuginfo.cmx utils/config.cmx \
767-
asmcomp/compilenv.cmx asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx \
768-
asmcomp/emit.cmi
777+
asmcomp/compilenv.cmx asmcomp/cmm.cmx utils/clflags.cmx \
778+
asmcomp/branch_relaxation.cmx asmcomp/arch.cmx asmcomp/emit.cmi
769779
asmcomp/interf.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \
770780
asmcomp/interf.cmi
771781
asmcomp/interf.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \

Changes

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,9 @@ Bug fixes:
200200
- PR#6872: Type-directed propagation fails to disambiguate variants
201201
that are also exception constructors
202202
(Jacques Garrigue, report by Romain Beauxis)
203+
- PR#6878: AArch64 backend generates invalid asm: conditional branch
204+
out of range (Mark Shinwell, report by Richard Jones, testing by Richard
205+
Jones and Xavier Leroy, code review by Xavier Leroy and Thomas Refis)
203206
- PR#6879: Wrong optimization of 1 mod n
204207
(Mark Shinwell, report by Jean-Christophe Filliâtre)
205208
- PR#6884: The __CYGWIN32__ #define should be replaced with __CYGWIN__

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ ASMCOMP=asmcomp/arch.cmo asmcomp/debuginfo.cmo \
9494
asmcomp/deadcode.cmo \
9595
asmcomp/printlinear.cmo asmcomp/linearize.cmo \
9696
asmcomp/schedgen.cmo asmcomp/scheduling.cmo \
97+
asmcomp/branch_relaxation_intf.cmo \
98+
asmcomp/branch_relaxation.cmo \
9799
asmcomp/emitaux.cmo asmcomp/emit.cmo asmcomp/asmgen.cmo \
98100
asmcomp/asmlink.cmo asmcomp/asmlibrarian.cmo asmcomp/asmpackager.cmo \
99101
driver/opterrors.cmo driver/optcompile.cmo

asmcomp/amd64/emit.mlp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ open Mach
2020
open Linearize
2121
open Emitaux
2222

23+
(* [Branch_relaxation] is not used in this file, but is required by
24+
emit.mlp files for certain other targets; the reference here ensures
25+
that when releases are being prepared the .depend files are correct
26+
for all targets. *)
27+
open! Branch_relaxation
28+
2329
let macosx = (Config.system = "macosx")
2430
let mingw64 = (Config.system = "mingw64")
2531
let cygwin = (Config.system = "cygwin")

asmcomp/arm64/arch.ml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,12 @@ type addressing_mode =
3434
(* Specific operations *)
3535

3636
type specific_operation =
37+
| Ifar_alloc of int
38+
| Ifar_intop_checkbound
39+
| Ifar_intop_imm_checkbound of int
3740
| Ishiftarith of arith_operation * int
3841
| Ishiftcheckbound of int
42+
| Ifar_shiftcheckbound of int
3943
| Imuladd (* multiply and add *)
4044
| Imulsub (* multiply and subtract *)
4145
| Inegmulf (* floating-point negate and multiply *)
@@ -91,6 +95,12 @@ let print_addressing printreg addr ppf arg =
9195

9296
let print_specific_operation printreg op ppf arg =
9397
match op with
98+
| Ifar_alloc n ->
99+
fprintf ppf "(far) alloc %i" n
100+
| Ifar_intop_checkbound ->
101+
fprintf ppf "%a (far) check > %a" printreg arg.(0) printreg arg.(1)
102+
| Ifar_intop_imm_checkbound n ->
103+
fprintf ppf "%a (far) check > %i" printreg arg.(0) n
94104
| Ishiftarith(op, shift) ->
95105
let op_name = function
96106
| Ishiftadd -> "+"
@@ -103,6 +113,9 @@ let print_specific_operation printreg op ppf arg =
103113
printreg arg.(0) (op_name op) printreg arg.(1) shift_mark
104114
| Ishiftcheckbound n ->
105115
fprintf ppf "check %a >> %i > %a" printreg arg.(0) n printreg arg.(1)
116+
| Ifar_shiftcheckbound n ->
117+
fprintf ppf
118+
"(far) check %a >> %i > %a" printreg arg.(0) n printreg arg.(1)
106119
| Imuladd ->
107120
fprintf ppf "(%a * %a) + %a"
108121
printreg arg.(0)

0 commit comments

Comments
 (0)