aboutsummaryrefslogtreecommitdiffstats
path: root/cparser/Cutil.ml
diff options
context:
space:
mode:
authorBernhard Schommer <bschommer@users.noreply.github.com>2018-09-10 15:43:20 +0200
committerXavier Leroy <xavierleroy@users.noreply.github.com>2018-09-10 15:43:20 +0200
commit45ca9fe8fcc6a67036369624f57576be22ac7bbd (patch)
tree7f4e1e79a1abd7fccfdf965f872e9ae6b4437c52 /cparser/Cutil.ml
parent49ecf8a3e5b5a4449f4bcbc1d6d4f55c8b5888be (diff)
downloadcompcert-kvx-45ca9fe8fcc6a67036369624f57576be22ac7bbd.tar.gz
compcert-kvx-45ca9fe8fcc6a67036369624f57576be22ac7bbd.zip
Attach _Alignas to names and refactor _Alignas checks (#133)
* Refactor common code of alignas. Instead of working on attributes the function now works directly on the type since the check always performed an extraction of attributes from a type. Bug 23393 * Attach _Alignas to the name. Bug 23393 * Attach "aligned" attributes to names So that __attribute((aligned(N))) remains consistent with _Alignas(N). gcc and clang apply "aligned" attributes to names, with a special case for typedefs: typedef __attribute((aligned(16))) int int_al_16; int_al_16 * p; __attribute((aligned(16))) int * q; For gcc, p is naturally-aligned pointer to 16-aligned int and q is 16-aligned pointer to naturally-aligned int. For CompCert with this commit, both p and q are 16-aligned pointers to naturally-aligned int. * Resurrect the alignment test involving typedef The test was removed because it involved an _Alignas in a typedef, which is no longer supported. However the same effect can be achieved with an "aligned" attribute, which is still supported in typedef.
Diffstat (limited to 'cparser/Cutil.ml')
-rw-r--r--cparser/Cutil.ml7
1 files changed, 4 insertions, 3 deletions
diff --git a/cparser/Cutil.ml b/cparser/Cutil.ml
index a0a2cf56..ea9713d5 100644
--- a/cparser/Cutil.ml
+++ b/cparser/Cutil.ml
@@ -110,7 +110,8 @@ let declare_attributes l =
List.iter (fun (n,c) -> declare_attribute n c) l
let class_of_attribute = function
- | AConst | AVolatile | ARestrict | AAlignas _ -> Attr_type
+ | AConst | AVolatile | ARestrict -> Attr_type
+ | AAlignas _ -> Attr_name
| Attr(name, args) ->
try Hashtbl.find attr_class (normalize_attrname name)
with Not_found -> Attr_unknown
@@ -258,8 +259,8 @@ let strip_last_attribute typ =
l,TEnum(n,r)
(* Check whether the attributes contain _Alignas attribute *)
-let has_std_alignas attr =
- List.exists (function | AAlignas _ -> true | _ -> false) attr
+let has_std_alignas env typ =
+ List.exists (function | AAlignas _ -> true | _ -> false) (attributes_of_type env typ)
(* Extracting alignment value from a set of attributes. Return 0 if none. *)