]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/xcoffout.c
gcc_release (announce_snapshot): Use changedir instead of plain cd.
[thirdparty/gcc.git] / gcc / xcoffout.c
CommitLineData
265cc84a 1/* Output xcoff-format symbol table information from GNU compiler.
aa335b76 2 Copyright (C) 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003, 2004
abf9af02 3 Free Software Foundation, Inc.
265cc84a 4
1322177d 5This file is part of GCC.
265cc84a 6
1322177d
LB
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
265cc84a 11
1322177d
LB
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
265cc84a
MM
16
17You should have received a copy of the GNU General Public License
1322177d
LB
18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
265cc84a 21
265cc84a
MM
22/* Output xcoff-format symbol table data. The main functionality is contained
23 in dbxout.c. This file implements the sdbout-like parts of the xcoff
24 interface. Many functions are very similar to their counterparts in
25 sdbout.c. */
26
265cc84a 27#include "config.h"
670ee920 28#include "system.h"
4977bab6
ZW
29#include "coretypes.h"
30#include "tm.h"
265cc84a
MM
31#include "tree.h"
32#include "rtl.h"
33#include "flags.h"
296b8152
KG
34#include "toplev.h"
35#include "output.h"
951a525f 36#include "ggc.h"
772c5265 37#include "target.h"
265cc84a
MM
38
39#ifdef XCOFF_DEBUGGING_INFO
40
41/* This defines the C_* storage classes. */
1d3f6c9f 42#include "xcoff.h"
f246a305 43#include "xcoffout.h"
296b8152 44#include "dbxout.h"
265cc84a 45#include "gstab.h"
265cc84a 46
265cc84a
MM
47/* Line number of beginning of current function, minus one.
48 Negative means not in a function or not using xcoff. */
49
d12de8ce
RK
50static int xcoff_begin_function_line = -1;
51static int xcoff_inlining = 0;
265cc84a
MM
52
53/* Name of the current include file. */
54
53cd5d6c 55const char *xcoff_current_include_file;
265cc84a
MM
56
57/* Name of the current function file. This is the file the `.bf' is
58 emitted from. In case a line is emitted from a different file,
59 (by including that file of course), then the line number will be
60 absolute. */
61
53cd5d6c 62static const char *xcoff_current_function_file;
265cc84a
MM
63
64/* Names of bss and data sections. These should be unique names for each
65 compilation unit. */
66
67char *xcoff_bss_section_name;
68char *xcoff_private_data_section_name;
69char *xcoff_read_only_section_name;
3fe49c00
JW
70
71/* Last source file name mentioned in a NOTE insn. */
72
53cd5d6c 73const char *xcoff_lastfile;
265cc84a
MM
74\f
75/* Macro definitions used below. */
265cc84a 76
3fe49c00 77#define ABS_OR_RELATIVE_LINENO(LINENO) \
e02791a6 78((xcoff_inlining) ? (LINENO) : (LINENO) - xcoff_begin_function_line)
3fe49c00
JW
79
80/* Output source line numbers via ".line" rather than ".stabd". */
a8d0467e 81#define ASM_OUTPUT_SOURCE_LINE(FILE,LINENUM,COUNTER) \
c203e7fe
KH
82 do \
83 { \
84 if (xcoff_begin_function_line >= 0) \
85 fprintf (FILE, "\t.line\t%d\n", ABS_OR_RELATIVE_LINENO (LINENUM)); \
86 } \
87 while (0)
3fe49c00 88
265cc84a
MM
89#define ASM_OUTPUT_LFB(FILE,LINENUM) \
90{ \
91 if (xcoff_begin_function_line == -1) \
92 { \
93 xcoff_begin_function_line = (LINENUM) - 1;\
94 fprintf (FILE, "\t.bf\t%d\n", (LINENUM)); \
95 } \
96 xcoff_current_function_file \
97 = (xcoff_current_include_file \
98 ? xcoff_current_include_file : main_input_filename); \
99}
100
2e1eedd6 101#define ASM_OUTPUT_LFE(FILE,LINENUM) \
c203e7fe
KH
102 do \
103 { \
104 fprintf (FILE, "\t.ef\t%d\n", (LINENUM)); \
105 xcoff_begin_function_line = -1; \
106 } \
107 while (0)
265cc84a
MM
108
109#define ASM_OUTPUT_LBB(FILE,LINENUM,BLOCKNUM) \
5c43aed8 110 fprintf (FILE, "\t.bb\t%d\n", ABS_OR_RELATIVE_LINENO (LINENUM))
265cc84a
MM
111
112#define ASM_OUTPUT_LBE(FILE,LINENUM,BLOCKNUM) \
5c43aed8 113 fprintf (FILE, "\t.eb\t%d\n", ABS_OR_RELATIVE_LINENO (LINENUM))
670ee920 114
2e1eedd6
AJ
115static void xcoffout_block (tree, int, tree);
116static void xcoffout_source_file (FILE *, const char *, int);
265cc84a
MM
117\f
118/* Support routines for XCOFF debugging info. */
119
21d13d83 120struct xcoff_type_number
265cc84a 121{
21d13d83
ZW
122 const char *name;
123 int number;
124};
125static const struct xcoff_type_number xcoff_type_numbers[] = {
126 { "int", -1 },
127 { "char", -2 },
128 { "short int", -3 },
129 { "long int", -4 }, /* fiddled to -31 if 64 bits */
130 { "unsigned char", -5 },
131 { "signed char", -6 },
132 { "short unsigned int", -7 },
133 { "unsigned int", -8 },
265cc84a 134 /* No such type "unsigned". */
21d13d83
ZW
135 { "long unsigned int", -10 }, /* fiddled to -32 if 64 bits */
136 { "void", -11 },
137 { "float", -12 },
138 { "double", -13 },
139 { "long double", -14 },
265cc84a 140 /* Pascal and Fortran types run from -15 to -29. */
21d13d83
ZW
141 { "wchar", -30 }, /* XXX Should be "wchar_t" ? */
142 { "long long int", -31 },
143 { "long long unsigned int", -32 },
0be37202 144 /* Additional Fortran types run from -33 to -37. */
265cc84a
MM
145
146 /* ??? Should also handle built-in C++ and Obj-C types. There perhaps
147 aren't any that C doesn't already have. */
21d13d83
ZW
148};
149
150/* Returns an XCOFF fundamental type number for DECL (assumed to be a
151 TYPE_DECL), or 0 if dbxout.c should assign a type number normally. */
152int
153xcoff_assign_fundamental_type_number (tree decl)
154{
f433554b 155 const char *name;
21d13d83
ZW
156 size_t i;
157
158 /* Do not waste time searching the list for non-intrinsic types. */
f433554b 159 if (DECL_NAME (decl) == 0 || DECL_SOURCE_LINE (decl) > 0)
21d13d83
ZW
160 return 0;
161
f433554b
ZW
162 name = IDENTIFIER_POINTER (DECL_NAME (decl));
163
21d13d83
ZW
164 /* Linear search, blech, but the list is too small to bother
165 doing anything else. */
166 for (i = 0; i < ARRAY_SIZE (xcoff_type_numbers); i++)
167 if (!strcmp (xcoff_type_numbers[i].name, name))
168 goto found;
169 return 0;
170
171 found:
172 /* -4 and -10 should be replaced with -31 and -32, respectively,
173 when used for a 64-bit type. */
174 if (int_size_in_bytes (TREE_TYPE (decl)) == 8)
175 {
176 if (xcoff_type_numbers[i].number == -4)
177 return -31;
178 if (xcoff_type_numbers[i].number == -10)
179 return -32;
180 }
181 return xcoff_type_numbers[i].number;
265cc84a
MM
182}
183
184/* Print an error message for unrecognized stab codes. */
185
186#define UNKNOWN_STAB(STR) \
1f978f5f 187 internal_error ("no sclass for %s stab (0x%x)\n", STR, stab)
265cc84a
MM
188
189/* Conversion routine from BSD stabs to AIX storage classes. */
190
191int
2e1eedd6 192stab_to_sclass (int stab)
265cc84a
MM
193{
194 switch (stab)
195 {
196 case N_GSYM:
197 return C_GSYM;
198
199 case N_FNAME:
abf9af02 200 UNKNOWN_STAB ("N_FNAME");
265cc84a
MM
201
202 case N_FUN:
203 return C_FUN;
204
205 case N_STSYM:
206 case N_LCSYM:
207 return C_STSYM;
208
209 case N_MAIN:
abf9af02 210 UNKNOWN_STAB ("N_MAIN");
265cc84a
MM
211
212 case N_RSYM:
213 return C_RSYM;
214
215 case N_SSYM:
abf9af02 216 UNKNOWN_STAB ("N_SSYM");
265cc84a
MM
217
218 case N_RPSYM:
219 return C_RPSYM;
220
221 case N_PSYM:
222 return C_PSYM;
223 case N_LSYM:
224 return C_LSYM;
225 case N_DECL:
226 return C_DECL;
227 case N_ENTRY:
228 return C_ENTRY;
229
230 case N_SO:
abf9af02 231 UNKNOWN_STAB ("N_SO");
265cc84a
MM
232
233 case N_SOL:
abf9af02 234 UNKNOWN_STAB ("N_SOL");
265cc84a
MM
235
236 case N_SLINE:
abf9af02 237 UNKNOWN_STAB ("N_SLINE");
265cc84a
MM
238
239 case N_DSLINE:
abf9af02 240 UNKNOWN_STAB ("N_DSLINE");
265cc84a
MM
241
242 case N_BSLINE:
abf9af02 243 UNKNOWN_STAB ("N_BSLINE");
265cc84a
MM
244
245 case N_BINCL:
abf9af02 246 UNKNOWN_STAB ("N_BINCL");
265cc84a
MM
247
248 case N_EINCL:
abf9af02 249 UNKNOWN_STAB ("N_EINCL");
265cc84a
MM
250
251 case N_EXCL:
abf9af02 252 UNKNOWN_STAB ("N_EXCL");
265cc84a
MM
253
254 case N_LBRAC:
abf9af02 255 UNKNOWN_STAB ("N_LBRAC");
265cc84a
MM
256
257 case N_RBRAC:
abf9af02 258 UNKNOWN_STAB ("N_RBRAC");
265cc84a
MM
259
260 case N_BCOMM:
261 return C_BCOMM;
262 case N_ECOMM:
263 return C_ECOMM;
264 case N_ECOML:
265 return C_ECOML;
266
267 case N_LENG:
abf9af02 268 UNKNOWN_STAB ("N_LENG");
265cc84a
MM
269
270 case N_PC:
abf9af02 271 UNKNOWN_STAB ("N_PC");
265cc84a
MM
272
273 case N_M2C:
abf9af02 274 UNKNOWN_STAB ("N_M2C");
265cc84a
MM
275
276 case N_SCOPE:
abf9af02 277 UNKNOWN_STAB ("N_SCOPE");
265cc84a
MM
278
279 case N_CATCH:
abf9af02 280 UNKNOWN_STAB ("N_CATCH");
ad087b92 281
ad087b92
ZW
282 case N_OPT:
283 UNKNOWN_STAB ("N_OPT");
265cc84a
MM
284
285 default:
ad087b92 286 UNKNOWN_STAB ("?");
abf9af02 287 }
265cc84a 288}
3fe49c00 289\f
3fe49c00
JW
290/* Output debugging info to FILE to switch to sourcefile FILENAME.
291 INLINE_P is true if this is from an inlined function. */
292
0a336522 293static void
2e1eedd6 294xcoffout_source_file (FILE *file, const char *filename, int inline_p)
3fe49c00
JW
295{
296 if (filename
297 && (xcoff_lastfile == 0 || strcmp (filename, xcoff_lastfile)
e02791a6
RK
298 || (inline_p && ! xcoff_inlining)
299 || (! inline_p && xcoff_inlining)))
3fe49c00
JW
300 {
301 if (xcoff_current_include_file)
302 {
303 fprintf (file, "\t.ei\t");
304 output_quoted_string (file, xcoff_current_include_file);
305 fprintf (file, "\n");
306 xcoff_current_include_file = NULL;
307 }
abf9af02 308 xcoff_inlining = inline_p;
3fe49c00
JW
309 if (strcmp (main_input_filename, filename) || inline_p)
310 {
311 fprintf (file, "\t.bi\t");
312 output_quoted_string (file, filename);
313 fprintf (file, "\n");
314 xcoff_current_include_file = filename;
315 }
3fe49c00
JW
316 xcoff_lastfile = filename;
317 }
318}
319
653e276c 320/* Output a line number symbol entry for location (FILENAME, LINE). */
3fe49c00
JW
321
322void
2e1eedd6 323xcoffout_source_line (unsigned int line, const char *filename)
3fe49c00 324{
653e276c
NB
325 bool inline_p = (strcmp (xcoff_current_function_file, filename) != 0
326 || (int) line < xcoff_begin_function_line);
327
328 xcoffout_source_file (asm_out_file, filename, inline_p);
3fe49c00 329
a8d0467e 330 ASM_OUTPUT_SOURCE_LINE (asm_out_file, line, 0);
3fe49c00
JW
331}
332\f
265cc84a 333/* Output the symbols defined in block number DO_BLOCK.
265cc84a
MM
334
335 This function works by walking the tree structure of blocks,
336 counting blocks until it finds the desired block. */
337
338static int do_block = 0;
339
265cc84a 340static void
2e1eedd6 341xcoffout_block (tree block, int depth, tree args)
265cc84a
MM
342{
343 while (block)
344 {
345 /* Ignore blocks never expanded or otherwise marked as real. */
346 if (TREE_USED (block))
347 {
348 /* When we reach the specified block, output its symbols. */
18c038b9 349 if (BLOCK_NUMBER (block) == do_block)
265cc84a
MM
350 {
351 /* Output the syms of the block. */
352 if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
353 dbxout_syms (BLOCK_VARS (block));
354 if (args)
355 dbxout_reg_parms (args);
356
357 /* We are now done with the block. Don't go to inner blocks. */
358 return;
359 }
360 /* If we are past the specified block, stop the scan. */
18c038b9 361 else if (BLOCK_NUMBER (block) >= do_block)
265cc84a
MM
362 return;
363
265cc84a 364 /* Output the subblocks. */
c166a311 365 xcoffout_block (BLOCK_SUBBLOCKS (block), depth + 1, NULL_TREE);
265cc84a
MM
366 }
367 block = BLOCK_CHAIN (block);
368 }
369}
370
371/* Describe the beginning of an internal block within a function.
372 Also output descriptions of variables defined in this block.
373
374 N is the number of the block, by order of beginning, counting from 1,
375 and not counting the outermost (function top-level) block.
376 The blocks match the BLOCKs in DECL_INITIAL (current_function_decl),
377 if the count starts at 0 for the outermost one. */
378
379void
2e1eedd6 380xcoffout_begin_block (unsigned int line, unsigned int n)
265cc84a
MM
381{
382 tree decl = current_function_decl;
383
ced21a32
JW
384 /* The IBM AIX compiler does not emit a .bb for the function level scope,
385 so we avoid it here also. */
386 if (n != 1)
e2a12aca 387 ASM_OUTPUT_LBB (asm_out_file, line, n);
265cc84a
MM
388
389 do_block = n;
265cc84a
MM
390 xcoffout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl));
391}
392
393/* Describe the end line-number of an internal block within a function. */
394
395void
2e1eedd6 396xcoffout_end_block (unsigned int line, unsigned int n)
265cc84a 397{
ced21a32 398 if (n != 1)
e2a12aca 399 ASM_OUTPUT_LBE (asm_out_file, line, n);
265cc84a
MM
400}
401
c2a47e48
RK
402/* Called at beginning of function (before prologue).
403 Declare function as needed for debugging. */
404
405void
2e1eedd6 406xcoffout_declare_function (FILE *file, tree decl, const char *name)
c2a47e48 407{
c2a47e48
RK
408 int i;
409
0a336522
KG
410 if (*name == '*')
411 name++;
4255aa9b
RK
412 else
413 for (i = 0; name[i]; ++i)
414 {
415 if (name[i] == '[')
416 {
703ad42b 417 char *n = alloca (i + 1);
4255aa9b
RK
418 strncpy (n, name, i);
419 n[i] = '\0';
0a336522 420 name = n;
4255aa9b
RK
421 break;
422 }
423 }
c2a47e48 424
9faa82d8 425 /* Any pending .bi or .ei must occur before the .function pseudo op.
ad3b4030
JW
426 Otherwise debuggers will think that the function is in the previous
427 file and/or at the wrong line number. */
f31686a3 428 xcoffout_source_file (file, DECL_SOURCE_FILE (decl), 0);
c2a47e48 429 dbxout_symbol (decl, 0);
c81fc13e
DE
430
431 /* .function NAME, TOP, MAPPING, TYPE, SIZE
432 16 and 044 are placeholders for backwards compatibility */
0a336522
KG
433 fprintf (file, "\t.function .%s,.%s,16,044,FE..%s-.%s\n",
434 name, name, name, name);
c2a47e48
RK
435}
436
653e276c 437/* Called at beginning of function body (at start of prologue).
265cc84a
MM
438 Record the function's starting line number, so we can output
439 relative line numbers for the other lines.
440 Record the file name that this function is contained in. */
441
442void
2e1eedd6
AJ
443xcoffout_begin_prologue (unsigned int line,
444 const char *file ATTRIBUTE_UNUSED)
265cc84a 445{
653e276c 446 ASM_OUTPUT_LFB (asm_out_file, line);
aa630177 447 dbxout_parms (DECL_ARGUMENTS (current_function_decl));
00a2e46c
JW
448
449 /* Emit the symbols for the outermost BLOCK's variables. sdbout.c does this
450 in sdbout_begin_block, but there is no guarantee that there will be any
451 inner block 1, so we must do it here. This gives a result similar to
452 dbxout, so it does make some sense. */
26a13c2b 453 do_block = BLOCK_NUMBER (DECL_INITIAL (current_function_decl));
00a2e46c
JW
454 xcoffout_block (DECL_INITIAL (current_function_decl), 0,
455 DECL_ARGUMENTS (current_function_decl));
456
a8d0467e 457 ASM_OUTPUT_SOURCE_LINE (asm_out_file, line, 0);
265cc84a
MM
458}
459
460/* Called at end of function (before epilogue).
461 Describe end of outermost block. */
462
463void
2e1eedd6 464xcoffout_end_function (unsigned int last_linenum)
265cc84a 465{
e2a12aca 466 ASM_OUTPUT_LFE (asm_out_file, last_linenum);
265cc84a
MM
467}
468
469/* Output xcoff info for the absolute end of a function.
470 Called after the epilogue is output. */
471
472void
2e1eedd6
AJ
473xcoffout_end_epilogue (unsigned int line ATTRIBUTE_UNUSED,
474 const char *file ATTRIBUTE_UNUSED)
265cc84a
MM
475{
476 /* We need to pass the correct function size to .function, otherwise,
477 the xas assembler can't figure out the correct size for the function
478 aux entry. So, we emit a label after the last instruction which can
6dc42e49 479 be used by the .function pseudo op to calculate the function size. */
265cc84a 480
53cd5d6c 481 const char *fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
265cc84a
MM
482 if (*fname == '*')
483 ++fname;
e2a12aca
NB
484 fprintf (asm_out_file, "FE..");
485 ASM_OUTPUT_LABEL (asm_out_file, fname);
265cc84a
MM
486}
487#endif /* XCOFF_DEBUGGING_INFO */