Commit 460e1534 authored by Virgile Prevosto's avatar Virgile Prevosto

Merge branch 'feature/cil/field-order' into 'master'

[Cil] add a field forder in fieldinfo

See merge request frama-c/frama-c!2923
parents cd9f960d 56a347e3
......@@ -5385,8 +5385,14 @@ and makeCompType ghost (isstruct: bool)
(* Create the self cell for use in fields and forward references. Or maybe
* one exists already from a forward reference *)
let comp, _ = createCompInfo isstruct n' norig in
let doFieldGroup ~is_first_group ~is_last_group ((s: A.spec_elem list),
(nl: (A.name * A.expression option) list)) =
let rec fold f acc = function
| [] -> acc
| [x] -> f ~last:true acc x
| x :: l -> fold f (f ~last:false acc x) l
in
let addFieldGroup ~last:last_group (flds : fieldinfo list)
((s: A.spec_elem list), (nl: (A.name * A.expression option) list)) =
(* Do the specifiers exactly once *)
let sugg = match nl with
| [] -> ""
......@@ -5394,13 +5400,13 @@ and makeCompType ghost (isstruct: bool)
in
let bt, sto, inl, attrs = doSpecList ghost sugg s in
(* Do the fields *)
let makeFieldInfo ~is_first_field ~is_last_field
let addFieldInfo ~last:last_field (flds : fieldinfo list)
(((n,ndt,a,cloc) : A.name), (widtho : A.expression option))
: fieldinfo =
: fieldinfo list =
if sto <> NoStorage || inl then
Kernel.error ~once:true ~current:true "Storage or inline not allowed for fields";
let allowZeroSizeArrays = true in
let ftype, nattr =
let ftype, fattr =
doType
~allowZeroSizeArrays ghost false (AttrName false) bt
(A.PARENTYPE(attrs, ndt, a))
......@@ -5420,11 +5426,11 @@ and makeCompType ghost (isstruct: bool)
else if not (Cil.isCompleteType ~allowZeroSizeArrays ftype)
then begin
match Cil.unrollType ftype with
| TArray(_,None,_,_) when is_last_field ->
| TArray(_,None,_,_) when last_group && last_field ->
begin
(* possible flexible array member; check if struct contains at least
one other field *)
if is_first_field then (* struct is empty *)
if flds = [] then (* struct is empty *)
Kernel.error ~current:true
"flexible array member '%s' (type %a) \
not allowed in otherwise empty struct"
......@@ -5436,7 +5442,7 @@ and makeCompType ghost (isstruct: bool)
"field `%s' is declared with incomplete type %a"
n Cil_printer.pp_typ ftype
end;
let width, ftype =
let fbitfield, ftype =
match widtho with
| None -> None, ftype
| Some w -> begin
......@@ -5459,9 +5465,14 @@ and makeCompType ghost (isstruct: bool)
w, ftype
end
in
(* Compute the order of the field in the structure *)
let forder = match flds with
| [] -> 0
| { forder=previous_order } :: _ -> previous_order + 1
in
(* If the field is unnamed and its type is a structure of union type
* then give it a distinguished name *)
let n' =
let fname =
if n = missingFieldName then begin
match unrollType ftype with
| TComp _ -> begin
......@@ -5494,51 +5505,33 @@ and makeCompType ghost (isstruct: bool)
in
is_circular ftype;
{ fcomp = comp;
forder;
forig_name = n;
fname = n';
ftype = ftype;
fbitfield = width;
fattr = nattr;
fname;
ftype;
fbitfield;
fattr;
floc = convLoc cloc;
faddrof = false;
fsize_in_bits = None;
foffset_in_bits = None;
fpadding_in_bits = None;
}
} :: flds
in
let rec map_but_last l =
match l with
| [] -> []
| [f] ->
[makeFieldInfo ~is_first_field:false ~is_last_field:is_last_group f]
| f::l ->
let fi = makeFieldInfo ~is_first_field:false ~is_last_field:false f in
[fi] @ map_but_last l
in
match nl with
| [] -> []
| [f] ->
[makeFieldInfo ~is_first_field:is_first_group ~is_last_field:is_last_group f]
| f::l ->
let fi =
makeFieldInfo ~is_first_field:is_first_group ~is_last_field:false f
in
[fi] @ map_but_last l
fold addFieldInfo flds nl
in
(* Do regular fields first. *)
let flds =
List.filter (function FIELD _ -> true | TYPE_ANNOT _ -> false) nglist in
let flds =
List.map (function FIELD (f,g) -> (f,g) | _ -> assert false) flds in
let last = List.length flds - 1 in
let doField i = doFieldGroup ~is_first_group:(i=0) ~is_last_group:(i=last) in
let flds = List.concat (List.mapi doField flds) in
let fld_table = Cil_datatype.Fieldinfo.Hashtbl.create 17 in
let to_field = function
| TYPE_ANNOT _ -> None
| FIELD (f,g) -> Some (f,g) in
let flds = Extlib.filter_map_opt to_field nglist in
let flds = List.rev (fold addFieldGroup [] flds) in
let fld_table = Hashtbl.create 17 in
let check f =
try
let oldf = Cil_datatype.Fieldinfo.Hashtbl.find fld_table f in
let oldf = Hashtbl.find fld_table f.fname in
let source = fst f.floc in
Kernel.error ~source
"field %s occurs multiple times in aggregate %a. \
......@@ -5547,7 +5540,7 @@ and makeCompType ghost (isstruct: bool)
(fst oldf.floc).Filepath.pos_lnum
with Not_found ->
(* Do not add unnamed bitfields: they can share the empty name. *)
if f.fname <> "" then Cil_datatype.Fieldinfo.Hashtbl.add fld_table f f
if f.fname <> "" then Hashtbl.add fld_table f.fname f
in
List.iter check flds;
if comp.cfields <> [] then begin
......
......@@ -400,6 +400,9 @@ and fieldinfo = {
(** The host structure that contains this field. There can be only one
[compinfo] that contains the field. *)
mutable forder: int;
(** The position in the host structure. *)
forig_name: string;
(** original name as found in C file. *)
......
......@@ -117,8 +117,9 @@ let mkCompInfo
cdefined = false; }
in
let flds =
List.map (fun (fn, ft, fb, fa, fl) ->
List.mapi (fun forder (fn, ft, fb, fa, fl) ->
{ fcomp = comp;
forder;
ftype = ft;
forig_name = fn;
fname = fn;
......
......@@ -804,6 +804,7 @@ module Fieldinfo = struct
List.fold_left
(fun acc loc ->
{ fcomp = ci;
forder = 0;
forig_name = "";
fname = "";
ftype = typ;
......@@ -821,7 +822,7 @@ module Fieldinfo = struct
Typ.reprs)
[]
Compinfo.reprs
let fid fi = fi.fcomp.ckey, fi.fname
let fid fi = fi.fcomp.ckey, fi.forder
let compare f1 f2 = Extlib.compare_basic (fid f1) (fid f2)
let hash f1 = Hashtbl.hash (fid f1)
let equal f1 f2 = (fid f1) = (fid f2)
......
......@@ -516,8 +516,8 @@
"startLine": 168,
"startColumn": 4,
"endLine": 170,
"endColumn": 82,
"byteLength": 146
"endColumn": 75,
"byteLength": 132
}
}
}
......@@ -587,8 +587,8 @@
"startLine": 240,
"startColumn": 4,
"endLine": 244,
"endColumn": 70,
"byteLength": 180
"endColumn": 63,
"byteLength": 173
}
}
}
......@@ -1151,7 +1151,7 @@
"startColumn": 4,
"endLine": 121,
"endColumn": 77,
"byteLength": 155
"byteLength": 148
}
}
}
......@@ -1266,7 +1266,7 @@
"startColumn": 4,
"endLine": 125,
"endColumn": 77,
"byteLength": 156
"byteLength": 149
}
}
}
......@@ -1455,7 +1455,7 @@
"startColumn": 4,
"endLine": 109,
"endColumn": 59,
"byteLength": 125
"byteLength": 118
}
}
}
......@@ -1992,8 +1992,8 @@
"startLine": 89,
"startColumn": 4,
"endLine": 90,
"endColumn": 79,
"byteLength": 108
"endColumn": 72,
"byteLength": 101
}
}
}
......@@ -2202,8 +2202,8 @@
"startLine": 143,
"startColumn": 4,
"endLine": 147,
"endColumn": 70,
"byteLength": 177
"endColumn": 63,
"byteLength": 170
}
}
}
......@@ -2439,7 +2439,7 @@
"startColumn": 4,
"endLine": 59,
"endColumn": 62,
"byteLength": 148
"byteLength": 134
}
}
}
......@@ -2788,7 +2788,7 @@
"startColumn": 4,
"endLine": 185,
"endColumn": 63,
"byteLength": 150
"byteLength": 143
}
}
}
......@@ -3563,7 +3563,7 @@
"startColumn": 4,
"endLine": 202,
"endColumn": 22,
"byteLength": 120
"byteLength": 113
}
}
}
......@@ -3655,7 +3655,7 @@
"startColumn": 4,
"endLine": 269,
"endColumn": 29,
"byteLength": 167
"byteLength": 153
}
}
}
......@@ -3958,7 +3958,7 @@
"startColumn": 4,
"endLine": 97,
"endColumn": 58,
"byteLength": 127
"byteLength": 120
}
}
}
......@@ -4431,7 +4431,7 @@
"startColumn": 4,
"endLine": 59,
"endColumn": 62,
"byteLength": 148
"byteLength": 134
}
}
}
......@@ -4826,7 +4826,7 @@
"startColumn": 4,
"endLine": 105,
"endColumn": 51,
"byteLength": 115
"byteLength": 108
}
}
}
......@@ -4849,7 +4849,7 @@
"startColumn": 4,
"endLine": 135,
"endColumn": 38,
"byteLength": 192
"byteLength": 185
}
}
}
......@@ -5078,8 +5078,8 @@
"startLine": 68,
"startColumn": 4,
"endLine": 70,
"endColumn": 70,
"byteLength": 156
"endColumn": 63,
"byteLength": 135
}
}
}
......@@ -5269,8 +5269,8 @@
"startLine": 252,
"startColumn": 4,
"endLine": 256,
"endColumn": 60,
"byteLength": 208
"endColumn": 53,
"byteLength": 194
}
}
}
......@@ -5364,7 +5364,7 @@
"startColumn": 4,
"endLine": 269,
"endColumn": 29,
"byteLength": 167
"byteLength": 153
}
}
}
......@@ -5573,7 +5573,7 @@
"startColumn": 4,
"endLine": 101,
"endColumn": 59,
"byteLength": 124
"byteLength": 117
}
}
}
......@@ -5739,7 +5739,7 @@
"startColumn": 4,
"endLine": 113,
"endColumn": 51,
"byteLength": 118
"byteLength": 111
}
}
}
......@@ -5948,7 +5948,7 @@
"startColumn": 4,
"endLine": 117,
"endColumn": 62,
"byteLength": 157
"byteLength": 143
}
}
}
......@@ -6636,7 +6636,7 @@
"startColumn": 4,
"endLine": 130,
"endColumn": 38,
"byteLength": 191
"byteLength": 184
}
}
}
......@@ -6731,8 +6731,8 @@
"startLine": 39,
"startColumn": 4,
"endLine": 42,
"endColumn": 77,
"byteLength": 184
"endColumn": 70,
"byteLength": 170
}
}
}
......@@ -6800,8 +6800,8 @@
"startLine": 155,
"startColumn": 4,
"endLine": 159,
"endColumn": 60,
"byteLength": 205
"endColumn": 53,
"byteLength": 191
}
}
}
......@@ -7177,8 +7177,8 @@
"startLine": 143,
"startColumn": 4,
"endLine": 147,
"endColumn": 70,
"byteLength": 177
"endColumn": 63,
"byteLength": 170
}
}
}
......@@ -7246,8 +7246,8 @@
"startLine": 240,
"startColumn": 4,
"endLine": 244,
"endColumn": 70,
"byteLength": 180
"endColumn": 63,
"byteLength": 173
}
}
}
......@@ -7362,7 +7362,7 @@
"startColumn": 4,
"endLine": 82,
"endColumn": 40,
"byteLength": 183
"byteLength": 169
}
}
}
......@@ -7500,7 +7500,7 @@
"startColumn": 4,
"endLine": 135,
"endColumn": 38,
"byteLength": 192
"byteLength": 185
}
}
}
......@@ -7592,7 +7592,7 @@
"startColumn": 4,
"endLine": 197,
"endColumn": 41,
"byteLength": 188
"byteLength": 174
}
}
}
......@@ -7614,8 +7614,8 @@
"startLine": 155,
"startColumn": 4,
"endLine": 159,
"endColumn": 60,
"byteLength": 205
"endColumn": 53,
"byteLength": 191
}
}
}
......@@ -8124,8 +8124,8 @@
"startLine": 252,
"startColumn": 4,
"endLine": 256,
"endColumn": 60,
"byteLength": 208
"endColumn": 53,
"byteLength": 194
}
}
}
......@@ -8267,7 +8267,7 @@
"startColumn": 4,
"endLine": 185,
"endColumn": 63,
"byteLength": 150
"byteLength": 143
}
}
}
......@@ -8595,8 +8595,8 @@
"startLine": 39,
"startColumn": 4,
"endLine": 42,
"endColumn": 77,
"byteLength": 184
"endColumn": 70,
"byteLength": 170
}
}
}
......@@ -8738,7 +8738,7 @@
"startColumn": 4,
"endLine": 87,
"endColumn": 22,
"byteLength": 116
"byteLength": 109
}
}
}
......@@ -8829,8 +8829,8 @@
"startLine": 68,
"startColumn": 4,
"endLine": 70,
"endColumn": 70,
"byteLength": 156
"endColumn": 63,
"byteLength": 135
}
}
}
......@@ -9538,8 +9538,8 @@
"startLine": 168,
"startColumn": 4,
"endLine": 170,
"endColumn": 82,
"byteLength": 146
"endColumn": 75,
"byteLength": 132
}
}
}
......
......@@ -49,7 +49,7 @@ theory S1_S
(* use map.Map *)
type S1_S =
| S1_S1 (F1_S_a:int -> int) (F1_S_b:int -> int) (F1_S_f:int)
| S1_S1 (F1_S_f:int) (F1_S_a:int -> int) (F1_S_b:int -> int)
(* use Matrix *)
......@@ -98,9 +98,9 @@ theory Compound
(* use S1_S *)
function Load_S1_S (p:addr) (mint:addr -> int) (mint1:addr -> int) : S1_S =
S1_S1 (Array_uint32 (shiftfield_F1_S_a p) 5 mint)
S1_S1 (get mint1 (shiftfield_F1_S_f p))
(Array_uint32 (shiftfield_F1_S_a p) 5 mint)
(Array_sint32 (shiftfield_F1_S_b p) 5 mint1)
(get mint1 (shiftfield_F1_S_f p))
Q_Array_uint32_access :
forall mint:addr -> int, i:int, n:int, p:addr
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment