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