[Tinyos-devel] cc2420 radio stack and deputy
David Gay
dgay42 at gmail.com
Mon Jun 23 11:52:28 PDT 2008
On Fri, Jun 20, 2008 at 5:06 PM, David Gay <dgay42 at gmail.com> wrote:
> On Fri, Jun 20, 2008 at 4:01 PM, David Gay <dgay42 at gmail.com> wrote:
>> Now I just need to figure out why a safe base station is unhappy...
>
> Ok, found the problem: Deputy doesn't support gcc's enum extension
> that allows long (or longer) enum constants. John/Yang, can you add
> the following patch to our collection of Deputy patches? (I'll
> incorporate a cleaner/more complete version of this patch in CIL at a
> later date, probably when we merge the other patches - this one is a
> quick hack):
The patch needs a little further elaboration (hopefully this is final
- the new bit is the second change in cabs2cil.ml):
Index: src/cil.mli
===================================================================
--- src/cil.mli (revision 10132)
+++ src/cil.mli (working copy)
@@ -1612,6 +1612,11 @@
Otherwise, return None. *)
val isInteger: exp -> int64 option
+(** If the given expression is a (possibly cast'ed)
+ character or an integer constant, return that integer's kind.
+ Otherwise, return None. *)
+val isIntegerKind: exp -> ikind option
+
(** Convert a 64-bit int to an OCaml int, or raise an exception if that
can't be done. *)
val i64_to_int: int64 -> int
Index: src/frontc/cabs2cil.ml
===================================================================
--- src/frontc/cabs2cil.ml (revision 10132)
+++ src/frontc/cabs2cil.ml (working copy)
@@ -2376,9 +2376,10 @@
| (kname, e, cloc) :: rest ->
(* constant-eval 'e' to determine tag value *)
let e' = getIntConstExp e in
+ let c' = constFold true e' in
let e' =
- match isInteger (constFold true e') with
- Some i -> if !lowerConstants then kinteger64 IInt i else e'
+ match (isInteger c', isIntegerKind c') with
+ (Some i, Some ik) -> if !lowerConstants then
kinteger64 ik i else e'
| _ -> E.s (error "Constant initializer %a not an
integer" d_exp e')
in
processName kname e' (convLoc cloc) rest
@@ -3144,7 +3145,7 @@
finishExp empty (Lval(var vi)) vi.vtype
| EnvEnum (tag, typ), _ ->
if !Cil.lowerConstants then
- finishExp empty tag typ
+ finishExp empty tag (typeOf tag)
else begin
let ei =
match unrollType typ with
Index: src/cil.ml
===================================================================
--- src/cil.ml (revision 10132)
+++ src/cil.ml (working copy)
@@ -1223,6 +1223,13 @@
| CastE(_, e) -> isInteger e
| _ -> None
+let rec isIntegerKind : exp -> ikind option = function
+ | Const(CInt64 (_,k,_)) -> Some k
+ | Const(CChr c) -> Some IInt
+ | Const(CEnum(v, s, ei)) -> isIntegerKind v
+ | CastE(_, e) -> isIntegerKind e
+ | _ -> None
+
(** Convert a 64-bit int to an OCaml int, or raise an exception if that
can't be done. *)
More information about the Tinyos-devel
mailing list