diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-05-15 09:11:40 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-05-15 09:11:40 +0000 |
commit | a9538d681b63fb9ff2291c3fde1ddd1ab389576c (patch) | |
tree | faaa7bb6c0694f3f9cf8d8dbe54a58161ef0489f /gcc/dbxout.c | |
parent | 7739b9657f038bd8dce5417ab9af6b5abf9e47a7 (diff) | |
download | gcc-a9538d681b63fb9ff2291c3fde1ddd1ab389576c.tar.gz |
* dbxout.c (dbxout_range_type): Add LOW and HIGH parameters. Use them
for bounds.
(print_int_cst_bounds_in_octal_p): Likewise.
(dbxout_type): Adjust calls to above functions. Be prepared to deal
with subtypes.
* dwarf2out.c (base_type_die): Likewise.
(is_subrange_type): Delete.
(subrange_type_die): Add LOW and HIGH parameters. Use them for bounds.
(modified_type_die): Call subrange_type_for_debug_p on subtypes.
* fold-const.c (fold_truth_not_expr) <CONVERT_EXPR>: Do not strip it if
the destination type is boolean.
(build_range_check): Do not special-case subtypes.
(fold_sign_changed_comparison): Likewise.
(fold_unary): Likewise.
* langhooks-def.h (LANG_HOOKS_GET_SUBRANGE_BOUNDS): Define.
(LANG_HOOKS_FOR_TYPES_INITIALIZER): Add LANG_HOOKS_GET_SUBRANGE_BOUNDS.
* langhooks.h (lang_hooks_for_types): Add get_subrange_bounds.
* tree.c (subrange_type_for_debug_p): New predicate based on the former
is_subrange_type.
* tree.h (subrange_type_for_debug_p): Declare.
* tree-chrec.c (avoid_arithmetics_in_type_p): Delete.
(convert_affine_scev): Remove call to above function.
(chrec_convert_aggressive): Likewise.
* tree-ssa.c (useless_type_conversion_p_1): Do not specifically return
false for conversions involving subtypes.
* tree-vrp.c (vrp_val_max): Do not special-case subtypes.
(vrp_val_min): Likewise.
(needs_overflow_infinity): Likewise.
(extract_range_from_unary_expr): Likewise.
ada/
* gcc-interface/ada-tree.h (TYPE_GCC_MIN_VALUE, TYPE_GCC_MAX_VALUE):
New macros.
(TYPE_RM_VALUES): Likewise.
(TYPE_RM_SIZE): Rewrite in terms of TYPE_RM_VALUES.
(SET_TYPE_RM_SIZE): New macro.
(TYPE_RM_MIN_VALUE, TYPE_RM_MAX_VALUE): Likewise.
(SET_TYPE_RM_SIZE, SET_TYPE_RM_MAX_VALUE): Likewise.
(TYPE_MIN_VALUE, TYPE_MAX_VALUE): Redefine.
* gcc-interface/gigi.h (create_range_type): Declare.
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Modular_Integer_Type>
Use SET_TYPE_RM_MAX_VALUE to set the upper bound on the UMT type.
<E_Signed_Integer_Subtype>: Build a regular integer type first and
then set the RM bounds. Use SET_TYPE_RM_SIZE to set the RM size.
<E_Floating_Point_Subtype>: Build a regular floating-point type first
and then set the RM bounds.
<E_Array_Type>: Use create_range_type instead of build_range_type.
<E_Array_Subtype>: Build a regular integer type first and then set
the RM bounds for the extra subtype.
<E_String_Literal_Subtype>: Use create_range_type instead of
build_range_type.
<all>: Set the RM bounds for enumeration types and the GCC bounds for
floating-point types.
(set_rm_size): Use SET_TYPE_RM_SIZE to set the RM size.
(make_type_from_size) <INTEGER_TYPE>: Use SET_TYPE_RM_{MIN,MAX}_VALUE
to set the bounds. Use SET_TYPE_RM_SIZE to set the RM size.
(substitute_in_type) <INTEGER_TYPE>: Deal with GCC bounds for domain
types and with RM bounds for subtypes.
* gcc-interface/misc.c (LANG_HOOKS_GET_SUBRANGE_BOUNDS): Define.
(gnat_print_type) <REAL_TYPE>: New case.
<ENUMERAL_TYPE>: Fall through to above case.
(gnat_get_subrange_bounds): New function.
* gcc-interface/trans.c (add_decl_expr): Mark the trees rooted as
TYPE_RM_MIN_VALUE and TYPE_RM_MAX_VALUE, if any.
* gcc-interface/utils.c (gnat_init_decl_processing): Use precision 8
for booleans. Adjust and use SET_TYPE_RM_SIZE to set the RM size.
(create_range_type): New function.
(create_param_decl): Build a regular integer type first and then set
the RM bounds for the extra subtype.
(unchecked_convert): Remove kludge for 'Valid.
* gcc-interface/utils2.c (build_binary_op) <ARRAY_RANGE_REF>: Convert
the index to sizetype instead of TYPE_DOMAIN.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147563 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dbxout.c')
-rw-r--r-- | gcc/dbxout.c | 70 |
1 files changed, 43 insertions, 27 deletions
diff --git a/gcc/dbxout.c b/gcc/dbxout.c index dd05076bb63..eb0fceee52b 100644 --- a/gcc/dbxout.c +++ b/gcc/dbxout.c @@ -318,9 +318,9 @@ static void dbxout_args (tree); static void dbxout_type_fields (tree); static void dbxout_type_method_1 (tree); static void dbxout_type_methods (tree); -static void dbxout_range_type (tree); +static void dbxout_range_type (tree, tree, tree); static void dbxout_type (tree, int); -static bool print_int_cst_bounds_in_octal_p (tree); +static bool print_int_cst_bounds_in_octal_p (tree, tree, tree); static bool is_fortran (void); static void dbxout_type_name (tree); static void dbxout_class_name_qualifiers (tree); @@ -1593,10 +1593,10 @@ dbxout_type_methods (tree type) /* Emit a "range" type specification, which has the form: "r<index type>;<lower bound>;<upper bound>;". - TYPE is an INTEGER_TYPE. */ + TYPE is an INTEGER_TYPE, LOW and HIGH are the bounds. */ static void -dbxout_range_type (tree type) +dbxout_range_type (tree type, tree low, tree high) { stabstr_C ('r'); if (TREE_TYPE (type)) @@ -1624,25 +1624,23 @@ dbxout_range_type (tree type) } stabstr_C (';'); - if (TYPE_MIN_VALUE (type) != 0 - && host_integerp (TYPE_MIN_VALUE (type), 0)) + if (low && host_integerp (low, 0)) { - if (print_int_cst_bounds_in_octal_p (type)) - stabstr_O (TYPE_MIN_VALUE (type)); + if (print_int_cst_bounds_in_octal_p (type, low, high)) + stabstr_O (low); else - stabstr_D (tree_low_cst (TYPE_MIN_VALUE (type), 0)); + stabstr_D (tree_low_cst (low, 0)); } else stabstr_C ('0'); stabstr_C (';'); - if (TYPE_MAX_VALUE (type) != 0 - && host_integerp (TYPE_MAX_VALUE (type), 0)) + if (high && host_integerp (high, 0)) { - if (print_int_cst_bounds_in_octal_p (type)) - stabstr_O (TYPE_MAX_VALUE (type)); + if (print_int_cst_bounds_in_octal_p (type, low, high)) + stabstr_O (high); else - stabstr_D (tree_low_cst (TYPE_MAX_VALUE (type), 0)); + stabstr_D (tree_low_cst (high, 0)); stabstr_C (';'); } else @@ -1663,10 +1661,9 @@ dbxout_range_type (tree type) static void dbxout_type (tree type, int full) { - tree tem; - tree main_variant; static int anonymous_type_number = 0; bool vector_type = false; + tree tem, main_variant, low, high; if (TREE_CODE (type) == VECTOR_TYPE) { @@ -1676,6 +1673,27 @@ dbxout_type (tree type, int full) vector_type = true; } + if (TREE_CODE (type) == INTEGER_TYPE) + { + if (TREE_TYPE (type) == 0) + { + low = TYPE_MIN_VALUE (type); + high = TYPE_MAX_VALUE (type); + } + + else if (subrange_type_for_debug_p (type, &low, &high)) + ; + + /* If this is a subtype that should not be emitted as a subrange type, + use the base type. */ + else + { + type = TREE_TYPE (type); + low = TYPE_MIN_VALUE (type); + high = TYPE_MAX_VALUE (type); + } + } + /* If there was an input error and we don't really have a type, avoid crashing and write something that is at least valid by assuming `int'. */ @@ -1877,7 +1895,7 @@ dbxout_type (tree type, int full) stabstr_C (';'); } - dbxout_range_type (type); + dbxout_range_type (type, low, high); } else @@ -1893,7 +1911,7 @@ dbxout_type (tree type, int full) stabstr_C (';'); } - if (print_int_cst_bounds_in_octal_p (type)) + if (print_int_cst_bounds_in_octal_p (type, low, high)) { stabstr_C ('r'); @@ -1908,15 +1926,15 @@ dbxout_type (tree type, int full) dbxout_type_index (type); stabstr_C (';'); - stabstr_O (TYPE_MIN_VALUE (type)); + stabstr_O (low); stabstr_C (';'); - stabstr_O (TYPE_MAX_VALUE (type)); + stabstr_O (high); stabstr_C (';'); } else /* Output other integer types as subranges of `int'. */ - dbxout_range_type (type); + dbxout_range_type (type, low, high); } break; @@ -2010,7 +2028,7 @@ dbxout_type (tree type, int full) else { stabstr_C ('a'); - dbxout_range_type (tem); + dbxout_range_type (tem, TYPE_MIN_VALUE (tem), TYPE_MAX_VALUE (tem)); } dbxout_type (TREE_TYPE (type), 0); @@ -2258,7 +2276,7 @@ dbxout_type (tree type, int full) should be printed in octal format. */ static bool -print_int_cst_bounds_in_octal_p (tree type) +print_int_cst_bounds_in_octal_p (tree type, tree low, tree high) { /* If we can use GDB extensions and the size is wider than a long (the size used by GDB to read them) or we may have trouble writing @@ -2272,10 +2290,8 @@ print_int_cst_bounds_in_octal_p (tree type) can't span same size unsigned types. */ if (use_gnu_debug_info_extensions - && TYPE_MIN_VALUE (type) != 0 - && TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST - && TYPE_MAX_VALUE (type) != 0 - && TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST + && low && TREE_CODE (low) == INTEGER_CST + && high && TREE_CODE (high) == INTEGER_CST && (TYPE_PRECISION (type) > TYPE_PRECISION (integer_type_node) || ((TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)) && TYPE_UNSIGNED (type)) |