OSDN Git Service

PR 18199
authorzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Oct 2004 21:00:59 +0000 (21:00 +0000)
committerzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Oct 2004 21:00:59 +0000 (21:00 +0000)
* dbxout.c (dbxout_begin_complex_stabs_noforcetext): New function.
(DBX_FINISH_STABS): Add (unused by default) SYM parameter.
(dbxout_finish_complex_stabs): Update to match.
(dbxout_symbol_location): Call emit_pending_bincls_if_required
and FORCE_TEXT before DBX_STATIC_BLOCK_START.  Use
dbxout_begin_complex_stabs_noforcetext.
* xcoffout.h (DBX_FINISH_STABS): Restore special case for
N_GSYM, using new SYM parameter.  Correct logic for special
cases for N_FUN.

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

gcc/ChangeLog
gcc/dbxout.c
gcc/xcoffout.h

index a090004..bb25569 100644 (file)
@@ -1,5 +1,16 @@
 2004-10-28  Zack Weinberg  <zack@codesourcery.com>
 
+       PR 18199
+       * dbxout.c (dbxout_begin_complex_stabs_noforcetext): New function.
+       (DBX_FINISH_STABS): Add (unused by default) SYM parameter.
+       (dbxout_finish_complex_stabs): Update to match.
+       (dbxout_symbol_location): Call emit_pending_bincls_if_required
+       and FORCE_TEXT before DBX_STATIC_BLOCK_START.  Use
+       dbxout_begin_complex_stabs_noforcetext.
+       * xcoffout.h (DBX_FINISH_STABS): Restore special case for
+       N_GSYM, using new SYM parameter.  Correct logic for special
+       cases for N_FUN.
+
        * varasm.c (function_section): If DECL is NULL_TREE, don't try
        to do anything else.  Do not call get_insns if cfun or
        cfun->emit are NULL.
index f1bde1d..7ed47b6 100644 (file)
@@ -619,6 +619,16 @@ dbxout_begin_complex_stabs (void)
   gcc_assert (stabstr_last_contin_point == 0);
 }
 
+/* As above, but do not force text or emit pending bincls.  This is
+   used by dbxout_symbol_location, which needs to do something else.  */
+static void
+dbxout_begin_complex_stabs_noforcetext (void)
+{
+  fputs (ASM_STABS_OP, asm_out_file);
+  putc ('"', asm_out_file);
+  gcc_assert (stabstr_last_contin_point == 0);
+}
+
 /* Add CHR, a single character, to the string being built.  */
 #define stabstr_C(chr) obstack_1grow (&stabstr_ob, chr)
 
@@ -786,7 +796,7 @@ stabstr_continue (void)
    all of the arguments to the .stabs directive after the string.
    Overridden by xcoffout.h.  CODE is the stabs code for this symbol;
    LINE is the source line to write into the desc field (in extended
-   mode).
+   mode); SYM is the symbol itself.
 
    ADDR, LABEL, and NUMBER are three different ways to represent the
    stabs value field.  At most one of these should be nonzero.
@@ -802,7 +812,8 @@ stabstr_continue (void)
      register variable).  It represents the value as a decimal integer.  */
 
 #ifndef DBX_FINISH_STABS
