This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

dbxout fixes for AIX/XCOFF


This patch corrects a number of bugs in XCOFF debug support which were
introduced by my patches to speed up vanilla STABS debug support.

1) The FORCE_TEXT operation has to occur before DBX_STATIC_BLOCK_START,
or the .bs and .es markers will be in different sections and gdb will
crash.

2) The special case for N_GSYM in the xcoffout.h definition of
   DBX_FINISH_STABS had gotten entirely lost.

3) The special case for N_FUN in the same macro was not working
   correctly, causing function name stabs to refer to the descriptor
   instead of the function's code.

Thanks to David Edelsohn for identifying the problem, providing me
with test cases, and working through the bug fixes with me on IRC.

This fixes PR 18199.

zw

        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.

===================================================================
Index: dbxout.c
--- dbxout.c	27 Oct 2004 17:31:14 -0000	1.213
+++ dbxout.c	28 Oct 2004 20:54:43 -0000
@@ -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, S
 	  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, S
       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 
     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: xcoffout.h
--- xcoffout.h	27 Oct 2004 01:29:40 -0000	1.27
+++ xcoffout.h	28 Oct 2004 20:54:43 -0000
@@ -68,34 +68,39 @@ Software Foundation, 59 Temple Place - S
 /* 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]