xcoffout.h revision 90075
118334Speter/* XCOFF definitions.  These are needed in dbxout.c, final.c,
252284Sobrien   and xcoffout.h.
390075Sobrien   Copyright (C) 1998, 2000 Free Software Foundation, Inc.
418334Speter
590075SobrienThis file is part of GCC.
652284Sobrien
790075SobrienGCC is free software; you can redistribute it and/or modify it under
890075Sobrienthe terms of the GNU General Public License as published by the Free
990075SobrienSoftware Foundation; either version 2, or (at your option) any later
1090075Sobrienversion.
1152284Sobrien
1290075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1390075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1490075SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1590075Sobrienfor more details.
1652284Sobrien
1752284SobrienYou should have received a copy of the GNU General Public License
1890075Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
1990075SobrienSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA
2090075Sobrien02111-1307, USA.  */
2152284Sobrien
2252284Sobrien
2390075Sobrien#define ASM_STABS_OP "\t.stabx\t"
2418334Speter
2518334Speter/* Tags and typedefs are C_DECL in XCOFF, not C_LSYM.  */
2618334Speter
2718334Speter#define DBX_TYPE_DECL_STABS_CODE N_DECL
2818334Speter
2918334Speter/* Use the XCOFF predefined type numbers.  */
3018334Speter
3118334Speter/* ??? According to metin, typedef stabx must go in text control section,
3218334Speter   but he did not make this changes everywhere where such typedef stabx
3318334Speter   can be emitted, so it is really needed or not?  */
3418334Speter
3518334Speter#define DBX_OUTPUT_STANDARD_TYPES(SYMS)		\
3618334Speter{						\
3718334Speter  text_section ();				\
3818334Speter  xcoff_output_standard_types (SYMS);		\
3918334Speter}
4018334Speter
4118334Speter/* Any type with a negative type index has already been output.  */
4218334Speter
4318334Speter#define DBX_TYPE_DEFINED(TYPE) (TYPE_SYMTAB_ADDRESS (TYPE) < 0)
4418334Speter
4518334Speter/* Must use N_STSYM for static const variables (those in the text section)
4618334Speter   instead of N_FUN.  */
4718334Speter
4818334Speter#define DBX_STATIC_CONST_VAR_CODE N_STSYM
4918334Speter
5018334Speter/* For static variables, output code to define the start of a static block.
5118334Speter
5218334Speter   ??? The IBM rs6000/AIX assembler has a bug that causes bss block debug
5318334Speter   info to be occasionally lost.  A simple example is this:
5418334Speter	int a; static int b;
5518334Speter   The commands `gcc -g -c tmp.c; dump -t tmp.o' gives
5618334Speter[10]	m   0x00000016         1     0    0x8f  0x0000            .bs
5718334Speter[11]	m   0x00000000         1     0    0x90  0x0000            .es
5818334Speter...
5918334Speter[21]	m   0x00000000        -2     0    0x85  0x0000            b:S-1
6018334Speter   which is wrong.  The `b:S-1' must be between the `.bs' and `.es'.
6118334Speter   We can apparently work around the problem by forcing the text section
6218334Speter   (even if we are already in the text section) immediately before outputting
6318334Speter   the `.bs'.  This should be fixed in the next major AIX release (3.3?).  */
6418334Speter
6518334Speter#define DBX_STATIC_BLOCK_START(ASMFILE,CODE)				\
6618334Speter{									\
6718334Speter  if ((CODE) == N_STSYM)						\
6818334Speter    fprintf ((ASMFILE), "\t.bs\t%s[RW]\n", xcoff_private_data_section_name);\
6918334Speter  else if ((CODE) == N_LCSYM)						\
7018334Speter    {									\
7118334Speter      fprintf ((ASMFILE), "%s\n", TEXT_SECTION_ASM_OP);			\
7218334Speter      fprintf ((ASMFILE), "\t.bs\t%s\n", xcoff_bss_section_name);	\
7318334Speter    }									\
7418334Speter}
7518334Speter
7618334Speter/* For static variables, output code to define the end of a static block.  */
7718334Speter
7818334Speter#define DBX_STATIC_BLOCK_END(ASMFILE,CODE)				\
7918334Speter{									\
8050397Sobrien  if ((CODE) == N_STSYM || (CODE) == N_LCSYM)				\
8150397Sobrien    fputs ("\t.es\n", (ASMFILE));					\
8218334Speter}
8318334Speter
8418334Speter/* We must use N_RPYSM instead of N_RSYM for register parameters.  */
8518334Speter
8618334Speter#define DBX_REGPARM_STABS_CODE N_RPSYM
8718334Speter
8818334Speter/* We must use 'R' instead of 'P' for register parameters.  */
8918334Speter
9018334Speter#define DBX_REGPARM_STABS_LETTER 'R'
9118334Speter
9218334Speter/* Define our own finish symbol function, since xcoff stabs have their
9318334Speter   own different format.  */
9418334Speter
9518334Speter#define DBX_FINISH_SYMBOL(SYM)					\
9618334Speter{								\
9718334Speter  if (current_sym_addr && current_sym_code == N_FUN)		\
9818334Speter    fprintf (asmfile, "\",.");					\
9918334Speter  else								\
10018334Speter    fprintf (asmfile, "\",");					\
10118334Speter  /* If we are writing a function name, we must ensure that	\
10218334Speter     there is no storage-class suffix on the name.  */		\
10318334Speter  if (current_sym_addr && current_sym_code == N_FUN		\
10418334Speter      && GET_CODE (current_sym_addr) == SYMBOL_REF)		\
10518334Speter    {								\
10690075Sobrien      const char *_p = XSTR (current_sym_addr, 0);		\
10718334Speter      if (*_p == '*')						\
10818334Speter	fprintf (asmfile, "%s", _p+1);				\
10918334Speter      else							\
11018334Speter        for (; *_p != '[' && *_p; _p++)				\
11118334Speter	  fprintf (asmfile, "%c", *_p);				\
11218334Speter    }								\
11318334Speter  else if (current_sym_addr)					\
11418334Speter    output_addr_const (asmfile, current_sym_addr);		\
11518334Speter  else if (current_sym_code == N_GSYM)				\
11618334Speter    assemble_name (asmfile, XSTR (XEXP (DECL_RTL (sym), 0), 0)); \
11718334Speter  else								\
11818334Speter    fprintf (asmfile, "%d", current_sym_value);			\
11918334Speter  fprintf (asmfile, ",%d,0\n", stab_to_sclass (current_sym_code)); \
12018334Speter}
12118334Speter
12218334Speter/* These are IBM XCOFF extensions we need to reference in dbxout.c
12318334Speter   and xcoffout.c.  */
12418334Speter
12518334Speter/* AIX XCOFF uses this for typedefs.  This can have any value, since it is
12618334Speter   only used for translation into a C_DECL storage class.  */
12718334Speter#ifndef N_DECL
12818334Speter#define N_DECL 0x8c
12918334Speter#endif
13018334Speter/* AIX XCOFF uses this for parameters passed in registers.  This can have
13118334Speter   any value, since it is only used for translation into a C_RPSYM storage
13218334Speter   class.  */
13318334Speter#ifndef N_RPSYM
13418334Speter#define N_RPSYM 0x8e
13518334Speter#endif
13618334Speter
13718334Speter/* Name of the current include file.  */
13818334Speter
13990075Sobrienextern const char *xcoff_current_include_file;
14018334Speter
14118334Speter/* Names of bss and data sections.  These should be unique names for each
14218334Speter   compilation unit.  */
14318334Speter
14418334Speterextern char *xcoff_bss_section_name;
14518334Speterextern char *xcoff_private_data_section_name;
14618334Speterextern char *xcoff_read_only_section_name;
14718334Speter
14818334Speter/* Last source file name mentioned in a NOTE insn.  */
14918334Speter
15090075Sobrienextern const char *xcoff_lastfile;
15118334Speter
15218334Speter/* Don't write out path name for main source file.  */
15318334Speter#define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE,FILENAME)
15418334Speter
15518334Speter/* Write out main source file name using ".file" rather than ".stabs".
15618334Speter   We don't actually do this here, because the assembler gets confused if there
15718334Speter   is more than one .file directive.  ASM_FILE_START in config/rs6000/rs6000.h
15818334Speter   is already emitting a .file directory, so we don't output one here also.
15918334Speter   Initialize xcoff_lastfile.  */
16018334Speter#define DBX_OUTPUT_MAIN_SOURCE_FILENAME(FILE,FILENAME) \
16150397Sobrien  xcoff_lastfile = (FILENAME)
16218334Speter
16318334Speter/* If we are still in an include file, its end must be marked.  */
16418334Speter#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)	\
16518334Speter{							\
16618334Speter  if (xcoff_current_include_file)			\
16718334Speter    {							\
16850397Sobrien      fputs ("\t.ei\t", (FILE));			\
16950397Sobrien      output_quoted_string ((FILE), xcoff_current_include_file);	\
17050397Sobrien      putc ('\n', (FILE));				\
17118334Speter      xcoff_current_include_file = NULL;		\
17218334Speter    }							\
17318334Speter}
17418334Speter
17590075Sobrien/* .stabx has the type in a different place.  */
17690075Sobrien#if 0  /* Do not emit any marker for XCOFF until assembler allows XFT_CV.  */
17790075Sobrien#define DBX_OUTPUT_GCC_MARKER(FILE) \
17890075Sobrien  fprintf ((FILE), "%s\"%s\",0,%d,0\n", ASM_STABS_OP, STABS_GCC_MARKER, \
17990075Sobrien	   stab_to_sclass (N_GSYM))
18090075Sobrien#else
18190075Sobrien#define DBX_OUTPUT_GCC_MARKER(FILE)
18290075Sobrien#endif
18390075Sobrien
18418334Speter/* Do not break .stabs pseudos into continuations.  */
18518334Speter#define DBX_CONTIN_LENGTH 0
18618334Speter
18718334Speter/* Don't try to use the `x' type-cross-reference character in DBX data.
18818334Speter   Also has the consequence of putting each struct, union or enum
18918334Speter   into a separate .stabs, containing only cross-refs to the others.  */
19018334Speter#define DBX_NO_XREFS
19118334Speter
19218334Speter/* We must put stabs in the text section.  If we don't the assembler
19318334Speter   won't handle them correctly; it will sometimes put stabs where gdb
19418334Speter   can't find them.  */
19518334Speter
19618334Speter#define DEBUG_SYMS_TEXT
19750397Sobrien
19890075Sobrien/* Prototype functions in xcoffout.c.  */
19950397Sobrien
20090075Sobrienextern int stab_to_sclass			PARAMS ((int));
20150397Sobrien#ifdef BUFSIZ
20290075Sobrienextern void xcoffout_begin_prologue		PARAMS ((unsigned int,
20390075Sobrien							 const char *));
20490075Sobrienextern void xcoffout_begin_block		PARAMS ((unsigned, unsigned));
20590075Sobrienextern void xcoffout_end_epilogue		PARAMS ((void));
20690075Sobrienextern void xcoffout_end_function		PARAMS ((unsigned int));
20790075Sobrienextern void xcoffout_end_block			PARAMS ((unsigned, unsigned));
20850397Sobrien#endif /* BUFSIZ */
20950397Sobrien
21050397Sobrien#ifdef TREE_CODE
21190075Sobrienextern void xcoff_output_standard_types		PARAMS ((tree));
21250397Sobrien#ifdef BUFSIZ
21390075Sobrienextern void xcoffout_declare_function		PARAMS ((FILE *, tree, const char *));
21450397Sobrien#endif /* BUFSIZ */
21550397Sobrien#endif /* TREE_CODE */
21650397Sobrien
21750397Sobrien#ifdef RTX_CODE
21850397Sobrien#ifdef BUFSIZ
21990075Sobrienextern void xcoffout_source_line		PARAMS ((unsigned int,
22090075Sobrien							 const char *));
22150397Sobrien#endif /* BUFSIZ */
22250397Sobrien#endif /* RTX_CODE */
223