summaryrefslogtreecommitdiff
path: root/backend/Cminor.v
diff options
context:
space:
mode:
authorGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2008-05-30 14:28:57 +0000
committerGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2008-05-30 14:28:57 +0000
commit72c5d592af9c9c0b417becc6abe5c2364d81639a (patch)
tree96b5b896605b31ab6ddab385b33fda87a8a40d8a /backend/Cminor.v
parentf4b41226d60ca57c5981b0a46e0a495152b5301f (diff)
Revu les comparaisons de pointeurs: == et <> sont definis entre 2 pointeurs vers des blocs differents!
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@649 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'backend/Cminor.v')
-rw-r--r--backend/Cminor.v16
1 files changed, 9 insertions, 7 deletions
diff --git a/backend/Cminor.v b/backend/Cminor.v
index c1e3bd1..f2eb84f 100644
--- a/backend/Cminor.v
+++ b/backend/Cminor.v
@@ -246,10 +246,8 @@ Definition eval_unop (op: unary_operation) (arg: val) : option val :=
| _, _ => None
end.
-Definition eval_compare_null (c: comparison) (n: int) : option val :=
- if Int.eq n Int.zero
- then match c with Ceq => Some Vfalse | Cne => Some Vtrue | _ => None end
- else None.
+Definition eval_compare_mismatch (c: comparison) : option val :=
+ match c with Ceq => Some Vfalse | Cne => Some Vtrue | _ => None end.
Definition eval_binop
(op: binary_operation) (arg1 arg2: val) (m: mem): option val :=
@@ -288,11 +286,15 @@ Definition eval_binop
| Ocmp c, Vptr b1 n1, Vptr b2 n2 =>
if valid_pointer m b1 (Int.signed n1)
&& valid_pointer m b2 (Int.signed n2) then
- if eq_block b1 b2 then Some(Val.of_bool(Int.cmp c n1 n2)) else None
+ if eq_block b1 b2
+ then Some(Val.of_bool(Int.cmp c n1 n2))
+ else eval_compare_mismatch c
else
None
- | Ocmp c, Vptr b1 n1, Vint n2 => eval_compare_null c n2
- | Ocmp c, Vint n1, Vptr b2 n2 => eval_compare_null c n1
+ | Ocmp c, Vptr b1 n1, Vint n2 =>
+ if Int.eq n2 Int.zero then eval_compare_mismatch c else None
+ | Ocmp c, Vint n1, Vptr b2 n2 =>
+ if Int.eq n1 Int.zero then eval_compare_mismatch c else None
| Ocmpu c, Vint n1, Vint n2 =>
Some (Val.of_bool(Int.cmpu c n1 n2))
| Ocmpf c, Vfloat f1, Vfloat f2 =>