diff options
author | Mark Mitchell <mark@codesourcery.com> | 2001-05-18 07:25:50 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2001-05-18 07:25:50 +0000 |
commit | db3c03158c04178b274114428458ee758284c93c (patch) | |
tree | 42a17eef2f12f7a1de6ec4d4deee148f64370649 | |
parent | 52a57250621b05048f505946c662675d083d8335 (diff) | |
download | gcc-db3c03158c04178b274114428458ee758284c93c.zip gcc-db3c03158c04178b274114428458ee758284c93c.tar.gz gcc-db3c03158c04178b274114428458ee758284c93c.tar.bz2 |
function.c (expand_function_start): Avoid creating BLKmode pseudos.
* function.c (expand_function_start): Avoid creating BLKmode
pseudos.
* dwarf2out.c (output_comp_unit): Always output a compilation-unit
DIE, even if it has no children.
(dwarf2out_finish): Always output the line-number table, even if
it has no content.
From-SVN: r42254
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 46 | ||||
-rw-r--r-- | gcc/function.c | 32 |
3 files changed, 55 insertions, 35 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 724c656..cf69425 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2001-05-18 Mark Mitchell <mark@codesourcery.com> + + * function.c (expand_function_start): Avoid creating BLKmode + pseudos. + +2001-05-17 Mark Mitchell <mark@codesourcery.com> + + * dwarf2out.c (output_comp_unit): Always output a compilation-unit + DIE, even if it has no children. + (dwarf2out_finish): Always output the line-number table, even if + it has no content. + 2001-05-18 David Edelsohn <edelsohn@gnu.org> * rs6000.md (movsfcc,movdfcc): Remove NE case. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 6b825cf..5c05d03 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -5929,10 +5929,13 @@ output_comp_unit (die) { const char *secname; - if (die->die_child == 0) - return; - - /* Mark all the DIEs in this CU so we know which get local refs. */ + /* Even if there are no children of this DIE, we must output the + information about the compilation unit. Otherwise, on an empty + translation unit, we will generate a present, but empty, + .debug_info section. IRIX 6.5 `nm' will then complain when + examining the file. + + Mark all the DIEs in this CU so we know which get local refs. */ mark_dies (die); build_abbrev_table (die); @@ -11250,27 +11253,28 @@ dwarf2out_finish () ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BSS_END_LABEL, 0); #endif - /* Output the source line correspondence table. */ - if (line_info_table_in_use > 1 || separate_line_info_table_in_use) + /* Output the source line correspondence table. We must do this + even if there is no line information. Otherwise, on an empty + translation unit, we will generate a present, but empty, + .debug_info section. IRIX 6.5 `nm' will then complain when + examining the file. */ + if (! DWARF2_ASM_LINE_DEBUG_INFO) { - if (! DWARF2_ASM_LINE_DEBUG_INFO) - { - ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION); - output_line_info (); - } - - /* We can only use the low/high_pc attributes if all of the code - was in .text. */ - if (separate_line_info_table_in_use == 0) - { - add_AT_lbl_id (comp_unit_die, DW_AT_low_pc, text_section_label); - add_AT_lbl_id (comp_unit_die, DW_AT_high_pc, text_end_label); - } + ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION); + output_line_info (); + } - add_AT_lbl_offset (comp_unit_die, DW_AT_stmt_list, - debug_line_section_label); + /* We can only use the low/high_pc attributes if all of the code was + in .text. */ + if (separate_line_info_table_in_use == 0) + { + add_AT_lbl_id (comp_unit_die, DW_AT_low_pc, text_section_label); + add_AT_lbl_id (comp_unit_die, DW_AT_high_pc, text_end_label); } + add_AT_lbl_offset (comp_unit_die, DW_AT_stmt_list, + debug_line_section_label); + #if 0 /* unimplemented */ if (debug_info_level >= DINFO_LEVEL_VERBOSE && primary) add_AT_unsigned (die, DW_AT_macro_info, 0); diff --git a/gcc/function.c b/gcc/function.c index 3721a60..54dd308 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -6370,21 +6370,25 @@ expand_function_start (subr, parms_have_cleanups) || current_function_instrument_entry_exit || (flag_exceptions && USING_SJLJ_EXCEPTIONS)) { - /* If function will end with cleanup code for parms, - compute the return values into a pseudo reg, - which we will copy into the true return register - after the cleanups are done. */ - - enum machine_mode mode = DECL_MODE (DECL_RESULT (subr)); - -#ifdef PROMOTE_FUNCTION_RETURN - tree type = TREE_TYPE (DECL_RESULT (subr)); - int unsignedp = TREE_UNSIGNED (type); - - mode = promote_mode (type, mode, &unsignedp, 1); -#endif + /* If function will end with cleanup code for parms, compute the + return values into a pseudo reg, which we will copy into the + true return register after the cleanups are done. */ + + /* In order to figure out what mode to use for the pseudo, we + figure out what the mode of the eventual return register will + actually be, and use that. */ + rtx hard_reg + = hard_function_value (TREE_TYPE (DECL_RESULT (subr)), + subr, 1); + + /* Since we know the return value is not an aggregate, we should + have a REG here. */ + if (!REG_P (hard_reg)) + abort (); - SET_DECL_RTL (DECL_RESULT (subr), gen_reg_rtx (mode)); + /* Create the pseudo. */ + SET_DECL_RTL (DECL_RESULT (subr), + gen_reg_rtx (GET_MODE (hard_reg))); /* Needed because we may need to move this to memory in case it's a named return value whose address is taken. */ DECL_REGISTER (DECL_RESULT (subr)) = 1; |