xcoffout.h revision 18334
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{ \ 6118334Speter if (current_sym_code == N_STSYM || current_sym_code == N_LCSYM) \ 6218334Speter fprintf (asmfile, "\t.es\n"); \ 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/* The line number of the beginning of the current function. 11918334Speter xcoffout.c needs this so that it can output relative linenumbers. */ 12018334Speter 12118334Speterextern int xcoff_begin_function_line; 12218334Speter 12318334Speter/* Name of the current include file. */ 12418334Speter 12518334Speterextern char *xcoff_current_include_file; 12618334Speter 12718334Speter/* Name of the current function file. This is the file the `.bf' is 12818334Speter emitted from. In case a line is emitted from a different file, 12918334Speter (by including that file of course), then the line number will be 13018334Speter absolute. */ 13118334Speter 13218334Speterextern char *xcoff_current_function_file; 13318334Speter 13418334Speter/* Names of bss and data sections. These should be unique names for each 13518334Speter compilation unit. */ 13618334Speter 13718334Speterextern char *xcoff_bss_section_name; 13818334Speterextern char *xcoff_private_data_section_name; 13918334Speterextern char *xcoff_read_only_section_name; 14018334Speter 14118334Speter/* Last source file name mentioned in a NOTE insn. */ 14218334Speter 14318334Speterextern char *xcoff_lastfile; 14418334Speter 14518334Speter/* Don't write out path name for main source file. */ 14618334Speter#define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE,FILENAME) 14718334Speter 14818334Speter/* Write out main source file name using ".file" rather than ".stabs". 14918334Speter We don't actually do this here, because the assembler gets confused if there 15018334Speter is more than one .file directive. ASM_FILE_START in config/rs6000/rs6000.h 15118334Speter is already emitting a .file directory, so we don't output one here also. 15218334Speter Initialize xcoff_lastfile. */ 15318334Speter#define DBX_OUTPUT_MAIN_SOURCE_FILENAME(FILE,FILENAME) \ 15418334Speter xcoff_lastfile = input_file_name 15518334Speter 15618334Speter/* If we are still in an include file, its end must be marked. */ 15718334Speter#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ 15818334Speter{ \ 15918334Speter if (xcoff_current_include_file) \ 16018334Speter { \ 16118334Speter fprintf (FILE, "\t.ei\t"); \ 16218334Speter output_quoted_string (FILE, xcoff_current_include_file); \ 16318334Speter fprintf (FILE, "\n"); \ 16418334Speter xcoff_current_include_file = NULL; \ 16518334Speter } \ 16618334Speter} 16718334Speter 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 181