aboutsummaryrefslogtreecommitdiffstats
path: root/cparser/Elab.ml
diff options
context:
space:
mode:
authorxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2013-10-05 08:11:34 +0000
committerxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2013-10-05 08:11:34 +0000
commita6c369cbd63996c1571ae601b7d92070f024b22c (patch)
treedc4f3f5a52ae4ea230f307ce5f442137f014b79b /cparser/Elab.ml
parentb55147379939553eccd4289fd18e7f161619be4d (diff)
downloadcompcert-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.ml21
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; []