aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/utils.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2008-07-30 23:54:56 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2008-07-30 23:54:56 +0000
commit01ddebf20842e3e6b9b9349a2e68cd702bfcc27b (patch)
tree87a4eb9f676e3356453c46961c4ca3f72f9bd2a7 /gcc/ada/gcc-interface/utils.c
parentb8c71e40e0eecc003533b7f294fbe2d29e641326 (diff)
downloadgcc-01ddebf20842e3e6b9b9349a2e68cd702bfcc27b.zip
gcc-01ddebf20842e3e6b9b9349a2e68cd702bfcc27b.tar.gz
gcc-01ddebf20842e3e6b9b9349a2e68cd702bfcc27b.tar.bz2
re PR ada/36554 (verify_flow_info ICE can not throw but has EH edges)
PR ada/36554 * dwarf2out.c (is_subrange_type): Deal with BOOLEAN_TYPE. ada/ * back_end.adb (Call_Back_End): Pass Standard_Boolean to gigi. * gcc-interface/gigi.h (gigi): Take new standard_boolean parameter. * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Enumeration_Subtype>: Set precision to 1 for subtype of BOOLEAN_TYPE. (set_rm_size): Set TYPE_RM_SIZE_NUM for BOOLEAN_TYPE. (make_type_from_size): Deal with BOOLEAN_TYPE. * gcc-interface/misc.c (gnat_print_type): Likewise. * gcc-interface/trans.c (gigi): Take new standard_boolean parameter. Set boolean_type_node as its translation in the table, as well as boolean_false_node for False and boolean_true_node for True. * gcc-interface/utils.c (gnat_init_decl_processing): Create custom 8-bit boolean_type_node and set its TYPE_RM_SIZE_NUM. (create_param_decl): Deal with BOOLEAN_TYPE. (build_vms_descriptor): Likewise. (build_vms_descriptor64): Likewise. (convert): Deal with BOOLEAN_TYPE like with ENUMERAL_TYPE. From-SVN: r138348
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r--gcc/ada/gcc-interface/utils.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 01cc9b8..8822938 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -523,6 +523,13 @@ gnat_init_decl_processing (void)
this before we can expand the GNAT types. */
size_type_node = gnat_type_for_size (GET_MODE_BITSIZE (Pmode), 0);
set_sizetype (size_type_node);
+
+ /* In Ada, we use an unsigned 8-bit type for the default boolean type. */
+ boolean_type_node = make_node (BOOLEAN_TYPE);
+ TYPE_PRECISION (boolean_type_node) = 1;
+ fixup_unsigned_type (boolean_type_node);
+ TYPE_RM_SIZE_NUM (boolean_type_node) = bitsize_int (1);
+
build_common_tree_nodes_2 (0);
ptr_void_type_node = build_pointer_type (void_type_node);
@@ -1762,7 +1769,8 @@ create_param_decl (tree param_name, tree param_type, bool readonly)
lead to various ABI violations. */
if (targetm.calls.promote_prototypes (param_type)
&& (TREE_CODE (param_type) == INTEGER_TYPE
- || TREE_CODE (param_type) == ENUMERAL_TYPE)
+ || TREE_CODE (param_type) == ENUMERAL_TYPE
+ || TREE_CODE (param_type) == BOOLEAN_TYPE)
&& TYPE_PRECISION (param_type) < TYPE_PRECISION (integer_type_node))
{
/* We have to be careful about biased types here. Make a subtype
@@ -2690,6 +2698,7 @@ build_vms_descriptor (tree type, Mechanism_Type mech, Entity_Id gnat_entity)
{
case INTEGER_TYPE:
case ENUMERAL_TYPE:
+ case BOOLEAN_TYPE:
if (TYPE_VAX_FLOATING_POINT_P (type))
switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
{
@@ -2992,6 +3001,7 @@ build_vms_descriptor64 (tree type, Mechanism_Type mech, Entity_Id gnat_entity)
{
case INTEGER_TYPE:
case ENUMERAL_TYPE:
+ case BOOLEAN_TYPE:
if (TYPE_VAX_FLOATING_POINT_P (type))
switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
{
@@ -4035,9 +4045,6 @@ convert (tree type, tree expr)
case VOID_TYPE:
return fold_build1 (CONVERT_EXPR, type, expr);
- case BOOLEAN_TYPE:
- return fold_convert (type, gnat_truthvalue_conversion (expr));
-
case INTEGER_TYPE:
if (TYPE_HAS_ACTUAL_BOUNDS_P (type)
&& (ecode == ARRAY_TYPE || ecode == UNCONSTRAINED_ARRAY_TYPE
@@ -4052,6 +4059,7 @@ convert (tree type, tree expr)
/* ... fall through ... */
case ENUMERAL_TYPE:
+ case BOOLEAN_TYPE:
/* If we are converting an additive expression to an integer type
with lower precision, be wary of the optimization that can be
applied by convert_to_integer. There are 2 problematic cases: