xcoffout.h revision 50397
118334Speter/* XCOFF definitions.  These are needed in dbxout.c, final.c,
218334Speter   and xcoffout.h.  */
318334Speter
418334Speter#define ASM_STABS_OP ".stabx"
518334Speter
618334Speter/* Tags and typedefs are C_DECL in XCOFF, not C_LSYM.  */
718334Speter
818334Speter#define DBX_TYPE_DECL_STABS_CODE N_DECL
918334Speter
1018334Speter/* Use the XCOFF predefined type numbers.  */
1118334Speter
1218334Speter/* ??? According to metin, typedef stabx must go in text control section,
1318334Speter   but he did not make this changes everywhere where such typedef stabx
1418334Speter   can be emitted, so it is really needed or not?  */
1518334Speter
1618334Speter#define DBX_OUTPUT_STANDARD_TYPES(SYMS)		\
1718334Speter{						\
1818334Speter  text_section ();				\
1918334Speter  xcoff_output_standard_types (SYMS);		\
2018334Speter}
2118334Speter
2218334Speter/* Any type with a negative type index has already been output.  */
2318334Speter
2418334Speter#define DBX_TYPE_DEFINED(TYPE) (TYPE_SYMTAB_ADDRESS (TYPE) < 0)
2518334Speter
2618334Speter/* Must use N_STSYM for static const variables (those in the text section)
2718334Speter   instead of N_FUN.  */
2818334Speter
2918334Speter#define DBX_STATIC_CONST_VAR_CODE N_STSYM
3018334Speter
3118334Speter/* For static variables, output code to define the start of a static block.
3218334Speter
3318334Speter   ??? The IBM rs6000/AIX assembler has a bug that causes bss block debug
3418334Speter   info to be occasionally lost.  A simple example is this:
3518334Speter	int a; static int b;
3618334Speter   The commands `gcc -g -c tmp.c; dump -t tmp.o' gives
3718334Speter[10]	m   0x00000016         1     0    0x8f  0x0000            .bs
3818334Speter[11]	m   0x00000000         1     0    0x90  0x0000            .es
3918334Speter...
4018334Speter[21]	m   0x00000000        -2     0    0x85  0x0000            b:S-1
4118334Speter   which is wrong.  The `b:S-1' must be between the `.bs' and `.es'.
4218334Speter   We can apparently work around the problem by forcing the text section
4318334Speter   (even if we are already in the text section) immediately before outputting
4418334Speter   the `.bs'.  This should be fixed in the next major AIX release (3.3?).  */
4518334Speter
4618334Speter#define DBX_STATIC_BLOCK_START(ASMFILE,CODE)				\
4718334Speter{									\
4818334Speter  if ((CODE) == N_STSYM)						\
4918334Speter    fprintf ((ASMFILE), "\t.bs\t%s[RW]\n", xcoff_private_data_section_name);\
5018334Speter  else if ((CODE) == N_LCSYM)						\
5118334Speter    {									\
5218334Speter      fprintf ((ASMFILE), "%s\n", TEXT_SECTION_ASM_OP);			\
5318334Speter      fprintf ((ASMFILE), "\t.bs\t%s\n", xcoff_bss_section_name);	\
5418334Speter    }									\
5518334Speter}
5618334Speter
5718334Speter/* For static variables, output code to define the end of a static block.  */
5818334Speter
5918334Speter#define DBX_STATIC_BLOCK_END(ASMFILE,CODE)				\
6018334Speter{									\
6150397Sobrien  if ((CODE) == N_STSYM || (CODE) == N_LCSYM)				\
6250397Sobrien    fputs ("\t.es\n", (ASMFILE));					\
6318334Speter}
6418334Speter
6518334Speter/* We must use N_RPYSM instead of N_RSYM for register parameters.  */
6618334Speter
6718334Speter#define DBX_REGPARM_STABS_CODE N_RPSYM
6818334Speter
6918334Speter/* We must use 'R' instead of 'P' for register parameters.  */
7018334Speter
7118334Speter#define DBX_REGPARM_STABS_LETTER 'R'
7218334Speter
7318334Speter/* Define our own finish symbol function, since xcoff stabs have their
7418334Speter   own different format.  */
7518334Speter
7618334Speter#define DBX_FINISH_SYMBOL(SYM)					\
7718334Speter{								\
7818334Speter  if (current_sym_addr && current_sym_code == N_FUN)		\
7918334Speter    fprintf (asmfile, "\",.");					\
8018334Speter  else								\
8118334Speter    fprintf (asmfile, "\",");					\
8218334Speter  /* If we are writing a function name, we must ensure that	\
8318334Speter     there is no storage-class suffix on the name.  */		\
8418334Speter  if (current_sym_addr && current_sym_code == N_FUN		\
8518334Speter      && GET_CODE (current_sym_addr) == SYMBOL_REF)		\
8618334Speter    {								\
8718334Speter      char *_p = XSTR (current_sym_addr, 0);			\
8818334Speter      if (*_p == '*')						\
8918334Speter	fprintf (asmfile, "%s", _p+1);				\
9018334Speter      else							\
9118334Speter        for (; *_p != '[' && *_p; _p++)				\
9218334Speter	  fprintf (asmfile, "%c", *_p);				\
9318334Speter    }								\
9418334Speter  else if (current_sym_addr)					\
9518334Speter    output_addr_const (asmfile, current_sym_addr);		\
9618334Speter  else if (current_sym_code == N_GSYM)				\
9718334Speter    assemble_name (asmfile, XSTR (XEXP (DECL_RTL (sym), 0), 0)); \
9818334Speter  else								\
9918334Speter    fprintf (asmfile, "%d", current_sym_value);			\
10018334Speter  fprintf (asmfile, ",%d,0\n", stab_to_sclass (current_sym_code)); \
10118334Speter}
10218334Speter
10318334Speter/* These are IBM XCOFF extensions we need to reference in dbxout.c
10418334Speter   and xcoffout.c.  */
10518334Speter
10618334Speter/* AIX XCOFF uses this for typedefs.  This can have any value, since it is
10718334Speter   only used for translation into a C_DECL storage class.  */
10818334Speter#ifndef N_DECL
10918334Speter#define N_DECL 0x8c
11018334Speter#endif
11118334Speter/* AIX XCOFF uses this for parameters passed in registers.  This can have
11218334Speter   any value, since it is only used for translation into a C_RPSYM storage
11318334Speter   class.  */
11418334Speter#ifndef N_RPSYM
11518334Speter#define N_RPSYM 0x8e
11618334Speter#endif
11718334Speter
11818334Speter/* Name of the current include file.  */
11918334Speter
12018334Speterextern char *xcoff_current_include_file;
12118334Speter
12218334Speter/* Names of bss and data sections.  These should be unique names for each
12318334Speter   compilation unit.  */
12418334Speter
12518334Speterextern char *xcoff_bss_section_name;
12618334Speterextern char *xcoff_private_data_section_name;
12718334Speterextern char *xcoff_read_only_section_name;
12818334Speter
12918334Speter/* Last source file name mentioned in a NOTE insn.  */
13018334Speter
13118334Speterextern char *xcoff_lastfile;
13218334Speter
13318334Speter/* Don't write out path name for main source file.  */
13418334Speter#define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE,FILENAME)
13518334Speter
13618334Speter/* Write out main source file name using ".file" rather than ".stabs".
13718334Speter   We don't actually do this here, because the assembler gets confused if there
13818334Speter   is more than one .file directive.  ASM_FILE_START in config/rs6000/rs6000.h
13918334Speter   is already emitting a .file directory, so we don't output one here also.
14018334Speter   Initialize xcoff_lastfile.  */
14118334Speter#define DBX_OUTPUT_MAIN_SOURCE_FILENAME(FILE,FILENAME) \
14250397Sobrien  xcoff_lastfile = (FILENAME)
14318334Speter
14418334Speter/* If we are still in an include file, its end must be marked.  */
14518334Speter#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)	\
14618334Speter{							\
14718334Speter  if (xcoff_current_include_file)			\
14818334Speter    {							\
14950397Sobrien      fputs ("\t.ei\t", (FILE));			\
15050397Sobrien      output_quoted_string ((FILE), xcoff_current_include_file);	\
15150397Sobrien      putc ('\n', (FILE));				\
15218334Speter      xcoff_current_include_file = NULL;		\
15318334Speter    }							\
15418334Speter}
15518334Speter
15618334Speter/* Do not break .stabs pseudos into continuations.  */
15718334Speter#define DBX_CONTIN_LENGTH 0
15818334Speter
15918334Speter/* Don't try to use the `x' type-cross-reference character in DBX data.
16018334Speter   Also has the consequence of putting each struct, union or enum
16118334Speter   into a separate .stabs, containing only cross-refs to the others.  */
16218334Speter#define DBX_NO_XREFS
16318334Speter
16418334Speter/* We must put stabs in the text section.  If we don't the assembler
16518334Speter   won't handle them correctly; it will sometimes put stabs where gdb
16618334Speter   can't find them.  */
16718334Speter
16818334Speter#define DEBUG_SYMS_TEXT
16950397Sobrien
17050397Sobrien/* Prototype functions in xcoffout.c. */
17150397Sobrien
17250397Sobrienextern int stab_to_sclass			PROTO ((int));
17350397Sobrien#ifdef BUFSIZ
17450397Sobrienextern void xcoffout_begin_function		PROTO ((FILE *, int));
17550397Sobrienextern void xcoffout_begin_block		PROTO ((FILE *, int, int));
17650397Sobrienextern void xcoffout_end_epilogue		PROTO ((FILE *));
17750397Sobrienextern void xcoffout_end_function		PROTO ((FILE *, int));
17850397Sobrienextern void xcoffout_end_block			PROTO ((FILE *, int, int));
17950397Sobrien#endif /* BUFSIZ */
18050397Sobrien
18150397Sobrien#ifdef TREE_CODE
18250397Sobrienextern void xcoff_output_standard_types		PROTO ((tree));
18350397Sobrien#ifdef BUFSIZ
18450397Sobrienextern void xcoffout_declare_function		PROTO ((FILE *, tree, char *));
18550397Sobrien#endif /* BUFSIZ */
18650397Sobrien#endif /* TREE_CODE */
18750397Sobrien
18850397Sobrien#ifdef RTX_CODE
18950397Sobrien#ifdef BUFSIZ
19050397Sobrienextern void xcoffout_source_line		PROTO ((FILE *, char *, rtx));
19150397Sobrien#endif /* BUFSIZ */
19250397Sobrien#endif /* RTX_CODE */
193