aboutsummaryrefslogtreecommitdiffstats
path: root/cparser
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2018-04-21 18:16:38 +0300
committerXavier Leroy <xavierleroy@users.noreply.github.com>2018-04-25 14:27:31 +0200
commitf016c51503ceff5354e12b27f22ae33172b8fb0e (patch)
treef17716f0fc9910bb7c80bd1371a22e490e3e2566 /cparser
parent0a15edfb0c49242fcc8f772ed39f167a40e3b25e (diff)
downloadcompcert-f016c51503ceff5354e12b27f22ae33172b8fb0e.tar.gz
compcert-f016c51503ceff5354e12b27f22ae33172b8fb0e.zip
Initialization of union bit fields
Bit fields in unions were initialized like normal fields, causing mismatch on the name of the field. Also: added function Bitfields.carrier_field and refactored. Patch by Bernhard Schommer. Bug 23362
Diffstat (limited to 'cparser')
-rw-r--r--cparser/Bitfields.ml15
1 files changed, 12 insertions, 3 deletions
diff --git a/cparser/Bitfields.ml b/cparser/Bitfields.ml
index baf2b0ec..9ac9b61f 100644
--- a/cparser/Bitfields.ml
+++ b/cparser/Bitfields.ml
@@ -40,6 +40,10 @@ type bitfield_info =
0 < pos + sz <= bitsizeof(int)
*)
+let carrier_field bf =
+ { fld_name = bf.bf_carrier; fld_typ = bf.bf_carrier_typ;
+ fld_bitfield = None; fld_anonymous = false }
+
(* Mapping (struct identifier, bitfield name) -> bitfield info *)
let bitfield_table =
@@ -336,8 +340,7 @@ let rec transf_struct_init id fld_init_list =
| Some bf ->
let (el, rem') =
pack_bitfield_init id bf.bf_carrier fld_init_list in
- ({fld_name = bf.bf_carrier; fld_typ = bf.bf_carrier_typ;
- fld_bitfield = None; fld_anonymous = false},
+ (carrier_field bf,
Init_single {edesc = ECast(bf.bf_carrier_typ, or_expr_list el);
etyp = bf.bf_carrier_typ})
:: transf_struct_init id rem'
@@ -504,7 +507,13 @@ and transf_init env i =
let fld_init_list' =
List.map (fun (f, i) -> (f, transf_init env i)) fld_init_list in
Init_struct(id, transf_struct_init id fld_init_list')
- | Init_union(id, fld, i) -> Init_union(id, fld, transf_init env i)
+ | Init_union(id, fld, i) ->
+ let i' = transf_init env i in
+ match is_bitfield id fld.fld_name with
+ | None ->
+ Init_union(id, fld, i')
+ | Some bf ->
+ Init_union(id, carrier_field bf, Init_single (bitfield_initializer bf i'))
(* Declarations *)