1 /* Output xcoff-format symbol table information from GNU compiler.
2 Copyright (C) 1992 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21 /* Output xcoff-format symbol table data. The main functionality is contained
22 in dbxout.c. This file implements the sdbout-like parts of the xcoff
23 interface. Many functions are very similar to their counterparts in
26 /* Include this first, because it may define MIN and MAX. */
34 #ifdef XCOFF_DEBUGGING_INFO
36 /* This defines the C_* storage classes. */
37 #include <dbxstclass.h>
41 #if defined (USG) || defined (NO_STAB_H)
46 /* This is a GNU extension we need to reference in this file. */
52 /* These are GNU extensions we need to reference in this file. */
60 /* Line number of beginning of current function, minus one.
61 Negative means not in a function or not using xcoff. */
63 int xcoff_begin_function_line = -1;
65 /* Name of the current include file. */
67 char *xcoff_current_include_file;
69 /* Name of the current function file. This is the file the `.bf' is
70 emitted from. In case a line is emitted from a different file,
71 (by including that file of course), then the line number will be
74 char *xcoff_current_function_file;
76 /* Names of bss and data sections. These should be unique names for each
79 char *xcoff_bss_section_name;
80 char *xcoff_private_data_section_name;
81 char *xcoff_read_only_section_name;
83 /* Macro definitions used below. */
84 /* Ensure we don't output a negative line number. */
85 #define MAKE_LINE_SAFE(LINE) \
86 if (LINE <= xcoff_begin_function_line) \
87 LINE = xcoff_begin_function_line + 1 \
89 #define ASM_OUTPUT_LFB(FILE,LINENUM) \
91 if (xcoff_begin_function_line == -1) \
93 xcoff_begin_function_line = (LINENUM) - 1;\
94 fprintf (FILE, "\t.bf\t%d\n", (LINENUM)); \
96 xcoff_current_function_file \
97 = (xcoff_current_include_file \
98 ? xcoff_current_include_file : main_input_filename); \
101 #define ASM_OUTPUT_LFE(FILE,LINENUM) \
103 int linenum = LINENUM; \
104 MAKE_LINE_SAFE (linenum); \
105 fprintf (FILE, "\t.ef\t%d\n", ABS_OR_RELATIVE_LINENO (linenum)); \
106 xcoff_begin_function_line = -1; \
109 #define ASM_OUTPUT_LBB(FILE,LINENUM,BLOCKNUM) \
111 int linenum = LINENUM; \
112 MAKE_LINE_SAFE (linenum); \
113 fprintf (FILE, "\t.bb\t%d\n", ABS_OR_RELATIVE_LINENO (linenum)); \
116 #define ASM_OUTPUT_LBE(FILE,LINENUM,BLOCKNUM) \
118 int linenum = LINENUM; \
119 MAKE_LINE_SAFE (linenum); \
120 fprintf (FILE, "\t.eb\t%d\n", ABS_OR_RELATIVE_LINENO (linenum)); \
123 /* Support routines for XCOFF debugging info. */
125 /* Assign NUMBER as the stabx type number for the type described by NAME.
126 Search all decls in the list SYMS to find the type NAME. */
129 assign_type_number (syms, name, number)
136 for (decl = syms; decl; decl = TREE_CHAIN (decl))
138 && strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), name) == 0)
140 TREE_ASM_WRITTEN (decl) = 1;
141 TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = number;
145 /* Setup gcc primitive types to use the XCOFF built-in type numbers where
149 xcoff_output_standard_types (syms)
152 /* Handle built-in C types here. */
154 assign_type_number (syms, "int", -1);
155 assign_type_number (syms, "char", -2);
156 assign_type_number (syms, "short int", -3);
157 assign_type_number (syms, "long int", -4);
158 assign_type_number (syms, "unsigned char", -5);
159 assign_type_number (syms, "signed char", -6);
160 assign_type_number (syms, "short unsigned int", -7);
161 assign_type_number (syms, "unsigned int", -8);
162 /* No such type "unsigned". */
163 assign_type_number (syms, "long unsigned int", -10);
164 assign_type_number (syms, "void", -11);
165 assign_type_number (syms, "float", -12);
166 assign_type_number (syms, "double", -13);
167 assign_type_number (syms, "long double", -14);
168 /* Pascal and Fortran types run from -15 to -29. */
169 /* No such type "wchar". */
171 /* "long long int", and "long long unsigned int", are not handled here,
172 because there are no predefined types that match them. */
174 /* ??? Should also handle built-in C++ and Obj-C types. There perhaps
175 aren't any that C doesn't already have. */
178 /* Print an error message for unrecognized stab codes. */
180 #define UNKNOWN_STAB(STR) \
182 fprintf(stderr, "Error, unknown stab %s: : 0x%x\n", STR, stab); \
186 /* Conversion routine from BSD stabs to AIX storage classes. */
189 stab_to_sclass (stab)
198 UNKNOWN_STAB ("N_FNAME");
209 UNKNOWN_STAB ("N_MAIN");
216 UNKNOWN_STAB ("N_SSYM");
232 UNKNOWN_STAB ("N_SO");
236 UNKNOWN_STAB ("N_SOL");
240 UNKNOWN_STAB ("N_SLINE");
244 UNKNOWN_STAB ("N_DSLINE");
248 UNKNOWN_STAB ("N_BSLINE");
251 /* This has the same value as N_BSLINE. */
253 UNKNOWN_STAB ("N_BROWS");
258 UNKNOWN_STAB ("N_BINCL");
262 UNKNOWN_STAB ("N_EINCL");
266 UNKNOWN_STAB ("N_EXCL");
270 UNKNOWN_STAB ("N_LBRAC");
274 UNKNOWN_STAB ("N_RBRAC");
285 UNKNOWN_STAB ("N_LENG");
289 UNKNOWN_STAB ("N_PC");
293 UNKNOWN_STAB ("N_M2C");
297 UNKNOWN_STAB ("N_SCOPE");
301 UNKNOWN_STAB ("N_CATCH");
305 UNKNOWN_STAB ("default");
310 /* In XCOFF, we have to have this .bf before the function prologue.
311 Rely on the value of `dbx_begin_function_line' not to duplicate .bf. */
314 xcoffout_output_first_source_line (file, last_linenum)
318 ASM_OUTPUT_LFB (file, last_linenum);
319 dbxout_parms (DECL_ARGUMENTS (current_function_decl));
320 ASM_OUTPUT_SOURCE_LINE (file, last_linenum);
323 /* Output the symbols defined in block number DO_BLOCK.
324 Set NEXT_BLOCK_NUMBER to 0 before calling.
326 This function works by walking the tree structure of blocks,
327 counting blocks until it finds the desired block. */
329 static int do_block = 0;
331 static int next_block_number;
334 xcoffout_block (block, depth, args)
341 /* Ignore blocks never expanded or otherwise marked as real. */
342 if (TREE_USED (block))
344 /* When we reach the specified block, output its symbols. */
345 if (next_block_number == do_block)
347 /* Output the syms of the block. */
348 if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
349 dbxout_syms (BLOCK_VARS (block));
351 dbxout_reg_parms (args);
353 /* We are now done with the block. Don't go to inner blocks. */
356 /* If we are past the specified block, stop the scan. */
357 else if (next_block_number >= do_block)
362 /* Output the subblocks. */
363 xcoffout_block (BLOCK_SUBBLOCKS (block), depth + 1, NULL_TREE);
365 block = BLOCK_CHAIN (block);
369 /* Describe the beginning of an internal block within a function.
370 Also output descriptions of variables defined in this block.
372 N is the number of the block, by order of beginning, counting from 1,
373 and not counting the outermost (function top-level) block.
374 The blocks match the BLOCKs in DECL_INITIAL (current_function_decl),
375 if the count starts at 0 for the outermost one. */
378 xcoffout_begin_block (file, line, n)
383 tree decl = current_function_decl;
385 ASM_OUTPUT_LBB (file, line, n);
388 next_block_number = 0;
389 xcoffout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl));
392 /* Describe the end line-number of an internal block within a function. */
395 xcoffout_end_block (file, line, n)
400 ASM_OUTPUT_LBE (file, line, n);
403 /* Called at beginning of function (before prologue).
404 Declare function as needed for debugging. */
407 xcoffout_declare_function (file, decl, name)
415 for (i = 0; name[i]; ++i)
419 n = (char *) alloca (i + 1);
420 strncpy (n, name, i);
426 dbxout_symbol (decl, 0);
427 fprintf (file, "\t.function .%s,.%s,16,044,FE..%s-.%s\n", n, n, n, n);
430 /* Called at beginning of function body (after prologue).
431 Record the function's starting line number, so we can output
432 relative line numbers for the other lines.
433 Record the file name that this function is contained in. */
436 xcoffout_begin_function (file, last_linenum)
440 ASM_OUTPUT_LFB (file, last_linenum);
443 /* Called at end of function (before epilogue).
444 Describe end of outermost block. */
447 xcoffout_end_function (file, last_linenum)
451 ASM_OUTPUT_LFE (file, last_linenum);
454 /* Output xcoff info for the absolute end of a function.
455 Called after the epilogue is output. */
458 xcoffout_end_epilogue (file)
461 /* We need to pass the correct function size to .function, otherwise,
462 the xas assembler can't figure out the correct size for the function
463 aux entry. So, we emit a label after the last instruction which can
464 be used by the .function pseudo op to calculate the function size. */
466 char *fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
469 fprintf (file, "FE..");
470 ASM_OUTPUT_LABEL (file, fname);
472 #endif /* XCOFF_DEBUGGING_INFO */