-#define DBX_FINISH_STABS(CODE, LINE, ADDR, LABEL, NUMBER) do { \
+#define DBX_FINISH_STABS(SYM, CODE, LINE, ADDR, LABEL, NUMBER) \
+do {                                                           \
   int line_ = use_gnu_debug_info_extensions ? LINE : 0;                \
                                                                \
   dbxout_int (CODE);                                           \
@@ -864,7 +875,8 @@ dbxout_finish_complex_stabs (tree sym, STAB_CODE_TYPE code,
          len   -= chunklen + 1;
 
          /* Only put a line number on the last stab in the sequence.  */
-         DBX_FINISH_STABS (code, len == 0 ? line : 0, addr, label, number);
+         DBX_FINISH_STABS (sym, code, len == 0 ? line : 0,
+                           addr, label, number);
          if (len == 0)
            break;
 
@@ -883,7 +895,7 @@ dbxout_finish_complex_stabs (tree sym, STAB_CODE_TYPE code,
       str = obstack_finish (&stabstr_ob);
       
       fwrite (str, 1, len, asm_out_file);
-      DBX_FINISH_STABS (code, line, addr, label, number);
+      DBX_FINISH_STABS (sym, code, line, addr, label, number);
     }
   obstack_free (&stabstr_ob, str);
 }
@@ -2901,12 +2913,14 @@ dbxout_symbol_location (tree decl, tree type, const char *suffix, rtx home)
     return 0;
 
   /* Ok, start a symtab entry and output the variable name.  */
+  emit_pending_bincls_if_required ();
+  FORCE_TEXT;
 
 #ifdef DBX_STATIC_BLOCK_START
   DBX_STATIC_BLOCK_START (asm_out_file, code);
 #endif
 
-  dbxout_begin_complex_stabs ();
+  dbxout_begin_complex_stabs_noforcetext ();
   dbxout_symbol_name (decl, suffix, letter);
   dbxout_type (type, 0);
   dbxout_finish_complex_stabs (decl, code, addr, 0, number);
index 59a0d3a..a3d2899 100644 (file)
@@ -68,34 +68,39 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 /* Define our own finish symbol function, since xcoff stabs have their
    own different format.  */
 
-#define DBX_FINISH_STABS(CODE, LINE, ADDR, LABEL, NUMBER) do { \
-  if (ADDR)                                                    \
-    {                                                          \
-      /* If we are writing a function name, we must ensure that        \
-        there is no storage-class suffix on the name.  */      \
-      if (CODE == N_FUN && GET_CODE (ADDR) == SYMBOL_REF)      \
-       {                                                       \
-         const char *_p = XSTR (ADDR, 0);                      \
-         if (*_p == '*')                                       \
-           fputs (_p+1, asm_out_file);                         \
-         else                                                  \
-           for (; *_p != '[' && *_p; _p++)                     \
-             putc (*_p, asm_out_file);                         \
-       }                                                       \
-      else                                                     \
-       {                                                       \
-         if (CODE == N_FUN)                                    \
-           putc ('.', asm_out_file);                           \
-         output_addr_const (asm_out_file, ADDR);               \
-       }                                                       \
-    }                                                          \
-  else if (LABEL)                                              \
-    assemble_name (asm_out_file, LABEL);                       \
-  else                                                         \
-    dbxout_int (NUMBER);                                       \
-  putc (',', asm_out_file);                                    \
-  dbxout_int (stab_to_sclass (CODE));                          \
-  fputs (",0\n", asm_out_file);                                        \
+#define DBX_FINISH_STABS(SYM, CODE, LINE, ADDR, LABEL, NUMBER) do {    \
+  if (ADDR)                                                            \
+    {                                                                  \
+      /* If we are writing a function name, we must emit a dot in      \
+        order to refer to the function code, not its descriptor.  */   \
+      if (CODE == N_FUN)                                               \
+       putc ('.', asm_out_file);                                       \
+                                                                       \
+      /* If we are writing a function name, we must ensure that                \
+        there is no storage-class suffix on the name.  */              \
+      if (CODE == N_FUN && GET_CODE (ADDR) == SYMBOL_REF)              \
+       {                                                               \
+         const char *_p = XSTR (ADDR, 0);                              \
+         if (*_p == '*')                                               \
+           fputs (_p+1, asm_out_file);                                 \
+         else                                                          \
+           for (; *_p != '[' && *_p; _p++)                             \
+             putc (*_p, asm_out_file);                                 \
+       }                                                               \
+      else                                                             \
+       output_addr_const (asm_out_file, ADDR);                         \
+    }                                                                  \
+  /* Another special case: N_GSYM always gets the symbol name,         \
+     whether or not LABEL or NUMBER are set.  */                       \
+  else if (CODE == N_GSYM)                                             \
+    assemble_name (asm_out_file, XSTR (XEXP (DECL_RTL (SYM), 0), 0));  \
+  else if (LABEL)                                                      \
+    assemble_name (asm_out_file, LABEL);                               \
+  else                                                                 \
+    dbxout_int (NUMBER);                                               \
+  putc (',', asm_out_file);                                            \
+  dbxout_int (stab_to_sclass (CODE));                                  \
+  fputs (",0\n", asm_out_file);                                                \
 } while (0)
 
 /* These are IBM XCOFF extensions we need to reference in dbxout.c