xcoffout.h revision 132718
118334Speter/* XCOFF definitions.  These are needed in dbxout.c, final.c,
2117395Skan   and xcoffout.h.
3132718Skan   Copyright (C) 1998, 2000, 2002, 2003
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
2090075SobrienSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA
2190075Sobrien02111-1307, USA.  */
2252284Sobrien
2352284Sobrien
2490075Sobrien#define ASM_STABS_OP "\t.stabx\t"
2518334Speter
2618334Speter/* Tags and typedefs are C_DECL in XCOFF, not C_LSYM.  */
2718334Speter
2818334Speter#define DBX_TYPE_DECL_STABS_CODE N_DECL
2918334Speter
3018334Speter/* Use the XCOFF predefined type numbers.  */
3118334Speter
3218334Speter/* ??? According to metin, typedef stabx must go in text control section,
3318334Speter   but he did not make this changes everywhere where such typedef stabx
3418334Speter   can be emitted, so it is really needed or not?  */
3518334Speter
3618334Speter#define DBX_OUTPUT_STANDARD_TYPES(SYMS)		\
3718334Speter{						\
3818334Speter  text_section ();				\
3918334Speter  xcoff_output_standard_types (SYMS);		\
4018334Speter}
4118334Speter
4218334Speter/* Any type with a negative type index has already been output.  */
4318334Speter
4418334Speter#define DBX_TYPE_DEFINED(TYPE) (TYPE_SYMTAB_ADDRESS (TYPE) < 0)
4518334Speter
4618334Speter/* Must use N_STSYM for static const variables (those in the text section)
4718334Speter   instead of N_FUN.  */
4818334Speter
4918334Speter#define DBX_STATIC_CONST_VAR_CODE N_STSYM
5018334Speter
51117395Skan/* For static variables, output code to define the start of a static block.  */
5218334Speter
5318334Speter#define DBX_STATIC_BLOCK_START(ASMFILE,CODE)				\
5418334Speter{									\
5518334Speter  if ((CODE) == N_STSYM)						\
5618334Speter    fprintf ((ASMFILE), "\t.bs\t%s[RW]\n", xcoff_private_data_section_name);\
5718334Speter  else if ((CODE) == N_LCSYM)						\
58117395Skan    fprintf ((ASMFILE), "\t.bs\t%s\n", xcoff_bss_section_name);	\
5918334Speter}
6018334Speter
6118334Speter/* For static variables, output code to define the end of a static block.  */
6218334Speter
6318334Speter#define DBX_STATIC_BLOCK_END(ASMFILE,CODE)				\
6418334Speter{									\
6550397Sobrien  if ((CODE) == N_STSYM || (CODE) == N_LCSYM)				\
6650397Sobrien    fputs ("\t.es\n", (ASMFILE));					\
6718334Speter}
6818334Speter
6918334Speter/* We must use N_RPYSM instead of N_RSYM for register parameters.  */
7018334Speter
7118334Speter#define DBX_REGPARM_STABS_CODE N_RPSYM
7218334Speter
7318334Speter/* We must use 'R' instead of 'P' for register parameters.  */
7418334Speter
7518334Speter#define DBX_REGPARM_STABS_LETTER 'R'
7618334Speter
7718334Speter/* Define our own finish symbol function, since xcoff stabs have their
7818334Speter   own different format.  */
7918334Speter
8018334Speter#define DBX_FINISH_SYMBOL(SYM)					\
8118334Speter{								\
8218334Speter  if (current_sym_addr && current_sym_code == N_FUN)		\
8318334Speter    fprintf (asmfile, "\",.");					\
8418334Speter  else								\
8518334Speter    fprintf (asmfile, "\",");					\
8618334Speter  /* If we are writing a function name, we must ensure that	\
8718334Speter     there is no storage-class suffix on the name.  */		\
8818334Speter  if (current_sym_addr && current_sym_code == N_FUN		\
8918334Speter      && GET_CODE (current_sym_addr) == SYMBOL_REF)		\
9018334Speter    {								\
9190075Sobrien      const char *_p = XSTR (current_sym_addr, 0);		\
9218334Speter      if (*_p == '*')						\
9318334Speter	fprintf (asmfile, "%s", _p+1);				\
9418334Speter      else							\
95117395Skan	for (; *_p != '[' && *_p; _p++)				\
9618334Speter	  fprintf (asmfile, "%c", *_p);				\
9718334Speter    }								\
9818334Speter  else if (current_sym_addr)					\
9918334Speter    output_addr_const (asmfile, current_sym_addr);		\
10018334Speter  else if (current_sym_code == N_GSYM)				\
10118334Speter    assemble_name (asmfile, XSTR (XEXP (DECL_RTL (sym), 0), 0)); \
10218334Speter  else								\
10318334Speter    fprintf (asmfile, "%d", current_sym_value);			\
10418334Speter  fprintf (asmfile, ",%d,0\n", stab_to_sclass (current_sym_code)); \
10518334Speter}
10618334Speter
10718334Speter/* These are IBM XCOFF extensions we need to reference in dbxout.c
10818334Speter   and xcoffout.c.  */
10918334Speter
11018334Speter/* AIX XCOFF uses this for typedefs.  This can have any value, since it is
11118334Speter   only used for translation into a C_DECL storage class.  */
11218334Speter#ifndef N_DECL
11318334Speter#define N_DECL 0x8c
11418334Speter#endif
11518334Speter/* AIX XCOFF uses this for parameters passed in registers.  This can have
11618334Speter   any value, since it is only used for translation into a C_RPSYM storage
11718334Speter   class.  */
11818334Speter#ifndef N_RPSYM
11918334Speter#define N_RPSYM 0x8e
12018334Speter#endif
12118334Speter
12218334Speter/* Name of the current include file.  */
12318334Speter
12490075Sobrienextern const char *xcoff_current_include_file;
12518334Speter
12618334Speter/* Names of bss and data sections.  These should be unique names for each
12718334Speter   compilation unit.  */
12818334Speter
12918334Speterextern char *xcoff_bss_section_name;
13018334Speterextern char *xcoff_private_data_section_name;
13118334Speterextern char *xcoff_read_only_section_name;
13218334Speter
13318334Speter/* Last source file name mentioned in a NOTE insn.  */
13418334Speter
13590075Sobrienextern const char *xcoff_lastfile;
13618334Speter
13718334Speter/* Don't write out path name for main source file.  */
13818334Speter#define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE,FILENAME)
13918334Speter
14018334Speter/* Write out main source file name using ".file" rather than ".stabs".
14118334Speter   We don't actually do this here, because the assembler gets confused if there
142132718Skan   is more than one .file directive.  rs6000_xcoff_file_start is already
143132718Skan   emitting a .file directory, so we don't output one here also.
14418334Speter   Initialize xcoff_lastfile.  */
14518334Speter#define DBX_OUTPUT_MAIN_SOURCE_FILENAME(FILE,FILENAME) \
14650397Sobrien  xcoff_lastfile = (FILENAME)
14718334Speter
14818334Speter/* If we are still in an include file, its end must be marked.  */
14918334Speter#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)	\
15018334Speter{							\
15118334Speter  if (xcoff_current_include_file)			\
15218334Speter    {							\
15350397Sobrien      fputs ("\t.ei\t", (FILE));			\
15450397Sobrien      output_quoted_string ((FILE), xcoff_current_include_file);	\
15550397Sobrien      putc ('\n', (FILE));				\
15618334Speter      xcoff_current_include_file = NULL;		\
15718334Speter    }							\
15818334Speter}
15918334Speter
16090075Sobrien/* .stabx has the type in a different place.  */
16190075Sobrien#if 0  /* Do not emit any marker for XCOFF until assembler allows XFT_CV.  */
16290075Sobrien#define DBX_OUTPUT_GCC_MARKER(FILE) \
16390075Sobrien  fprintf ((FILE), "%s\"%s\",0,%d,0\n", ASM_STABS_OP, STABS_GCC_MARKER, \
16490075Sobrien	   stab_to_sclass (N_GSYM))
16590075Sobrien#else
16690075Sobrien#define DBX_OUTPUT_GCC_MARKER(FILE)
16790075Sobrien#endif
16890075Sobrien
16918334Speter/* Do not break .stabs pseudos into continuations.  */
17018334Speter#define DBX_CONTIN_LENGTH 0
17118334Speter
17218334Speter/* Don't try to use the `x' type-cross-reference character in DBX data.
17318334Speter   Also has the consequence of putting each struct, union or enum
17418334Speter   into a separate .stabs, containing only cross-refs to the others.  */
17518334Speter#define DBX_NO_XREFS
17618334Speter
17718334Speter/* We must put stabs in the text section.  If we don't the assembler
17818334Speter   won't handle them correctly; it will sometimes put stabs where gdb
17918334Speter   can't find them.  */
18018334Speter
18118334Speter#define DEBUG_SYMS_TEXT
18250397Sobrien
18390075Sobrien/* Prototype functions in xcoffout.c.  */
18450397Sobrien
185132718Skanextern int stab_to_sclass (int);
18650397Sobrien#ifdef BUFSIZ
187132718Skanextern void xcoffout_begin_prologue (unsigned int, const char *);
188132718Skanextern void xcoffout_begin_block (unsigned, unsigned);
189132718Skanextern void xcoffout_end_epilogue (unsigned int, const char *);
190132718Skanextern void xcoffout_end_function (unsigned int);
191132718Skanextern void xcoffout_end_block (unsigned, unsigned);
19250397Sobrien#endif /* BUFSIZ */
19350397Sobrien
19450397Sobrien#ifdef TREE_CODE
195132718Skanextern void xcoff_output_standard_types (tree);
19650397Sobrien#ifdef BUFSIZ
197132718Skanextern void xcoffout_declare_function (FILE *, tree, const char *);
19850397Sobrien#endif /* BUFSIZ */
19950397Sobrien#endif /* TREE_CODE */
20050397Sobrien
20150397Sobrien#ifdef RTX_CODE
20250397Sobrien#ifdef BUFSIZ
203132718Skanextern void xcoffout_source_line (unsigned int, const char *);
20450397Sobrien#endif /* BUFSIZ */
20550397Sobrien#endif /* RTX_CODE */
206