X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;ds=sidebyside;f=gcc%2Fxcoffout.c;h=6ee08ec2fb103aab4a534ad8dc8d80e4583799e5;hb=ccdcb79ef50430739d8131568b897240eca340ac;hp=b586a8f47ef2ac3c83ea0bc63e61f2debb6c1238;hpb=688a78594915f54bb3046fc35cdd2d2d7f696427;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/xcoffout.c b/gcc/xcoffout.c index b586a8f47ef..6ee08ec2fb1 100644 --- a/gcc/xcoffout.c +++ b/gcc/xcoffout.c @@ -1,5 +1,5 @@ /* Output xcoff-format symbol table information from GNU compiler. - Copyright (C) 1992 Free Software Foundation, Inc. + Copyright (C) 1992, 1994, 1995, 1997, 1998 Free Software Foundation, Inc. This file is part of GNU CC. @@ -15,7 +15,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +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 @@ -23,13 +24,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ interface. Many functions are very similar to their counterparts in sdbout.c. */ -/* Include this first, because it may define MIN and MAX. */ -#include - #include "config.h" +#include "system.h" #include "tree.h" #include "rtl.h" #include "flags.h" +#include "toplev.h" +#include "output.h" #ifdef XCOFF_DEBUGGING_INFO @@ -37,8 +38,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, 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 @@ -52,7 +54,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Line number of beginning of current function, minus one. Negative means not in a function or not using xcoff. */ -int xcoff_begin_function_line = -1; +static int xcoff_begin_function_line = -1; +static int xcoff_inlining = 0; /* Name of the current include file. */ @@ -63,7 +66,7 @@ char *xcoff_current_include_file; (by including that file of course), then the line number will be absolute. */ -char *xcoff_current_function_file; +static char *xcoff_current_function_file; /* Names of bss and data sections. These should be unique names for each compilation unit. */ @@ -71,12 +74,22 @@ char *xcoff_current_function_file; char *xcoff_bss_section_name; char *xcoff_private_data_section_name; char *xcoff_read_only_section_name; + +/* Last source file name mentioned in a NOTE insn. */ + +char *xcoff_lastfile; /* Macro definitions used below. */ -/* Ensure we don't output a negative line number. */ -#define MAKE_LINE_SAFE(LINE) \ - if (LINE <= xcoff_begin_function_line) \ - LINE = xcoff_begin_function_line + 1 \ + +#define ABS_OR_RELATIVE_LINENO(LINENO) \ +((xcoff_inlining) ? (LINENO) : (LINENO) - xcoff_begin_function_line) + +/* Output source line numbers via ".line" rather than ".stabd". */ +#define ASM_OUTPUT_SOURCE_LINE(FILE,LINENUM) \ + do { \ + if (xcoff_begin_function_line >= 0) \ + fprintf (FILE, "\t.line\t%d\n", ABS_OR_RELATIVE_LINENO (LINENUM)); \ + } while (0) #define ASM_OUTPUT_LFB(FILE,LINENUM) \ { \ @@ -97,18 +110,13 @@ char *xcoff_read_only_section_name; } while (0) #define ASM_OUTPUT_LBB(FILE,LINENUM,BLOCKNUM) \ - do { \ - int linenum = LINENUM; \ - MAKE_LINE_SAFE (linenum); \ - fprintf (FILE, "\t.bb\t%d\n", ABS_OR_RELATIVE_LINENO (linenum)); \ - } while (0) + fprintf (FILE, "\t.bb\t%d\n", ABS_OR_RELATIVE_LINENO (LINENUM)) #define ASM_OUTPUT_LBE(FILE,LINENUM,BLOCKNUM) \ - do { \ - int linenum = LINENUM; \ - MAKE_LINE_SAFE (linenum); \ - fprintf (FILE, "\t.eb\t%d\n", ABS_OR_RELATIVE_LINENO (linenum)); \ - } while (0) + 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)); /* Support routines for XCOFF debugging info. */ @@ -144,22 +152,22 @@ xcoff_output_standard_types (syms) assign_type_number (syms, "int", -1); assign_type_number (syms, "char", -2); assign_type_number (syms, "short int", -3); - assign_type_number (syms, "long int", -4); + assign_type_number (syms, "long int", (TARGET_64BIT ? -31 : -4)); assign_type_number (syms, "unsigned char", -5); assign_type_number (syms, "signed char", -6); assign_type_number (syms, "short unsigned int", -7); assign_type_number (syms, "unsigned int", -8); /* No such type "unsigned". */ - assign_type_number (syms, "long unsigned int", -10); + assign_type_number (syms, "long unsigned int", (TARGET_64BIT ? -32 : -10)); assign_type_number (syms, "void", -11); assign_type_number (syms, "float", -12); assign_type_number (syms, "double", -13); assign_type_number (syms, "long double", -14); /* Pascal and Fortran types run from -15 to -29. */ - /* No such type "wchar". */ - - /* "long long int", and "long long unsigned int", are not handled here, - because there are no predefined types that match them. */ + assign_type_number (syms, "wchar", -30); + assign_type_number (syms, "long long int", -31); + assign_type_number (syms, "long long unsigned int", -32); + /* Additional Fortran types run from -33 to -37. */ /* ??? Should also handle built-in C++ and Obj-C types. There perhaps aren't any that C doesn't already have. */ @@ -169,7 +177,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) @@ -312,20 +320,55 @@ stab_to_sclass (stab) abort (); } } - -/* In XCOFF, we have to have this .bf before the function prologue. - Rely on the value of `dbx_begin_function_line' not to duplicate .bf. */ + +/* Output debugging info to FILE to switch to sourcefile FILENAME. + INLINE_P is true if this is from an inlined function. */ void -xcoffout_output_first_source_line (file, last_linenum) +xcoffout_source_file (file, filename, inline_p) FILE *file; - int last_linenum; + char *filename; + int inline_p; { - ASM_OUTPUT_LFB (file, last_linenum); - dbxout_parms (DECL_ARGUMENTS (current_function_decl)); - ASM_OUTPUT_SOURCE_LINE (file, last_linenum); + if (filename + && (xcoff_lastfile == 0 || strcmp (filename, xcoff_lastfile) + || (inline_p && ! xcoff_inlining) + || (! inline_p && xcoff_inlining))) + { + if (xcoff_current_include_file) + { + fprintf (file, "\t.ei\t"); + output_quoted_string (file, xcoff_current_include_file); + fprintf (file, "\n"); + xcoff_current_include_file = NULL; + } + xcoff_inlining=inline_p; + if (strcmp (main_input_filename, filename) || inline_p) + { + fprintf (file, "\t.bi\t"); + output_quoted_string (file, filename); + fprintf (file, "\n"); + xcoff_current_include_file = filename; + } + + xcoff_lastfile = filename; + } } +/* Output a line number symbol entry into output stream FILE, + for source file FILENAME and line number NOTE. */ + +void +xcoffout_source_line (file, filename, note) + FILE *file; + char *filename; + rtx note; +{ + xcoffout_source_file (file, filename, RTX_INTEGRATED_P (note)); + + ASM_OUTPUT_SOURCE_LINE (file, NOTE_LINE_NUMBER (note)); +} + /* Output the symbols defined in block number DO_BLOCK. Set NEXT_BLOCK_NUMBER to 0 before calling. @@ -423,22 +466,28 @@ xcoffout_declare_function (file, decl, name) char *n = name; int i; - for (i = 0; name[i]; ++i) - { - if (name[i] == '[') - { - n = (char *) alloca (i + 1); - strncpy (n, name, i); - n[i] = '\0'; - break; - } - } + if (*n == '*') + n++; + else + for (i = 0; name[i]; ++i) + { + if (name[i] == '[') + { + n = (char *) alloca (i + 1); + strncpy (n, name, i); + n[i] = '\0'; + break; + } + } - /* Any pending .bi or .ei must occur before the .function psuedo op. + /* Any pending .bi or .ei must occur before the .function pseudo op. Otherwise debuggers will think that the function is in the previous file and/or at the wrong line number. */ - dbxout_source_file (file, DECL_SOURCE_FILE (decl)); + xcoffout_source_file (file, DECL_SOURCE_FILE (decl), 0); dbxout_symbol (decl, 0); + + /* .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", n, n, n, n); } @@ -453,6 +502,18 @@ xcoffout_begin_function (file, last_linenum) int 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 = 0; + next_block_number = 0; + xcoffout_block (DECL_INITIAL (current_function_decl), 0, + DECL_ARGUMENTS (current_function_decl)); + + ASM_OUTPUT_SOURCE_LINE (file, last_linenum); } /* Called at end of function (before epilogue).