diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2012-03-25 16:55:01 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2012-03-25 16:55:01 +0000 |
commit | fb88e1dd28570359af09327bb65ac8de5fcc9fe8 (patch) | |
tree | 9d90918e550bb6f18e87640e70026d658b0f2bb2 /gcc/ada/gcc-interface/utils.c | |
parent | 47a1ae3c6a27bfd5875d70860d72ea31d4c98cc7 (diff) | |
download | gcc-fb88e1dd28570359af09327bb65ac8de5fcc9fe8.zip gcc-fb88e1dd28570359af09327bb65ac8de5fcc9fe8.tar.gz gcc-fb88e1dd28570359af09327bb65ac8de5fcc9fe8.tar.bz2 |
utils.c (finish_record_type): Return early for padded types and tidy up.
* gcc-interface/utils.c (finish_record_type): Return early for padded
types and tidy up.
From-SVN: r185778
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 7383358..18f9dac 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -863,12 +863,15 @@ finish_record_type (tree record_type, tree field_list, int rep_level, void rest_of_record_type_compilation (tree record_type) { - tree field_list = TYPE_FIELDS (record_type); - tree field; - enum tree_code code = TREE_CODE (record_type); bool var_size = false; + tree field; - for (field = field_list; field; field = DECL_CHAIN (field)) + /* If this is a padded type, the bulk of the debug info has already been + generated for the field's type. */ + if (TYPE_IS_PADDING_P (record_type)) + return; + + for (field = TYPE_FIELDS (record_type); field; field = DECL_CHAIN (field)) { /* We need to make an XVE/XVU record if any field has variable size, whether or not the record does. For example, if we have a union, @@ -879,7 +882,7 @@ rest_of_record_type_compilation (tree record_type) if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST /* If a field has a non-constant qualifier, the record will have variable size too. */ - || (code == QUAL_UNION_TYPE + || (TREE_CODE (record_type) == QUAL_UNION_TYPE && TREE_CODE (DECL_QUALIFIER (field)) != INTEGER_CST)) { var_size = true; @@ -887,12 +890,9 @@ rest_of_record_type_compilation (tree record_type) } } - /* If this record is of variable size, rename it so that the - debugger knows it is and make a new, parallel, record - that tells the debugger how the record is laid out. See - exp_dbug.ads. But don't do this for records that are padding - since they confuse GDB. */ - if (var_size && !TYPE_IS_PADDING_P (record_type)) + /* If this record type is of variable size, make a parallel record type that + will tell the debugger how the former is laid out (see exp_dbug.ads). */ + if (var_size) { tree new_record_type = make_node (TREE_CODE (record_type) == QUAL_UNION_TYPE @@ -1052,8 +1052,7 @@ rest_of_record_type_compilation (tree record_type) prev_old_field = old_field; } - TYPE_FIELDS (new_record_type) - = nreverse (TYPE_FIELDS (new_record_type)); + TYPE_FIELDS (new_record_type) = nreverse (TYPE_FIELDS (new_record_type)); add_parallel_type (TYPE_STUB_DECL (record_type), new_record_type); } |