xcoffout.h revision 117395
118334Speter/* XCOFF definitions.  These are needed in dbxout.c, final.c,
2117395Skan   and xcoffout.h.
3117395Skan   Copyright (C) 1998, 2000, 2002 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
50117395Skan/* For static variables, output code to define the start of a static block.  */
5118334Speter
5218334Speter#define DBX_STATIC_BLOCK_START(ASMFILE,CODE)				\
5318334Speter{									\
5418334Speter  if ((CODE) == N_STSYM)						\
5518334Speter    fprintf ((ASMFILE), "\t.bs\t%s[RW]\n", xcoff_private_data_section_name);\
5618334Speter  else if ((CODE) == N_LCSYM)						\
57117395Skan    fprintf ((ASMFILE), "\t.bs\t%s\n", xcoff_bss_section_name);	\
5818334Speter}
5918334Speter
6018334Speter/* For static variables, output code to define the end of a static block.  */
6118334Speter
6218334Speter#define DBX_STATIC_BLOCK_END(ASMFILE,CODE)				\
6318334Speter{									\
6450397Sobrien  if ((CODE) == N_STSYM || (CODE) == N_LCSYM)				\
6550397Sobrien    fputs ("\t.es\n", (ASMFILE));					\
6618334Speter}
6718334Speter
6818334Speter/* We must use N_RPYSM instead of N_RSYM for register parameters.  */
6918334Speter
7018334Speter#define DBX_REGPARM_STABS_CODE N_RPSYM
7118334Speter
7218334Speter/* We must use 'R' instead of 'P' for register parameters.  */
7318334Speter
7418334Speter#define DBX_REGPARM_STABS_LETTER 'R'
7518334Speter
7618334Speter/* Define our own finish symbol function, since xcoff stabs have their
7718334Speter   own different format.  */
7818334Speter
7918334Speter#define DBX_FINISH_SYMBOL(SYM)					\
8018334Speter{								\
8118334Speter  if (current_sym_addr && current_sym_code == N_FUN)		\
8218334Speter    fprintf (asmfile, "\",.");					\
8318334Speter  else								\
8418334Speter    fprintf (asmfile, "\",");					\
8518334Speter  /* If we are writing a function name, we must ensure that	\
8618334Speter     there is no storage-class suffix on the name.  */		\
8718334Speter  if (current_sym_addr && current_sym_code == N_FUN		\
8818334Speter      && GET_CODE (current_sym_addr) == SYMBOL_REF)		\
8918334Speter    {								\
9090075Sobrien      const char *_p = XSTR (current_sym_addr, 0);		\
9118334Speter      if (*_p == '*')						\
9218334Speter	fprintf (asmfile, "%s", _p+1);				\
9318334Speter      else							\
94117395Skan	for (; *_p != '[' && *_p; _p++)				\
9518334Speter	  fprintf (asmfile, "%c", *_p);				\
9618334Speter    }								\
9718334Speter  else if (current_sym_addr)					\
9818334Speter    output_addr_const (asmfile, current_sym_addr);		\
9918334Speter  else if (current_sym_code == N_GSYM)				\
10018334Speter    assemble_name (asmfile, XSTR (XEXP (DECL_RTL (sym), 0), 0)); \
10118334Speter  else								\
10218334Speter    fprintf (asmfile, "%d", current_sym_value);			\
10318334Speter  fprintf (asmfile, ",%d,0\n", stab_to_sclass (current_sym_code)); \
10418334Speter}
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.  */
13718334Speter#define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE,FILENAME)
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
14118334Speter   is more than one .file directive.  ASM_FILE_START in config/rs6000/rs6000.h
14218334Speter   is already 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)	\
14918334Speter{							\
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    }							\
15718334Speter}
15818334Speter
15990075Sobrien/* .stabx has the type in a different place.  */
16090075Sobrien#if 0  /* Do not emit any marker for XCOFF until assembler allows XFT_CV.  */
16190075Sobrien#define DBX_OUTPUT_GCC_MARKER(FILE) \
16290075Sobrien  fprintf ((FILE), "%s\"%s\",0,%d,0\n", ASM_STABS_OP, STABS_GCC_MARKER, \
16390075Sobrien	   stab_to_sclass (N_GSYM))
16490075Sobrien#else
16590075Sobrien#define DBX_OUTPUT_GCC_MARKER(FILE)
16690075Sobrien#endif
16790075Sobrien
16818334Speter/* Do not break .stabs pseudos into continuations.  */
16918334Speter#define DBX_CONTIN_LENGTH 0
17018334Speter
17118334Speter/* Don't try to use the `x' type-cross-reference character in DBX data.
17218334Speter   Also has the consequence of putting each struct, union or enum
17318334Speter   into a separate .stabs, containing only cross-refs to the others.  */
17418334Speter#define DBX_NO_XREFS
17518334Speter
17618334Speter/* We must put stabs in the text section.  If we don't the assembler
17718334Speter   won't handle them correctly; it will sometimes put stabs where gdb
17818334Speter   can't find them.  */
17918334Speter
18018334Speter#define DEBUG_SYMS_TEXT
18150397Sobrien
18290075Sobrien/* Prototype functions in xcoffout.c.  */
18350397Sobrien
18490075Sobrienextern int stab_to_sclass			PARAMS ((int));
18550397Sobrien#ifdef BUFSIZ
18690075Sobrienextern void xcoffout_begin_prologue		PARAMS ((unsigned int,
18790075Sobrien							 const char *));
18890075Sobrienextern void xcoffout_begin_block		PARAMS ((unsigned, unsigned));
189117395Skanextern void xcoffout_end_epilogue		PARAMS ((unsigned int,
190117395Skan							 const char *));
19190075Sobrienextern void xcoffout_end_function		PARAMS ((unsigned int));
19290075Sobrienextern void xcoffout_end_block			PARAMS ((unsigned, unsigned));
19350397Sobrien#endif /* BUFSIZ */
19450397Sobrien
19550397Sobrien#ifdef TREE_CODE
19690075Sobrienextern void xcoff_output_standard_types		PARAMS ((tree));
19750397Sobrien#ifdef BUFSIZ
19890075Sobrienextern void xcoffout_declare_function		PARAMS ((FILE *, tree, const char *));
19950397Sobrien#endif /* BUFSIZ */
20050397Sobrien#endif /* TREE_CODE */
20150397Sobrien
20250397Sobrien#ifdef RTX_CODE
20350397Sobrien#ifdef BUFSIZ
20490075Sobrienextern void xcoffout_source_line		PARAMS ((unsigned int,
20590075Sobrien							 const char *));
20650397Sobrien#endif /* BUFSIZ */
20750397Sobrien#endif /* RTX_CODE */
208