aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/utils.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2009-04-24 08:04:38 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2009-04-24 08:04:38 +0000
commitcaa9d12a2b675da20f5a3016e6f306a84ee96a2a (patch)
tree4ef92f0ee83700140ec99de85778563e3dbe29e6 /gcc/ada/gcc-interface/utils.c
parent1275de7d6eb0240c3dc56206aa68bac7a6c2318b (diff)
downloadgcc-caa9d12a2b675da20f5a3016e6f306a84ee96a2a.zip
gcc-caa9d12a2b675da20f5a3016e6f306a84ee96a2a.tar.gz
gcc-caa9d12a2b675da20f5a3016e6f306a84ee96a2a.tar.bz2
ttypes.ads (Target_Double_Float_Alignment): New variable.
* ttypes.ads (Target_Double_Float_Alignment): New variable. (Target_Double_Scalar_Alignment): Likewise. * get_targ.ads (Get_Strict_Alignment): Adjust external name. (Get_Double_Float_Alignment): New imported function. (Get_Double_Scalar_Alignment): Likewise. * layout.adb (Set_Elem_Alignment): Take into account specific caps for the alignment of "double" floating-point types and "double" or larger scalar types, as parameterized by Target_Double_Float_Alignment and Target_Double_Scalar_Alignment respectively. * gcc-interface/gigi.h (double_float_alignment): Declare. (double_scalar_alignment): Likewise. (is_double_float_or_array): Likewise. (is_double_scalar_or_array): Likewise. (get_target_double_float_alignment): Likewise. (get_target_double_scalar_alignment): Likewise. * gcc-interface/targtyps.c (get_strict_alignment): Rename into... (get_target_strict_alignment): ...this. (get_target_double_float_alignment): New function. (get_target_double_scalar_alignment): Likewise. * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Signed_Integer_Subtype>: Test the presence of an alignment clause for under-aligned integer types. Take into account specific caps for the alignment of "double" floating-point types and "double" or larger scalar types, as parameterized by Target_Double_Float_Alignment and Target_Double_Scalar_Alignment respectively. (validate_alignment): Likewise. * gcc-interface/trans.c (Attribute_to_gnu) <Attr_Alignment>: Likewise. (gigi): Initialize double_float_alignment and double_scalar_alignment. * gcc-interface/utils.c (double_float_alignment): New global variable. (double_scalar_alignment): Likewise. (is_double_float_or_array): New predicate. (is_double_scalar_or_array): Likewise. From-SVN: r146675
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r--gcc/ada/gcc-interface/utils.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index ad3909f..e3cf975 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -74,6 +74,16 @@
/* If nonzero, pretend we are allocating at global level. */
int force_global;
+/* The default alignment of "double" floating-point types, i.e. floating
+ point types whose size is equal to 64 bits, or 0 if this alignment is
+ not specifically capped. */
+int double_float_alignment;
+
+/* The default alignment of "double" or larger scalar types, i.e. scalar
+ types whose size is greater or equal to 64 bits, or 0 if this alignment
+ is not specifically capped. */
+int double_scalar_alignment;
+
/* Tree nodes for the various types and decls we create. */
tree gnat_std_decls[(int) ADT_LAST];
@@ -4564,6 +4574,62 @@ tree_code_for_record_type (Entity_Id gnat_type)
return UNION_TYPE;
}
+/* Return true if GNAT_TYPE is a "double" floating-point type, i.e. whose
+ size is equal to 64 bits, or an array of such a type. Set ALIGN_CLAUSE
+ according to the presence of an alignment clause on the type or, if it
+ is an array, on the component type. */
+
+bool
+is_double_float_or_array (Entity_Id gnat_type, bool *align_clause)
+{
+ gnat_type = Underlying_Type (gnat_type);
+
+ *align_clause = Present (Alignment_Clause (gnat_type));
+
+ if (Is_Array_Type (gnat_type))
+ {
+ gnat_type = Underlying_Type (Component_Type (gnat_type));
+ if (Present (Alignment_Clause (gnat_type)))
+ *align_clause = true;
+ }
+
+ if (!Is_Floating_Point_Type (gnat_type))
+ return false;
+
+ if (UI_To_Int (Esize (gnat_type)) != 64)
+ return false;
+
+ return true;
+}
+
+/* Return true if GNAT_TYPE is a "double" or larger scalar type, i.e. whose
+ size is greater or equal to 64 bits, or an array of such a type. Set
+ ALIGN_CLAUSE according to the presence of an alignment clause on the
+ type or, if it is an array, on the component type. */
+
+bool
+is_double_scalar_or_array (Entity_Id gnat_type, bool *align_clause)
+{
+ gnat_type = Underlying_Type (gnat_type);
+
+ *align_clause = Present (Alignment_Clause (gnat_type));
+
+ if (Is_Array_Type (gnat_type))
+ {
+ gnat_type = Underlying_Type (Component_Type (gnat_type));
+ if (Present (Alignment_Clause (gnat_type)))
+ *align_clause = true;
+ }
+
+ if (!Is_Scalar_Type (gnat_type))
+ return false;
+
+ if (UI_To_Int (Esize (gnat_type)) < 64)
+ return false;
+
+ return true;
+}
+
/* Return true if GNU_TYPE is suitable as the type of a non-aliased
component of an aggregate type. */