xcoffout.h revision 52284
118334Speter/* XCOFF definitions. These are needed in dbxout.c, final.c, 252284Sobrien and xcoffout.h. 352284Sobrien Copyright (C) 1998 Free Software Foundation, Inc. 418334Speter 552284SobrienThis file is part of GNU CC. 652284Sobrien 752284SobrienGNU CC is free software; you can redistribute it and/or modify 852284Sobrienit under the terms of the GNU General Public License as published by 952284Sobrienthe Free Software Foundation; either version 2, or (at your option) 1052284Sobrienany later version. 1152284Sobrien 1252284SobrienGNU CC is distributed in the hope that it will be useful, 1352284Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of 1452284SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1552284SobrienGNU General Public License for more details. 1652284Sobrien 1752284SobrienYou should have received a copy of the GNU General Public License 1852284Sobrienalong with GNU CC; see the file COPYING. If not, write to 1952284Sobrienthe Free Software Foundation, 59 Temple Place - Suite 330, 2052284SobrienBoston, MA 02111-1307, USA. */ 2152284Sobrien 2252284Sobrien 2318334Speter#define ASM_STABS_OP ".stabx" 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 { \ 10618334Speter 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 13918334Speterextern 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 15018334Speterextern 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 17518334Speter/* Do not break .stabs pseudos into continuations. */ 17618334Speter#define DBX_CONTIN_LENGTH 0 17718334Speter 17818334Speter/* Don't try to use the `x' type-cross-reference character in DBX data. 17918334Speter Also has the consequence of putting each struct, union or enum 18018334Speter into a separate .stabs, containing only cross-refs to the others. */ 18118334Speter#define DBX_NO_XREFS 18218334Speter 18318334Speter/* We must put stabs in the text section. If we don't the assembler 18418334Speter won't handle them correctly; it will sometimes put stabs where gdb 18518334Speter can't find them. */ 18618334Speter 18718334Speter#define DEBUG_SYMS_TEXT 18850397Sobrien 18950397Sobrien/* Prototype functions in xcoffout.c. */ 19050397Sobrien 19150397Sobrienextern int stab_to_sclass PROTO ((int)); 19250397Sobrien#ifdef BUFSIZ 19350397Sobrienextern void xcoffout_begin_function PROTO ((FILE *, int)); 19450397Sobrienextern void xcoffout_begin_block PROTO ((FILE *, int, int)); 19550397Sobrienextern void xcoffout_end_epilogue PROTO ((FILE *)); 19650397Sobrienextern void xcoffout_end_function PROTO ((FILE *, int)); 19750397Sobrienextern void xcoffout_end_block PROTO ((FILE *, int, int)); 19850397Sobrien#endif /* BUFSIZ */ 19950397Sobrien 20050397Sobrien#ifdef TREE_CODE 20150397Sobrienextern void xcoff_output_standard_types PROTO ((tree)); 20250397Sobrien#ifdef BUFSIZ 20350397Sobrienextern void xcoffout_declare_function PROTO ((FILE *, tree, char *)); 20450397Sobrien#endif /* BUFSIZ */ 20550397Sobrien#endif /* TREE_CODE */ 20650397Sobrien 20750397Sobrien#ifdef RTX_CODE 20850397Sobrien#ifdef BUFSIZ 20950397Sobrienextern void xcoffout_source_line PROTO ((FILE *, char *, rtx)); 21050397Sobrien#endif /* BUFSIZ */ 21150397Sobrien#endif /* RTX_CODE */ 212