diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-05-31 11:54:11 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-05-31 11:54:11 +0000 |
commit | 33f9020605fba744c7446e059f41d86b197cdbce (patch) | |
tree | 28744d928e0ef04dd9c080224821167555ad523f | |
parent | 51f6e244b4b4b7af5984fb3ae9ad7515a65eb3d8 (diff) | |
download | gcc-33f9020605fba744c7446e059f41d86b197cdbce.tar.gz |
* i386.c (classify_argument): Properly handle base types.
* dwarf2out.c (expand_builin_init_dwarf_reg_sizes):
Store first DWARF_FRAME_REGISTERS dwarf registers, not pseudo
registers.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54106 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 59 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 17 |
3 files changed, 74 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 77386f33af3..4a0d837cac6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +Fri May 31 13:50:19 CEST 2002 Jan Hubicka <jh@suse.cz> + + * i386.c (classify_argument): Properly handle base types. + + * dwarf2out.c (expand_builin_init_dwarf_reg_sizes): + Store first DWARF_FRAME_REGISTERS dwarf registers, not pseudo + registers. + Fri May 31 13:37:54 CEST 2002 Jan Hubicka <jh@suse.cz> * gcse.c (gcse_emit_move_after): New. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 3486046c3dd..d512646fdc5 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -1721,6 +1721,34 @@ classify_argument (mode, type, classes, bit_offset) /* Classify each field of record and merge classes. */ if (TREE_CODE (type) == RECORD_TYPE) { + /* For classes first merge in the field of the subclasses. */ + if (TYPE_BINFO (type) != NULL && TYPE_BINFO_BASETYPES (type) != NULL) + { + tree bases = TYPE_BINFO_BASETYPES (type); + int n_bases = TREE_VEC_LENGTH (bases); + int i; + + for (i = 0; i < n_bases; ++i) + { + tree binfo = TREE_VEC_ELT (bases, i); + int num; + int offset = tree_low_cst (BINFO_OFFSET (binfo), 0) * 8; + tree type = BINFO_TYPE (binfo); + + num = classify_argument (TYPE_MODE (type), + type, subclasses, + (offset + bit_offset) % 256); + if (!num) + return 0; + for (i = 0; i < num; i++) + { + int pos = (offset + bit_offset) / 8 / 8; + classes[i + pos] = + merge_classes (subclasses[i], classes[i + pos]); + } + } + } + /* And now merge the fields of structure. */ for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) { if (TREE_CODE (field) == FIELD_DECL) @@ -1781,6 +1809,33 @@ classify_argument (mode, type, classes, bit_offset) else if (TREE_CODE (type) == UNION_TYPE || TREE_CODE (type) == QUAL_UNION_TYPE) { + /* For classes first merge in the field of the subclasses. */ + if (TYPE_BINFO (type) != NULL && TYPE_BINFO_BASETYPES (type) != NULL) + { + tree bases = TYPE_BINFO_BASETYPES (type); + int n_bases = TREE_VEC_LENGTH (bases); + int i; + + for (i = 0; i < n_bases; ++i) + { + tree binfo = TREE_VEC_ELT (bases, i); + int num; + int offset = tree_low_cst (BINFO_OFFSET (binfo), 0) * 8; + tree type = BINFO_TYPE (binfo); + + num = classify_argument (TYPE_MODE (type), + type, subclasses, + (offset + bit_offset) % 256); + if (!num) + return 0; + for (i = 0; i < num; i++) + { + int pos = (offset + bit_offset) / 8 / 8; + classes[i + pos] = + merge_classes (subclasses[i], classes[i + pos]); + } + } + } for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) { if (TREE_CODE (field) == FIELD_DECL) @@ -2213,11 +2268,11 @@ function_arg (cum, mode, type, named) if (TARGET_DEBUG_ARG) { fprintf (stderr, - "function_arg (size=%d, wds=%2d, nregs=%d, mode=%4s, named=%d", + "function_arg (size=%d, wds=%2d, nregs=%d, mode=%4s, named=%d, ", words, cum->words, cum->nregs, GET_MODE_NAME (mode), named); if (ret) - fprintf (stderr, ", reg=%%e%s", reg_names[ REGNO (ret) ]); + print_simple_rtl (stderr, ret); else fprintf (stderr, ", stack"); diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 07295229a11..f4b0ee7ff5d 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -420,16 +420,17 @@ expand_builtin_init_dwarf_reg_sizes (address) rtx addr = expand_expr (address, NULL_RTX, VOIDmode, 0); rtx mem = gen_rtx_MEM (BLKmode, addr); - for (i = 0; i < DWARF_FRAME_REGISTERS; i++) - { - HOST_WIDE_INT offset = DWARF_FRAME_REGNUM (i) * GET_MODE_SIZE (mode); - HOST_WIDE_INT size = GET_MODE_SIZE (reg_raw_mode[i]); + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) + if (DWARF_FRAME_REGNUM (i) < DWARF_FRAME_REGISTERS) + { + HOST_WIDE_INT offset = DWARF_FRAME_REGNUM (i) * GET_MODE_SIZE (mode); + HOST_WIDE_INT size = GET_MODE_SIZE (reg_raw_mode[i]); - if (offset < 0) - continue; + if (offset < 0) + continue; - emit_move_insn (adjust_address (mem, mode, offset), GEN_INT (size)); - } + emit_move_insn (adjust_address (mem, mode, offset), GEN_INT (size)); + } } /* Convert a DWARF call frame info. operation to its string name */ |