diff options
author | Bernhard Schommer <bernhardschommer@gmail.com> | 2015-10-23 11:06:11 +0200 |
---|---|---|
committer | Bernhard Schommer <bernhardschommer@gmail.com> | 2015-10-23 11:06:11 +0200 |
commit | 1cb3d93ff278ebbd0c6967c5f9401a97f9b618b4 (patch) | |
tree | ebfbcdf2a931b82393f11d5cf538c76170678e3b | |
parent | 5111bce03766251ffde8cd3d29a315c3c7c64364 (diff) | |
download | compcert-1cb3d93ff278ebbd0c6967c5f9401a97f9b618b4.tar.gz compcert-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.
-rw-r--r-- | powerpc/Asmexpand.ml | 6 |
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)) |