From de0ae111b043a473d78b510364d9447cf54fed27 Mon Sep 17 00:00:00 2001 From: xleroy Date: Sat, 28 Dec 2013 09:47:40 +0000 Subject: Check in C2C that packed structs were properly emulated. PackedStructs.ml: remove "packed" attribute once processed. git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2388 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e --- cfrontend/C2C.ml | 6 ++++-- cparser/PackedStructs.ml | 11 ++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/cfrontend/C2C.ml b/cfrontend/C2C.ml index 45ff80f7..16c85edc 100644 --- a/cfrontend/C2C.ml +++ b/cfrontend/C2C.ml @@ -836,8 +836,10 @@ let convertGlobvar loc env (sto, id, ty, optinit) = let checkComposite env si id attr flds = let checkField f = if f.fld_bitfield <> None then - unsupported "bit field in struct or union (consider adding option -fbitfields)" - in List.iter checkField flds + unsupported "bit field in struct or union (consider adding option -fbitfields)" in + List.iter checkField flds; + if Cutil.find_custom_attributes ["packed";"__packed__"] attr <> [] then + unsupported "packed struct (consider adding option -fpacked-struct)" (** Convert a list of global declarations. Result is a list of CompCert C global declarations (functions + diff --git a/cparser/PackedStructs.ml b/cparser/PackedStructs.ml index 6d184a63..41c00ba8 100644 --- a/cparser/PackedStructs.ml +++ b/cparser/PackedStructs.ml @@ -119,7 +119,8 @@ let transf_composite loc env su id attrs ml = (0L, 0L, false) in let mfa = packed_param_value loc mfa in let msa = packed_param_value loc msa in - transf_struct_decl mfa msa swapped loc env id attrs ml + let attrs' = remove_custom_attributes ["packed";"__packed__"] attrs in + transf_struct_decl mfa msa swapped loc env id attrs' ml (* Accessor functions *) @@ -391,9 +392,13 @@ let rec transf_globdecls env accu = function ({g with gdesc = Gfundef(transf_fundef env f)} :: accu) gl | Gcompositedecl(su, id, attr) -> + let attr' = + match su with + | Union -> attr + | Struct -> remove_custom_attributes ["packed";"__packed__"] attr in transf_globdecls - (Env.add_composite env id (composite_info_decl env su attr)) - (g :: accu) + (Env.add_composite env id (composite_info_decl env su attr')) + ({g with gdesc = Gcompositedecl(su, id, attr')} :: accu) gl | Gcompositedef(su, id, attr, fl) -> let (attr', fl') = transf_composite g.gloc env su id attr fl in -- cgit