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
This commit is contained in:
Zack Weinberg 2004-10-28 21:00:59 +00:00 committed by Zack Weinberg
parent 883a2bff66
commit 859ee18fb4
3 changed files with 63 additions and 33 deletions

View File

@ -1,5 +1,16 @@
2004-10-28 Zack Weinberg <zack@codesourcery.com> 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 * varasm.c (function_section): If DECL is NULL_TREE, don't try
to do anything else. Do not call get_insns if cfun or to do anything else. Do not call get_insns if cfun or
cfun->emit are NULL. cfun->emit are NULL.

View File

@ -619,6 +619,16 @@ dbxout_begin_complex_stabs (void)
gcc_assert (stabstr_last_contin_point == 0); 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. */ /* Add CHR, a single character, to the string being built. */
#define stabstr_C(chr) obstack_1grow (&stabstr_ob, chr) #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. all of the arguments to the .stabs directive after the string.
Overridden by xcoffout.h. CODE is the stabs code for this symbol; 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 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 ADDR, LABEL, and NUMBER are three different ways to represent the
stabs value field. At most one of these should be nonzero. 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. */ register variable). It represents the value as a decimal integer. */
#ifndef DBX_FINISH_STABS #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; \ int line_ = use_gnu_debug_info_extensions ? LINE : 0; \
\ \
dbxout_int (CODE); \ dbxout_int (CODE); \
@ -864,7 +875,8 @@ dbxout_finish_complex_stabs (tree sym, STAB_CODE_TYPE code,
len -= chunklen + 1; len -= chunklen + 1;
/* Only put a line number on the last stab in the sequence. */ /* 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) if (len == 0)
break; break;
@ -883,7 +895,7 @@ dbxout_finish_complex_stabs (tree sym, STAB_CODE_TYPE code,
str = obstack_finish (&stabstr_ob); str = obstack_finish (&stabstr_ob);
fwrite (str, 1, len, asm_out_file); 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); obstack_free (&stabstr_ob, str);
} }
@ -2901,12 +2913,14 @@ dbxout_symbol_location (tree decl, tree type, const char *suffix, rtx home)
return 0; return 0;
/* Ok, start a symtab entry and output the variable name. */ /* Ok, start a symtab entry and output the variable name. */
emit_pending_bincls_if_required ();
FORCE_TEXT;
#ifdef DBX_STATIC_BLOCK_START #ifdef DBX_STATIC_BLOCK_START
DBX_STATIC_BLOCK_START (asm_out_file, code); DBX_STATIC_BLOCK_START (asm_out_file, code);
#endif #endif
dbxout_begin_complex_stabs (); dbxout_begin_complex_stabs_noforcetext ();
dbxout_symbol_name (decl, suffix, letter); dbxout_symbol_name (decl, suffix, letter);
dbxout_type (type, 0); dbxout_type (type, 0);
dbxout_finish_complex_stabs (decl, code, addr, 0, number); dbxout_finish_complex_stabs (decl, code, addr, 0, number);

View 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 /* Define our own finish symbol function, since xcoff stabs have their
own different format. */ own different format. */
#define DBX_FINISH_STABS(CODE, LINE, ADDR, LABEL, NUMBER) do { \ #define DBX_FINISH_STABS(SYM, CODE, LINE, ADDR, LABEL, NUMBER) do { \
if (ADDR) \ if (ADDR) \
{ \ { \
/* If we are writing a function name, we must ensure that \ /* If we are writing a function name, we must emit a dot in \
there is no storage-class suffix on the name. */ \ order to refer to the function code, not its descriptor. */ \
if (CODE == N_FUN && GET_CODE (ADDR) == SYMBOL_REF) \ if (CODE == N_FUN) \
{ \ putc ('.', asm_out_file); \
const char *_p = XSTR (ADDR, 0); \ \
if (*_p == '*') \ /* If we are writing a function name, we must ensure that \
fputs (_p+1, asm_out_file); \ there is no storage-class suffix on the name. */ \
else \ if (CODE == N_FUN && GET_CODE (ADDR) == SYMBOL_REF) \
for (; *_p != '[' && *_p; _p++) \ { \
putc (*_p, asm_out_file); \ const char *_p = XSTR (ADDR, 0); \
} \ if (*_p == '*') \
else \ fputs (_p+1, asm_out_file); \
{ \ else \
if (CODE == N_FUN) \ for (; *_p != '[' && *_p; _p++) \
putc ('.', asm_out_file); \ putc (*_p, asm_out_file); \
output_addr_const (asm_out_file, ADDR); \ } \
} \ else \
} \ output_addr_const (asm_out_file, ADDR); \
else if (LABEL) \ } \
assemble_name (asm_out_file, LABEL); \ /* Another special case: N_GSYM always gets the symbol name, \
else \ whether or not LABEL or NUMBER are set. */ \
dbxout_int (NUMBER); \ else if (CODE == N_GSYM) \
putc (',', asm_out_file); \ assemble_name (asm_out_file, XSTR (XEXP (DECL_RTL (SYM), 0), 0)); \
dbxout_int (stab_to_sclass (CODE)); \ else if (LABEL) \
fputs (",0\n", asm_out_file); \ 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) } while (0)
/* These are IBM XCOFF extensions we need to reference in dbxout.c /* These are IBM XCOFF extensions we need to reference in dbxout.c