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:
parent
883a2bff66
commit
859ee18fb4
|
@ -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.
|
||||||
|
|
24
gcc/dbxout.c
24
gcc/dbxout.c
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue