diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a0900041385f..bb2556900f6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,16 @@ 2004-10-28 Zack Weinberg + 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 f1bde1dd6ea7..7ed47b622f76 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 59a0d3a01064..a3d289956698 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