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.
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)
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.
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); \
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;
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);
}
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);
/* 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