118334Speter/* XCOFF definitions.  These are needed in dbxout.c, final.c,
2117395Skan   and xcoffout.h.
3169689Skan   Copyright (C) 1998, 2000, 2002, 2003, 2004
4132718Skan   Free Software Foundation, Inc.
518334Speter
690075SobrienThis file is part of GCC.
752284Sobrien
890075SobrienGCC is free software; you can redistribute it and/or modify it under
990075Sobrienthe terms of the GNU General Public License as published by the Free
1090075SobrienSoftware Foundation; either version 2, or (at your option) any later
1190075Sobrienversion.
1252284Sobrien
1390075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1490075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1590075SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1690075Sobrienfor more details.
1752284Sobrien
1852284SobrienYou should have received a copy of the GNU General Public License
1990075Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
20169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21169689Skan02110-1301, USA.  */
2252284Sobrien
2352284Sobrien
2418334Speter/* Tags and typedefs are C_DECL in XCOFF, not C_LSYM.  */
2518334Speter
2618334Speter#define DBX_TYPE_DECL_STABS_CODE N_DECL
2718334Speter
2818334Speter/* Use the XCOFF predefined type numbers.  */
2918334Speter
30169689Skan#define DBX_ASSIGN_FUNDAMENTAL_TYPE_NUMBER(TYPE) \
31169689Skan  xcoff_assign_fundamental_type_number (TYPE)
3218334Speter
3318334Speter/* Any type with a negative type index has already been output.  */
3418334Speter
3518334Speter#define DBX_TYPE_DEFINED(TYPE) (TYPE_SYMTAB_ADDRESS (TYPE) < 0)
3618334Speter
3718334Speter/* Must use N_STSYM for static const variables (those in the text section)
3818334Speter   instead of N_FUN.  */
3918334Speter
4018334Speter#define DBX_STATIC_CONST_VAR_CODE N_STSYM
4118334Speter
42117395Skan/* For static variables, output code to define the start of a static block.  */
4318334Speter
4418334Speter#define DBX_STATIC_BLOCK_START(ASMFILE,CODE)				\
4518334Speter{									\
4618334Speter  if ((CODE) == N_STSYM)						\
4718334Speter    fprintf ((ASMFILE), "\t.bs\t%s[RW]\n", xcoff_private_data_section_name);\
4818334Speter  else if ((CODE) == N_LCSYM)						\
49117395Skan    fprintf ((ASMFILE), "\t.bs\t%s\n", xcoff_bss_section_name);	\
5018334Speter}
5118334Speter
5218334Speter/* For static variables, output code to define the end of a static block.  */
5318334Speter
5418334Speter#define DBX_STATIC_BLOCK_END(ASMFILE,CODE)				\
5518334Speter{									\
5650397Sobrien  if ((CODE) == N_STSYM || (CODE) == N_LCSYM)				\
5750397Sobrien    fputs ("\t.es\n", (ASMFILE));					\
5818334Speter}
5918334Speter
6018334Speter/* We must use N_RPYSM instead of N_RSYM for register parameters.  */
6118334Speter
6218334Speter#define DBX_REGPARM_STABS_CODE N_RPSYM
6318334Speter
6418334Speter/* We must use 'R' instead of 'P' for register parameters.  */
6518334Speter
6618334Speter#define DBX_REGPARM_STABS_LETTER 'R'
6718334Speter
6818334Speter/* Define our own finish symbol function, since xcoff stabs have their
6918334Speter   own different format.  */
7018334Speter
71169689Skan#define DBX_FINISH_STABS(SYM, CODE, LINE, ADDR, LABEL, NUMBER) do {	\
72169689Skan  if (ADDR)								\
73169689Skan    {									\
74169689Skan      /* If we are writing a function name, we must emit a dot in	\
75169689Skan	 order to refer to the function code, not its descriptor.  */	\
76169689Skan      if (CODE == N_FUN)						\
77169689Skan	putc ('.', asm_out_file);					\
78169689Skan									\
79169689Skan      /* If we are writing a function name, we must ensure that		\
80169689Skan	 there is no storage-class suffix on the name.  */		\
81169689Skan      if (CODE == N_FUN && GET_CODE (ADDR) == SYMBOL_REF)		\
82169689Skan	{								\
83169689Skan	  const char *_p = XSTR (ADDR, 0);				\
84169689Skan	  if (*_p == '*')						\
85169689Skan	    fputs (_p+1, asm_out_file);					\
86169689Skan	  else								\
87169689Skan	    for (; *_p != '[' && *_p; _p++)				\
88169689Skan	      putc (*_p, asm_out_file);					\
89169689Skan	}								\
90169689Skan      else								\
91169689Skan	output_addr_const (asm_out_file, ADDR);				\
92169689Skan    }									\
93169689Skan  /* Another special case: N_GSYM always gets the symbol name,		\
94169689Skan     whether or not LABEL or NUMBER are set.  */			\
95169689Skan  else if (CODE == N_GSYM)						\
96169689Skan    assemble_name (asm_out_file, XSTR (XEXP (DECL_RTL (SYM), 0), 0));	\
97169689Skan  else if (LABEL)							\
98169689Skan    assemble_name (asm_out_file, LABEL);				\
99169689Skan  else									\
100169689Skan    dbxout_int (NUMBER);						\
101169689Skan  putc (',', asm_out_file);						\
102169689Skan  dbxout_int (stab_to_sclass (CODE));					\
103169689Skan  fputs (",0\n", asm_out_file);						\
104169689Skan} while (0)
10518334Speter
10618334Speter/* These are IBM XCOFF extensions we need to reference in dbxout.c
10718334Speter   and xcoffout.c.  */
10818334Speter
10918334Speter/* AIX XCOFF uses this for typedefs.  This can have any value, since it is
11018334Speter   only used for translation into a C_DECL storage class.  */
11118334Speter#ifndef N_DECL
11218334Speter#define N_DECL 0x8c
11318334Speter#endif
11418334Speter/* AIX XCOFF uses this for parameters passed in registers.  This can have
11518334Speter   any value, since it is only used for translation into a C_RPSYM storage
11618334Speter   class.  */
11718334Speter#ifndef N_RPSYM
11818334Speter#define N_RPSYM 0x8e
11918334Speter#endif
12018334Speter
12118334Speter/* Name of the current include file.  */
12218334Speter
12390075Sobrienextern const char *xcoff_current_include_file;
12418334Speter
12518334Speter/* Names of bss and data sections.  These should be unique names for each
12618334Speter   compilation unit.  */
12718334Speter
12818334Speterextern char *xcoff_bss_section_name;
12918334Speterextern char *xcoff_private_data_section_name;
13018334Speterextern char *xcoff_read_only_section_name;
13118334Speter
13218334Speter/* Last source file name mentioned in a NOTE insn.  */
13318334Speter
13490075Sobrienextern const char *xcoff_lastfile;
13518334Speter
13618334Speter/* Don't write out path name for main source file.  */
137169689Skan#define NO_DBX_MAIN_SOURCE_DIRECTORY 1
13818334Speter
13918334Speter/* Write out main source file name using ".file" rather than ".stabs".
14018334Speter   We don't actually do this here, because the assembler gets confused if there
141132718Skan   is more than one .file directive.  rs6000_xcoff_file_start is already
142132718Skan   emitting a .file directory, so we don't output one here also.
14318334Speter   Initialize xcoff_lastfile.  */
14418334Speter#define DBX_OUTPUT_MAIN_SOURCE_FILENAME(FILE,FILENAME) \
14550397Sobrien  xcoff_lastfile = (FILENAME)
14618334Speter
14718334Speter/* If we are still in an include file, its end must be marked.  */
14818334Speter#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)	\
149169689Skando {							\
15018334Speter  if (xcoff_current_include_file)			\
15118334Speter    {							\
15250397Sobrien      fputs ("\t.ei\t", (FILE));			\
15350397Sobrien      output_quoted_string ((FILE), xcoff_current_include_file);	\
15450397Sobrien      putc ('\n', (FILE));				\
15518334Speter      xcoff_current_include_file = NULL;		\
15618334Speter    }							\
157169689Skan} while (0)
15818334Speter
159169689Skan/* Do not emit any marker for XCOFF until assembler allows XFT_CV.  */
160169689Skan#define NO_DBX_GCC_MARKER
16190075Sobrien
16218334Speter/* Do not break .stabs pseudos into continuations.  */
16318334Speter#define DBX_CONTIN_LENGTH 0
16418334Speter
16518334Speter/* Don't try to use the `x' type-cross-reference character in DBX data.
16618334Speter   Also has the consequence of putting each struct, union or enum
16718334Speter   into a separate .stabs, containing only cross-refs to the others.  */
16818334Speter#define DBX_NO_XREFS
16918334Speter
17018334Speter/* We must put stabs in the text section.  If we don't the assembler
17118334Speter   won't handle them correctly; it will sometimes put stabs where gdb
17218334Speter   can't find them.  */
17318334Speter
17418334Speter#define DEBUG_SYMS_TEXT
17550397Sobrien
17690075Sobrien/* Prototype functions in xcoffout.c.  */
17750397Sobrien
178132718Skanextern int stab_to_sclass (int);
179132718Skanextern void xcoffout_begin_prologue (unsigned int, const char *);
180132718Skanextern void xcoffout_begin_block (unsigned, unsigned);
181132718Skanextern void xcoffout_end_epilogue (unsigned int, const char *);
182132718Skanextern void xcoffout_end_function (unsigned int);
183132718Skanextern void xcoffout_end_block (unsigned, unsigned);
184169689Skanextern int xcoff_assign_fundamental_type_number (tree);
185132718Skanextern void xcoffout_declare_function (FILE *, tree, const char *);
186132718Skanextern void xcoffout_source_line (unsigned int, const char *);
187