OSDN Git Service

* function.c (expand_function_start): Avoid creating BLKmode
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 May 2001 07:25:50 +0000 (07:25 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 May 2001 07:25:50 +0000 (07:25 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42254 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c
gcc/function.c

index 724c656..cf69425 100644 (file)
@@ -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.
index 6b825cf..5c05d03 100644 (file)
@@ -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);
index 3721a60..54dd308 100644 (file)
@@ -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;