aboutsummaryrefslogtreecommitdiffstats
path: root/powerpc/Asmexpand.ml
diff options
context:
space:
mode:
authorBernhard Schommer <bernhardschommer@gmail.com>2015-10-23 11:06:11 +0200
committerBernhard Schommer <bernhardschommer@gmail.com>2015-10-23 11:06:11 +0200
commit1cb3d93ff278ebbd0c6967c5f9401a97f9b618b4 (patch)
treeebfbcdf2a931b82393f11d5cf538c76170678e3b /powerpc/Asmexpand.ml
parent5111bce03766251ffde8cd3d29a315c3c7c64364 (diff)
downloadcompcert-kvx-1cb3d93ff278ebbd0c6967c5f9401a97f9b618b4.tar.gz
compcert-kvx-1cb3d93ff278ebbd0c6967c5f9401a97f9b618b4.zip
Added special treatment for large stack size for ppc.
Since the stacksize is casted to signed int in the alloc frame function large stacksize lead to assembler containing overflows. Bug 17473.
Diffstat (limited to 'powerpc/Asmexpand.ml')
-rw-r--r--powerpc/Asmexpand.ml6
1 files changed, 3 insertions, 3 deletions
diff --git a/powerpc/Asmexpand.ml b/powerpc/Asmexpand.ml
index 161d12b7..35aa02d5 100644
--- a/powerpc/Asmexpand.ml
+++ b/powerpc/Asmexpand.ml
@@ -484,7 +484,7 @@ let expand_builtin_inline name args res =
| "__builtin_call_frame", _,BR (IR res) ->
let sz = !current_function_stacksize
and ofs = !linkregister_offset in
- if sz < 0x8000l then
+ if sz < 0x8000l && sz >= 0l then
emit (Paddi(res, GPR1, Cint(coqint_of_camlint sz)))
else
emit (Plwz(res, Cint ofs, GPR1))
@@ -594,7 +594,7 @@ let expand_instruction instr =
assert (ofs = _0);
let sz = if variadic then Int32.add sz 96l else sz in
let adj = Int32.neg sz in
- if adj >= -0x8000l then
+ if adj >= -0x8000l && adj < 0l then
emit (Pstwu(GPR1, Cint(coqint_of_camlint adj), GPR1))
else begin
emit_loadimm GPR0 (coqint_of_camlint adj);
@@ -617,7 +617,7 @@ let expand_instruction instr =
let variadic = (!current_function).fn_sig.sig_cc.cc_vararg in
let sz = camlint_of_coqint sz in
let sz = if variadic then Int32.add sz 96l else sz in
- if sz < 0x8000l then
+ if sz < 0x8000l && sz >= 0l then
emit (Paddi(GPR1, GPR1, Cint(coqint_of_camlint sz)))
else
emit (Plwz(GPR1, Cint ofs, GPR1))