summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZack Weinberg <zack@codesourcery.com>2004-10-28 21:00:59 +0000
committerZack Weinberg <zack@gcc.gnu.org>2004-10-28 21:00:59 +0000
commit859ee18fb4c2e7a26567f7ea00d02b717c807b5b (patch)
tree7d9c470d1f05a6fb0bdc636091edfcc634cf66a5
parent883a2bff66fbcba913f3c21427a0551d8624dc6b (diff)
downloadgcc-859ee18fb4c2e7a26567f7ea00d02b717c807b5b.tar.gz
re PR debug/18199 (AIX XCOFF debugging broken)
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. From-SVN: r89781
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/dbxout.c24
-rw-r--r--gcc/xcoffout.h61
3 files changed, 63 insertions, 33 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a0900041385..bb2556900f6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/dbxout.c b/gcc/dbxout.c
index f1bde1dd6ea..7ed47b622f7 100644
--- a/gcc/dbxout.c
+++ b/gcc/dbxout.c
@@ -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);
diff --git a/gcc/xcoffout.h b/gcc/xcoffout.h
index 59a0d3a0106..a3d28995669 100644
--- a/gcc/xcoffout.h
+++ b/gcc/xcoffout.h
@@ -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