X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fxcoffout.c;h=6c8c2fe0599b25eb7435673b32c8e32d3385c107;hb=905324d03694883c66ecc6e2a39f377a73561333;hp=90ed5e3da62f1f4b323a97e399743a855407f5fc;hpb=405711de1a18d9de11292807ceab1873285ffeeb;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/xcoffout.c b/gcc/xcoffout.c index 90ed5e3da62..6c8c2fe0599 100644 --- a/gcc/xcoffout.c +++ b/gcc/xcoffout.c @@ -1,5 +1,6 @@ /* Output xcoff-format symbol table information from GNU compiler. - Copyright (C) 1992, 1994, 1995, 1997 Free Software Foundation, Inc. + Copyright (C) 1992, 1994, 1995, 1997, 1998, 1999, 2000 + Free Software Foundation, Inc. This file is part of GNU CC. @@ -18,7 +19,6 @@ along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - /* Output xcoff-format symbol table data. The main functionality is contained in dbxout.c. This file implements the sdbout-like parts of the xcoff interface. Many functions are very similar to their counterparts in @@ -29,6 +29,9 @@ Boston, MA 02111-1307, USA. */ #include "tree.h" #include "rtl.h" #include "flags.h" +#include "toplev.h" +#include "output.h" +#include "ggc.h" #ifdef XCOFF_DEBUGGING_INFO @@ -36,8 +39,9 @@ Boston, MA 02111-1307, USA. */ #include #include "xcoffout.h" +#include "dbxout.h" -#if defined (USG) || defined (NO_STAB_H) +#if defined (USG) || !defined (HAVE_STAB_H) #include "gstab.h" #else #include @@ -56,14 +60,14 @@ static int xcoff_inlining = 0; /* Name of the current include file. */ -char *xcoff_current_include_file; +const char *xcoff_current_include_file; /* Name of the current function file. This is the file the `.bf' is emitted from. In case a line is emitted from a different file, (by including that file of course), then the line number will be absolute. */ -static char *xcoff_current_function_file; +static const char *xcoff_current_function_file; /* Names of bss and data sections. These should be unique names for each compilation unit. */ @@ -74,7 +78,7 @@ char *xcoff_read_only_section_name; /* Last source file name mentioned in a NOTE insn. */ -char *xcoff_lastfile; +const char *xcoff_lastfile; /* Macro definitions used below. */ @@ -112,8 +116,9 @@ char *xcoff_lastfile; #define ASM_OUTPUT_LBE(FILE,LINENUM,BLOCKNUM) \ fprintf (FILE, "\t.eb\t%d\n", ABS_OR_RELATIVE_LINENO (LINENUM)) -static void assign_type_number PROTO((tree, char *, int)); -static void xcoffout_block PROTO((tree, int, tree)); +static void assign_type_number PARAMS ((tree, const char *, int)); +static void xcoffout_block PARAMS ((tree, int, tree)); +static void xcoffout_source_file PARAMS ((FILE *, const char *, int)); /* Support routines for XCOFF debugging info. */ @@ -123,7 +128,7 @@ static void xcoffout_block PROTO((tree, int, tree)); static void assign_type_number (syms, name, number) tree syms; - char *name; + const char *name; int number; { tree decl; @@ -174,7 +179,7 @@ xcoff_output_standard_types (syms) #define UNKNOWN_STAB(STR) \ do { \ - fprintf(stderr, "Error, unknown stab %s: : 0x%x\n", STR, stab); \ + error ("Unknown stab %s: : 0x%x\n", STR, stab); \ fflush (stderr); \ } while (0) @@ -190,8 +195,8 @@ stab_to_sclass (stab) return C_GSYM; case N_FNAME: - UNKNOWN_STAB ("N_FNAME"); - abort(); + UNKNOWN_STAB ("N_FNAME"); + abort (); case N_FUN: return C_FUN; @@ -202,7 +207,7 @@ stab_to_sclass (stab) #ifdef N_MAIN case N_MAIN: - UNKNOWN_STAB ("N_MAIN"); + UNKNOWN_STAB ("N_MAIN"); abort (); #endif @@ -210,7 +215,7 @@ stab_to_sclass (stab) return C_RSYM; case N_SSYM: - UNKNOWN_STAB ("N_SSYM"); + UNKNOWN_STAB ("N_SSYM"); abort (); case N_RPSYM: @@ -226,59 +231,59 @@ stab_to_sclass (stab) return C_ENTRY; case N_SO: - UNKNOWN_STAB ("N_SO"); + UNKNOWN_STAB ("N_SO"); abort (); case N_SOL: - UNKNOWN_STAB ("N_SOL"); + UNKNOWN_STAB ("N_SOL"); abort (); case N_SLINE: - UNKNOWN_STAB ("N_SLINE"); + UNKNOWN_STAB ("N_SLINE"); abort (); #ifdef N_DSLINE case N_DSLINE: - UNKNOWN_STAB ("N_DSLINE"); + UNKNOWN_STAB ("N_DSLINE"); abort (); #endif #ifdef N_BSLINE case N_BSLINE: - UNKNOWN_STAB ("N_BSLINE"); + UNKNOWN_STAB ("N_BSLINE"); abort (); #endif #if 0 /* This has the same value as N_BSLINE. */ case N_BROWS: - UNKNOWN_STAB ("N_BROWS"); + UNKNOWN_STAB ("N_BROWS"); abort (); #endif #ifdef N_BINCL case N_BINCL: - UNKNOWN_STAB ("N_BINCL"); + UNKNOWN_STAB ("N_BINCL"); abort (); #endif #ifdef N_EINCL case N_EINCL: - UNKNOWN_STAB ("N_EINCL"); + UNKNOWN_STAB ("N_EINCL"); abort (); #endif #ifdef N_EXCL case N_EXCL: - UNKNOWN_STAB ("N_EXCL"); + UNKNOWN_STAB ("N_EXCL"); abort (); #endif case N_LBRAC: - UNKNOWN_STAB ("N_LBRAC"); + UNKNOWN_STAB ("N_LBRAC"); abort (); case N_RBRAC: - UNKNOWN_STAB ("N_RBRAC"); + UNKNOWN_STAB ("N_RBRAC"); abort (); case N_BCOMM: @@ -289,42 +294,42 @@ stab_to_sclass (stab) return C_ECOML; case N_LENG: - UNKNOWN_STAB ("N_LENG"); + UNKNOWN_STAB ("N_LENG"); abort (); case N_PC: - UNKNOWN_STAB ("N_PC"); + UNKNOWN_STAB ("N_PC"); abort (); #ifdef N_M2C case N_M2C: - UNKNOWN_STAB ("N_M2C"); + UNKNOWN_STAB ("N_M2C"); abort (); #endif #ifdef N_SCOPE case N_SCOPE: - UNKNOWN_STAB ("N_SCOPE"); + UNKNOWN_STAB ("N_SCOPE"); abort (); #endif case N_CATCH: - UNKNOWN_STAB ("N_CATCH"); + UNKNOWN_STAB ("N_CATCH"); abort (); default: - UNKNOWN_STAB ("default"); + UNKNOWN_STAB ("default"); abort (); - } + } } /* Output debugging info to FILE to switch to sourcefile FILENAME. INLINE_P is true if this is from an inlined function. */ -void +static void xcoffout_source_file (file, filename, inline_p) FILE *file; - char *filename; + const char *filename; int inline_p; { if (filename @@ -339,7 +344,7 @@ xcoffout_source_file (file, filename, inline_p) fprintf (file, "\n"); xcoff_current_include_file = NULL; } - xcoff_inlining=inline_p; + xcoff_inlining = inline_p; if (strcmp (main_input_filename, filename) || inline_p) { fprintf (file, "\t.bi\t"); @@ -347,7 +352,6 @@ xcoffout_source_file (file, filename, inline_p) fprintf (file, "\n"); xcoff_current_include_file = filename; } - xcoff_lastfile = filename; } } @@ -358,7 +362,7 @@ xcoffout_source_file (file, filename, inline_p) void xcoffout_source_line (file, filename, note) FILE *file; - char *filename; + const char *filename; rtx note; { xcoffout_source_file (file, filename, RTX_INTEGRATED_P (note)); @@ -367,15 +371,12 @@ xcoffout_source_line (file, filename, note) } /* Output the symbols defined in block number DO_BLOCK. - Set NEXT_BLOCK_NUMBER to 0 before calling. This function works by walking the tree structure of blocks, counting blocks until it finds the desired block. */ static int do_block = 0; -static int next_block_number; - static void xcoffout_block (block, depth, args) register tree block; @@ -388,7 +389,7 @@ xcoffout_block (block, depth, args) if (TREE_USED (block)) { /* When we reach the specified block, output its symbols. */ - if (next_block_number == do_block) + if (BLOCK_NUMBER (block) == do_block) { /* Output the syms of the block. */ if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0) @@ -400,11 +401,9 @@ xcoffout_block (block, depth, args) return; } /* If we are past the specified block, stop the scan. */ - else if (next_block_number >= do_block) + else if (BLOCK_NUMBER (block) >= do_block) return; - next_block_number++; - /* Output the subblocks. */ xcoffout_block (BLOCK_SUBBLOCKS (block), depth + 1, NULL_TREE); } @@ -428,14 +427,12 @@ xcoffout_begin_block (file, line, n) { tree decl = current_function_decl; - /* The IBM AIX compiler does not emit a .bb for the function level scope, so we avoid it here also. */ if (n != 1) ASM_OUTPUT_LBB (file, line, n); do_block = n; - next_block_number = 0; xcoffout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl)); } @@ -458,21 +455,21 @@ void xcoffout_declare_function (file, decl, name) FILE *file; tree decl; - char *name; + const char *name; { - char *n = name; int i; - if (*n == '*') - n++; + if (*name == '*') + name++; else for (i = 0; name[i]; ++i) { if (name[i] == '[') { - n = (char *) alloca (i + 1); + char *n = (char *) alloca (i + 1); strncpy (n, name, i); n[i] = '\0'; + name = n; break; } } @@ -482,7 +479,11 @@ xcoffout_declare_function (file, decl, name) file and/or at the wrong line number. */ xcoffout_source_file (file, DECL_SOURCE_FILE (decl), 0); dbxout_symbol (decl, 0); - fprintf (file, "\t.function .%s,.%s,16,044,FE..%s-.%s\n", n, n, n, n); + + /* .function NAME, TOP, MAPPING, TYPE, SIZE + 16 and 044 are placeholders for backwards compatibility */ + fprintf (file, "\t.function .%s,.%s,16,044,FE..%s-.%s\n", + name, name, name, name); } /* Called at beginning of function body (after prologue). @@ -497,6 +498,15 @@ xcoffout_begin_function (file, last_linenum) { ASM_OUTPUT_LFB (file, last_linenum); dbxout_parms (DECL_ARGUMENTS (current_function_decl)); + + /* Emit the symbols for the outermost BLOCK's variables. sdbout.c does this + in sdbout_begin_block, but there is no guarantee that there will be any + inner block 1, so we must do it here. This gives a result similar to + dbxout, so it does make some sense. */ + do_block = BLOCK_NUMBER (DECL_INITIAL (current_function_decl)); + xcoffout_block (DECL_INITIAL (current_function_decl), 0, + DECL_ARGUMENTS (current_function_decl)); + ASM_OUTPUT_SOURCE_LINE (file, last_linenum); } @@ -523,7 +533,7 @@ xcoffout_end_epilogue (file) aux entry. So, we emit a label after the last instruction which can be used by the .function pseudo op to calculate the function size. */ - char *fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0); + const char *fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0); if (*fname == '*') ++fname; fprintf (file, "FE..");