diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2013-10-05 08:11:34 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2013-10-05 08:11:34 +0000 |
commit | a6c369cbd63996c1571ae601b7d92070f024b22c (patch) | |
tree | dc4f3f5a52ae4ea230f307ce5f442137f014b79b /cparser/Elab.ml | |
parent | b55147379939553eccd4289fd18e7f161619be4d (diff) | |
download | compcert-a6c369cbd63996c1571ae601b7d92070f024b22c.tar.gz compcert-a6c369cbd63996c1571ae601b7d92070f024b22c.zip |
Merge of the "alignas" branch.
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2342 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'cparser/Elab.ml')
-rw-r--r-- | cparser/Elab.ml | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/cparser/Elab.ml b/cparser/Elab.ml index fa9fd241..b25ad55e 100644 --- a/cparser/Elab.ml +++ b/cparser/Elab.ml @@ -280,12 +280,31 @@ let elab_gcc_attr loc env = function | _ -> warning loc "ill-formed attribute, ignored"; [] +let is_power_of_two n = n > 0L && Int64.(logand n (pred n)) = 0L + +let extract_alignas loc a = + match a with + | Attr(("aligned"|"__aligned__"), args) -> + begin match args with + | [AInt n] when is_power_of_two n -> AAlignas (Int64.to_int n) + | _ -> warning loc "bad 'aligned' attribute, ignored"; a + end + | _ -> a + let elab_attribute loc env = function | ("const", []) -> [AConst] | ("restrict", []) -> [ARestrict] | ("volatile", []) -> [AVolatile] + | ("_Alignas", [a]) -> + begin match elab_attr_arg loc env a with + | AInt n when is_power_of_two n -> [AAlignas (Int64.to_int n)] + | _ -> warning loc "bad _Alignas value, ignored"; [] + end | (("__attribute" | "__attribute__"), l) -> - List.flatten (List.map (elab_gcc_attr loc env) l) + List.map (extract_alignas loc) + (List.flatten (List.map (elab_gcc_attr loc env) l)) + | ("__packed__", args) -> + [Attr("__packed__", List.map (elab_attr_arg loc env) args)] | ("__asm__", _) -> [] (* MacOS X noise *) | (name, _) -> warning loc "`%s' annotation ignored" name; [] |