Compute DECL_ASSEMBLER_NAME lazily.
[gcc.git] / gcc / dbxout.c
1 /* Output dbx-format symbol table information from GNU compiler.
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22
23 /* Output dbx-format symbol table data.
24 This consists of many symbol table entries, each of them
25 a .stabs assembler pseudo-op with four operands:
26 a "name" which is really a description of one symbol and its type,
27 a "code", which is a symbol defined in stab.h whose name starts with N_,
28 an unused operand always 0,
29 and a "value" which is an address or an offset.
30 The name is enclosed in doublequote characters.
31
32 Each function, variable, typedef, and structure tag
33 has a symbol table entry to define it.
34 The beginning and end of each level of name scoping within
35 a function are also marked by special symbol table entries.
36
37 The "name" consists of the symbol name, a colon, a kind-of-symbol letter,
38 and a data type number. The data type number may be followed by
39 "=" and a type definition; normally this will happen the first time
40 the type number is mentioned. The type definition may refer to
41 other types by number, and those type numbers may be followed
42 by "=" and nested definitions.
43
44 This can make the "name" quite long.
45 When a name is more than 80 characters, we split the .stabs pseudo-op
46 into two .stabs pseudo-ops, both sharing the same "code" and "value".
47 The first one is marked as continued with a double-backslash at the
48 end of its "name".
49
50 The kind-of-symbol letter distinguished function names from global
51 variables from file-scope variables from parameters from auto
52 variables in memory from typedef names from register variables.
53 See `dbxout_symbol'.
54
55 The "code" is mostly redundant with the kind-of-symbol letter
56 that goes in the "name", but not entirely: for symbols located
57 in static storage, the "code" says which segment the address is in,
58 which controls how it is relocated.
59
60 The "value" for a symbol in static storage
61 is the core address of the symbol (actually, the assembler
62 label for the symbol). For a symbol located in a stack slot
63 it is the stack offset; for one in a register, the register number.
64 For a typedef symbol, it is zero.
65
66 If DEBUG_SYMS_TEXT is defined, all debugging symbols must be
67 output while in the text section.
68
69 For more on data type definitions, see `dbxout_type'. */
70
71 #include "config.h"
72 #include "system.h"
73
74 #include "tree.h"
75 #include "rtl.h"
76 #include "flags.h"
77 #include "regs.h"
78 #include "insn-config.h"
79 #include "reload.h"
80 #include "output.h" /* ASM_OUTPUT_SOURCE_LINE may refer to sdb functions. */
81 #include "dbxout.h"
82 #include "toplev.h"
83 #include "tm_p.h"
84 #include "ggc.h"
85
86 #ifdef XCOFF_DEBUGGING_INFO
87 #include "xcoffout.h"
88 #endif
89
90 #ifndef ASM_STABS_OP
91 #define ASM_STABS_OP "\t.stabs\t"
92 #endif
93
94 #ifndef ASM_STABN_OP
95 #define ASM_STABN_OP "\t.stabn\t"
96 #endif
97
98 #ifndef DBX_TYPE_DECL_STABS_CODE
99 #define DBX_TYPE_DECL_STABS_CODE N_LSYM
100 #endif
101
102 #ifndef DBX_STATIC_CONST_VAR_CODE
103 #define DBX_STATIC_CONST_VAR_CODE N_FUN
104 #endif
105
106 #ifndef DBX_REGPARM_STABS_CODE
107 #define DBX_REGPARM_STABS_CODE N_RSYM
108 #endif
109
110 #ifndef DBX_REGPARM_STABS_LETTER
111 #define DBX_REGPARM_STABS_LETTER 'P'
112 #endif
113
114 /* This is used for parameters passed by invisible reference in a register. */
115 #ifndef GDB_INV_REF_REGPARM_STABS_LETTER
116 #define GDB_INV_REF_REGPARM_STABS_LETTER 'a'
117 #endif
118
119 #ifndef DBX_MEMPARM_STABS_LETTER
120 #define DBX_MEMPARM_STABS_LETTER 'p'
121 #endif
122
123 #ifndef FILE_NAME_JOINER
124 #define FILE_NAME_JOINER "/"
125 #endif
126
127 /* Nonzero means if the type has methods, only output debugging
128 information if methods are actually written to the asm file. This
129 optimization only works if the debugger can detect the special C++
130 marker. */
131
132 #define MINIMAL_DEBUG 1
133
134 #ifdef NO_DOLLAR_IN_LABEL
135 #ifdef NO_DOT_IN_LABEL
136 #undef MINIMAL_DEBUG
137 #define MINIMAL_DEBUG 0
138 #endif
139 #endif
140
141 /* Typical USG systems don't have stab.h, and they also have
142 no use for DBX-format debugging info. */
143
144 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
145
146 static int flag_minimal_debug = MINIMAL_DEBUG;
147
148 /* Nonzero if we have actually used any of the GDB extensions
149 to the debugging format. The idea is that we use them for the
150 first time only if there's a strong reason, but once we have done that,
151 we use them whenever convenient. */
152
153 static int have_used_extensions = 0;
154
155 /* Number for the next N_SOL filename stabs label. The number 0 is reserved
156 for the N_SO filename stabs label. */
157
158 static int source_label_number = 1;
159
160 #ifdef DEBUG_SYMS_TEXT
161 #define FORCE_TEXT text_section ();
162 #else
163 #define FORCE_TEXT
164 #endif
165
166 /* If there is a system stab.h, use it. Otherwise, use our own. */
167 /* ??? This is supposed to describe the target's stab format, so using
168 the host HAVE_STAB_H appears to be wrong. For now, we use our own file
169 when cross compiling. */
170 #if defined (USG) || !defined (HAVE_STAB_H) || defined (CROSS_COMPILE)
171 #include "gstab.h" /* If doing DBX on sysV, use our own stab.h. */
172 #else
173 #include <stab.h>
174
175 /* This is a GNU extension we need to reference in this file. */
176 #ifndef N_CATCH
177 #define N_CATCH 0x54
178 #endif
179 #endif
180
181 #ifdef __GNU_STAB__
182 #define STAB_CODE_TYPE enum __stab_debug_code
183 #else
184 #define STAB_CODE_TYPE int
185 #endif
186
187 /* 1 if PARM is passed to this function in memory. */
188
189 #define PARM_PASSED_IN_MEMORY(PARM) \
190 (GET_CODE (DECL_INCOMING_RTL (PARM)) == MEM)
191
192 /* A C expression for the integer offset value of an automatic variable
193 (N_LSYM) having address X (an RTX). */
194 #ifndef DEBUGGER_AUTO_OFFSET
195 #define DEBUGGER_AUTO_OFFSET(X) \
196 (GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0)
197 #endif
198
199 /* A C expression for the integer offset value of an argument (N_PSYM)
200 having address X (an RTX). The nominal offset is OFFSET. */
201 #ifndef DEBUGGER_ARG_OFFSET
202 #define DEBUGGER_ARG_OFFSET(OFFSET, X) (OFFSET)
203 #endif
204
205 /* Stream for writing to assembler file. */
206
207 static FILE *asmfile;
208
209 /* Last source file name mentioned in a NOTE insn. */
210
211 static const char *lastfile;
212
213 /* Current working directory. */
214
215 static const char *cwd;
216
217 enum typestatus {TYPE_UNSEEN, TYPE_XREF, TYPE_DEFINED};
218
219 /* Structure recording information about a C data type.
220 The status element says whether we have yet output
221 the definition of the type. TYPE_XREF says we have
222 output it as a cross-reference only.
223 The file_number and type_number elements are used if DBX_USE_BINCL
224 is defined. */
225
226 struct typeinfo
227 {
228 enum typestatus status;
229 #ifdef DBX_USE_BINCL
230 int file_number;
231 int type_number;
232 #endif
233 };
234
235 /* Vector recording information about C data types.
236 When we first notice a data type (a tree node),
237 we assign it a number using next_type_number.
238 That is its index in this vector. */
239
240 struct typeinfo *typevec;
241
242 /* Number of elements of space allocated in `typevec'. */
243
244 static int typevec_len;
245
246 /* In dbx output, each type gets a unique number.
247 This is the number for the next type output.
248 The number, once assigned, is in the TYPE_SYMTAB_ADDRESS field. */
249
250 static int next_type_number;
251
252 #ifdef DBX_USE_BINCL
253
254 /* When using N_BINCL in dbx output, each type number is actually a
255 pair of the file number and the type number within the file.
256 This is a stack of input files. */
257
258 struct dbx_file
259 {
260 struct dbx_file *next;
261 int file_number;
262 int next_type_number;
263 };
264
265 /* This is the top of the stack. */
266
267 static struct dbx_file *current_file;
268
269 /* This is the next file number to use. */
270
271 static int next_file_number;
272
273 #endif /* DBX_USE_BINCL */
274
275 /* These variables are for dbxout_symbol to communicate to
276 dbxout_finish_symbol.
277 current_sym_code is the symbol-type-code, a symbol N_... define in stab.h.
278 current_sym_value and current_sym_addr are two ways to address the
279 value to store in the symtab entry.
280 current_sym_addr if nonzero represents the value as an rtx.
281 If that is zero, current_sym_value is used. This is used
282 when the value is an offset (such as for auto variables,
283 register variables and parms). */
284
285 static STAB_CODE_TYPE current_sym_code;
286 static int current_sym_value;
287 static rtx current_sym_addr;
288
289 /* Number of chars of symbol-description generated so far for the
290 current symbol. Used by CHARS and CONTIN. */
291
292 static int current_sym_nchars;
293
294 /* Report having output N chars of the current symbol-description. */
295
296 #define CHARS(N) (current_sym_nchars += (N))
297
298 /* Break the current symbol-description, generating a continuation,
299 if it has become long. */
300
301 #ifndef DBX_CONTIN_LENGTH
302 #define DBX_CONTIN_LENGTH 80
303 #endif
304
305 #if DBX_CONTIN_LENGTH > 0
306 #define CONTIN \
307 do {if (current_sym_nchars > DBX_CONTIN_LENGTH) dbxout_continue ();} while (0)
308 #else
309 #define CONTIN do { } while (0)
310 #endif
311
312 #if defined(ASM_OUTPUT_SECTION_NAME)
313 static void dbxout_function_end PARAMS ((void));
314 #endif
315 static void dbxout_typedefs PARAMS ((tree));
316 static void dbxout_type_index PARAMS ((tree));
317 #if DBX_CONTIN_LENGTH > 0
318 static void dbxout_continue PARAMS ((void));
319 #endif
320 static void dbxout_type_fields PARAMS ((tree));
321 static void dbxout_type_method_1 PARAMS ((tree, const char *));
322 static void dbxout_type_methods PARAMS ((tree));
323 static void dbxout_range_type PARAMS ((tree));
324 static void dbxout_type PARAMS ((tree, int, int));
325 static void print_int_cst_octal PARAMS ((tree));
326 static void print_octal PARAMS ((unsigned HOST_WIDE_INT, int));
327 static void dbxout_type_name PARAMS ((tree));
328 static int dbxout_symbol_location PARAMS ((tree, tree, const char *, rtx));
329 static void dbxout_symbol_name PARAMS ((tree, const char *, int));
330 static void dbxout_prepare_symbol PARAMS ((tree));
331 static void dbxout_finish_symbol PARAMS ((tree));
332 static void dbxout_block PARAMS ((tree, int, tree));
333 static void dbxout_really_begin_function PARAMS ((tree));
334 \f
335 #if defined(ASM_OUTPUT_SECTION_NAME)
336 static void
337 dbxout_function_end ()
338 {
339 static int scope_labelno = 0;
340 char lscope_label_name[100];
341 /* Convert Ltext into the appropriate format for local labels in case
342 the system doesn't insert underscores in front of user generated
343 labels. */
344 ASM_GENERATE_INTERNAL_LABEL (lscope_label_name, "Lscope", scope_labelno);
345 ASM_OUTPUT_INTERNAL_LABEL (asmfile, "Lscope", scope_labelno);
346 scope_labelno++;
347
348 /* By convention, GCC will mark the end of a function with an N_FUN
349 symbol and an empty string. */
350 fprintf (asmfile, "%s\"\",%d,0,0,", ASM_STABS_OP, N_FUN);
351 assemble_name (asmfile, lscope_label_name);
352 fputc ('-', asmfile);
353 assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
354 fprintf (asmfile, "\n");
355 }
356 #endif /* ! NO_DBX_FUNCTION_END */
357
358 /* At the beginning of compilation, start writing the symbol table.
359 Initialize `typevec' and output the standard data types of C. */
360
361 void
362 dbxout_init (asm_file, input_file_name, syms)
363 FILE *asm_file;
364 const char *input_file_name;
365 tree syms;
366 {
367 char ltext_label_name[100];
368
369 asmfile = asm_file;
370
371 typevec_len = 100;
372 typevec = (struct typeinfo *) xcalloc (typevec_len, sizeof typevec[0]);
373
374 /* Convert Ltext into the appropriate format for local labels in case
375 the system doesn't insert underscores in front of user generated
376 labels. */
377 ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext", 0);
378
379 /* Put the current working directory in an N_SO symbol. */
380 #ifndef DBX_WORKING_DIRECTORY /* Only some versions of DBX want this,
381 but GDB always does. */
382 if (use_gnu_debug_info_extensions)
383 #endif
384 {
385 if (!cwd && (cwd = getpwd ()) && (!*cwd || cwd[strlen (cwd) - 1] != '/'))
386 {
387 char *wdslash = xmalloc (strlen (cwd) + sizeof (FILE_NAME_JOINER));
388 sprintf (wdslash, "%s%s", cwd, FILE_NAME_JOINER);
389 cwd = wdslash;
390 }
391 if (cwd)
392 {
393 #ifdef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
394 DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (asmfile, cwd);
395 #else /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
396 fprintf (asmfile, "%s", ASM_STABS_OP);
397 output_quoted_string (asmfile, cwd);
398 fprintf (asmfile, ",%d,0,0,%s\n", N_SO, &ltext_label_name[1]);
399 #endif /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
400 }
401 }
402
403 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILENAME
404 /* This should NOT be DBX_OUTPUT_SOURCE_FILENAME. That
405 would give us an N_SOL, and we want an N_SO. */
406 DBX_OUTPUT_MAIN_SOURCE_FILENAME (asmfile, input_file_name);
407 #else /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
408 /* We include outputting `Ltext:' here,
409 because that gives you a way to override it. */
410 /* Used to put `Ltext:' before the reference, but that loses on sun 4. */
411 fprintf (asmfile, "%s", ASM_STABS_OP);
412 output_quoted_string (asmfile, input_file_name);
413 fprintf (asmfile, ",%d,0,0,%s\n",
414 N_SO, &ltext_label_name[1]);
415 text_section ();
416 ASM_OUTPUT_INTERNAL_LABEL (asmfile, "Ltext", 0);
417 #endif /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
418
419 /* Possibly output something to inform GDB that this compilation was by
420 GCC. It's easier for GDB to parse it when after the N_SO's. This
421 is used in Solaris 2. */
422 #ifdef ASM_IDENTIFY_GCC_AFTER_SOURCE
423 ASM_IDENTIFY_GCC_AFTER_SOURCE (asmfile);
424 #endif
425
426 lastfile = input_file_name;
427
428 next_type_number = 1;
429
430 #ifdef DBX_USE_BINCL
431 current_file = (struct dbx_file *) xmalloc (sizeof *current_file);
432 current_file->next = NULL;
433 current_file->file_number = 0;
434 current_file->next_type_number = 1;
435 next_file_number = 1;
436 #endif
437
438 /* Make sure that types `int' and `char' have numbers 1 and 2.
439 Definitions of other integer types will refer to those numbers.
440 (Actually it should no longer matter what their numbers are.
441 Also, if any types with tags have been defined, dbxout_symbol
442 will output them first, so the numbers won't be 1 and 2. That
443 happens in C++. So it's a good thing it should no longer matter). */
444
445 #ifdef DBX_OUTPUT_STANDARD_TYPES
446 DBX_OUTPUT_STANDARD_TYPES (syms);
447 #else
448 dbxout_symbol (TYPE_NAME (integer_type_node), 0);
449 dbxout_symbol (TYPE_NAME (char_type_node), 0);
450 #endif
451
452 /* Get all permanent types that have typedef names,
453 and output them all, except for those already output. */
454
455 dbxout_typedefs (syms);
456 }
457
458 /* Output any typedef names for types described by TYPE_DECLs in SYMS,
459 in the reverse order from that which is found in SYMS. */
460
461 static void
462 dbxout_typedefs (syms)
463 tree syms;
464 {
465 if (syms)
466 {
467 dbxout_typedefs (TREE_CHAIN (syms));
468 if (TREE_CODE (syms) == TYPE_DECL)
469 {
470 tree type = TREE_TYPE (syms);
471 if (TYPE_NAME (type)
472 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
473 && COMPLETE_TYPE_P (type)
474 && ! TREE_ASM_WRITTEN (TYPE_NAME (type)))
475 dbxout_symbol (TYPE_NAME (type), 0);
476 }
477 }
478 }
479
480 /* Change to reading from a new source file. Generate a N_BINCL stab. */
481
482 void
483 dbxout_start_new_source_file (filename)
484 const char *filename ATTRIBUTE_UNUSED;
485 {
486 #ifdef DBX_USE_BINCL
487 struct dbx_file *n = (struct dbx_file *) xmalloc (sizeof *n);
488
489 n->next = current_file;
490 n->file_number = next_file_number++;
491 n->next_type_number = 1;
492 current_file = n;
493 fprintf (asmfile, "%s", ASM_STABS_OP);
494 output_quoted_string (asmfile, filename);
495 fprintf (asmfile, ",%d,0,0,0\n", N_BINCL);
496 #endif
497 }
498
499 /* Revert to reading a previous source file. Generate a N_EINCL stab. */
500
501 void
502 dbxout_resume_previous_source_file ()
503 {
504 #ifdef DBX_USE_BINCL
505 struct dbx_file *next;
506
507 fprintf (asmfile, "%s%d,0,0,0\n", ASM_STABN_OP, N_EINCL);
508 next = current_file->next;
509 free (current_file);
510 current_file = next;
511 #endif
512 }
513
514 /* Output debugging info to FILE to switch to sourcefile FILENAME. */
515
516 void
517 dbxout_source_file (file, filename)
518 FILE *file;
519 const char *filename;
520 {
521 char ltext_label_name[100];
522
523 if (filename && (lastfile == 0 || strcmp (filename, lastfile)))
524 {
525 #ifdef DBX_OUTPUT_SOURCE_FILENAME
526 DBX_OUTPUT_SOURCE_FILENAME (file, filename);
527 #else
528 ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext",
529 source_label_number);
530 fprintf (file, "%s", ASM_STABS_OP);
531 output_quoted_string (file, filename);
532 fprintf (file, ",%d,0,0,%s\n", N_SOL, &ltext_label_name[1]);
533 if (current_function_decl != NULL_TREE
534 && DECL_SECTION_NAME (current_function_decl) != NULL_TREE)
535 ; /* Don't change section amid function. */
536 else
537 text_section ();
538 ASM_OUTPUT_INTERNAL_LABEL (file, "Ltext", source_label_number);
539 source_label_number++;
540 #endif
541 lastfile = filename;
542 }
543 }
544
545 /* Output a line number symbol entry into output stream FILE,
546 for source file FILENAME and line number LINENO. */
547
548 void
549 dbxout_source_line (file, filename, lineno)
550 FILE *file;
551 const char *filename;
552 int lineno;
553 {
554 dbxout_source_file (file, filename);
555
556 #ifdef ASM_OUTPUT_SOURCE_LINE
557 ASM_OUTPUT_SOURCE_LINE (file, lineno);
558 #else
559 fprintf (file, "%s%d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno);
560 #endif
561 }
562
563 /* At the end of compilation, finish writing the symbol table.
564 Unless you define DBX_OUTPUT_MAIN_SOURCE_FILE_END, the default is
565 to do nothing. */
566
567 void
568 dbxout_finish (file, filename)
569 FILE *file ATTRIBUTE_UNUSED;
570 const char *filename ATTRIBUTE_UNUSED;
571 {
572 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILE_END
573 DBX_OUTPUT_MAIN_SOURCE_FILE_END (file, filename);
574 #endif /* DBX_OUTPUT_MAIN_SOURCE_FILE_END */
575 }
576
577 /* Output the index of a type. */
578
579 static void
580 dbxout_type_index (type)
581 tree type;
582 {
583 #ifndef DBX_USE_BINCL
584 fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (type));
585 CHARS (3);
586 #else
587 struct typeinfo *t = &typevec[TYPE_SYMTAB_ADDRESS (type)];
588 fprintf (asmfile, "(%d,%d)", t->file_number, t->type_number);
589 CHARS (7);
590 #endif
591 }
592
593 #if DBX_CONTIN_LENGTH > 0
594 /* Continue a symbol-description that gets too big.
595 End one symbol table entry with a double-backslash
596 and start a new one, eventually producing something like
597 .stabs "start......\\",code,0,value
598 .stabs "...rest",code,0,value */
599
600 static void
601 dbxout_continue ()
602 {
603 #ifdef DBX_CONTIN_CHAR
604 fprintf (asmfile, "%c", DBX_CONTIN_CHAR);
605 #else
606 fprintf (asmfile, "\\\\");
607 #endif
608 dbxout_finish_symbol (NULL_TREE);
609 fprintf (asmfile, "%s\"", ASM_STABS_OP);
610 current_sym_nchars = 0;
611 }
612 #endif /* DBX_CONTIN_LENGTH > 0 */
613 \f
614 /* Subroutine of `dbxout_type'. Output the type fields of TYPE.
615 This must be a separate function because anonymous unions require
616 recursive calls. */
617
618 static void
619 dbxout_type_fields (type)
620 tree type;
621 {
622 tree tem;
623
624 /* Output the name, type, position (in bits), size (in bits) of each
625 field that we can support. */
626 for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
627 {
628 /* Omit here local type decls until we know how to support them. */
629 if (TREE_CODE (tem) == TYPE_DECL
630 /* Omit fields whose position or size are variable or too large to
631 represent. */
632 || (TREE_CODE (tem) == FIELD_DECL
633 && (! host_integerp (bit_position (tem), 0)
634 || ! DECL_SIZE (tem)
635 || ! host_integerp (DECL_SIZE (tem), 1)))
636 /* Omit here the nameless fields that are used to skip bits. */
637 || DECL_IGNORED_P (tem))
638 continue;
639
640 else if (TREE_CODE (tem) != CONST_DECL)
641 {
642 /* Continue the line if necessary,
643 but not before the first field. */
644 if (tem != TYPE_FIELDS (type))
645 CONTIN;
646
647 if (use_gnu_debug_info_extensions
648 && flag_minimal_debug
649 && TREE_CODE (tem) == FIELD_DECL
650 && DECL_VIRTUAL_P (tem)
651 && DECL_ASSEMBLER_NAME (tem))
652 {
653 have_used_extensions = 1;
654 CHARS (3 + IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (tem)));
655 fputs (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (tem)), asmfile);
656 dbxout_type (DECL_FCONTEXT (tem), 0, 0);
657 fprintf (asmfile, ":");
658 dbxout_type (TREE_TYPE (tem), 0, 0);
659 fputc (',', asmfile);
660 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
661 int_bit_position (tem));
662 fputc (';', asmfile);
663 continue;
664 }
665
666 if (DECL_NAME (tem))
667 {
668 fprintf (asmfile, "%s:", IDENTIFIER_POINTER (DECL_NAME (tem)));
669 CHARS (2 + IDENTIFIER_LENGTH (DECL_NAME (tem)));
670 }
671 else
672 {
673 fprintf (asmfile, ":");
674 CHARS (2);
675 }
676
677 if (use_gnu_debug_info_extensions
678 && (TREE_PRIVATE (tem) || TREE_PROTECTED (tem)
679 || TREE_CODE (tem) != FIELD_DECL))
680 {
681 have_used_extensions = 1;
682 putc ('/', asmfile);
683 putc ((TREE_PRIVATE (tem) ? '0'
684 : TREE_PROTECTED (tem) ? '1' : '2'),
685 asmfile);
686 CHARS (2);
687 }
688
689 dbxout_type ((TREE_CODE (tem) == FIELD_DECL
690 && DECL_BIT_FIELD_TYPE (tem))
691 ? DECL_BIT_FIELD_TYPE (tem) : TREE_TYPE (tem), 0, 0);
692
693 if (TREE_CODE (tem) == VAR_DECL)
694 {
695 if (TREE_STATIC (tem) && use_gnu_debug_info_extensions)
696 {
697 const char *name =
698 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (tem));
699 have_used_extensions = 1;
700 fprintf (asmfile, ":%s;", name);
701 CHARS (strlen (name));
702 }
703 else
704 /* If TEM is non-static, GDB won't understand it. */
705 fprintf (asmfile, ",0,0;");
706 }
707 else
708 {
709 fputc (',', asmfile);
710 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
711 int_bit_position (tem));
712 fputc (',', asmfile);
713 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
714 tree_low_cst (DECL_SIZE (tem), 1));
715 fputc (';', asmfile);
716 CHARS (23);
717 }
718 }
719 }
720 }
721 \f
722 /* Subroutine of `dbxout_type_methods'. Output debug info about the
723 method described DECL. DEBUG_NAME is an encoding of the method's
724 type signature. ??? We may be able to do without DEBUG_NAME altogether
725 now. */
726
727 static void
728 dbxout_type_method_1 (decl, debug_name)
729 tree decl;
730 const char *debug_name;
731 {
732 char c1 = 'A', c2;
733
734 if (TREE_CODE (TREE_TYPE (decl)) == FUNCTION_TYPE)
735 c2 = '?';
736 else /* it's a METHOD_TYPE. */
737 {
738 tree firstarg = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)));
739 /* A for normal functions.
740 B for `const' member functions.
741 C for `volatile' member functions.
742 D for `const volatile' member functions. */
743 if (TYPE_READONLY (TREE_TYPE (firstarg)))
744 c1 += 1;
745 if (TYPE_VOLATILE (TREE_TYPE (firstarg)))
746 c1 += 2;
747
748 if (DECL_VINDEX (decl))
749 c2 = '*';
750 else
751 c2 = '.';
752 }
753
754 fprintf (asmfile, ":%s;%c%c%c", debug_name,
755 TREE_PRIVATE (decl) ? '0'
756 : TREE_PROTECTED (decl) ? '1' : '2', c1, c2);
757 CHARS (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (decl)) + 6
758 - (debug_name - IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
759
760 if (DECL_VINDEX (decl) && host_integerp (DECL_VINDEX (decl), 0))
761 {
762 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
763 tree_low_cst (DECL_VINDEX (decl), 0));
764 fputc (';', asmfile);
765 dbxout_type (DECL_CONTEXT (decl), 0, 0);
766 fprintf (asmfile, ";");
767 CHARS (8);
768 }
769 }
770 \f
771 /* Subroutine of `dbxout_type'. Output debug info about the methods defined
772 in TYPE. */
773
774 static void
775 dbxout_type_methods (type)
776 register tree type;
777 {
778 /* C++: put out the method names and their parameter lists */
779 tree methods = TYPE_METHODS (type);
780 tree type_encoding;
781 register tree fndecl;
782 register tree last;
783 char formatted_type_identifier_length[16];
784 register int type_identifier_length;
785
786 if (methods == NULL_TREE)
787 return;
788
789 type_encoding = DECL_NAME (TYPE_NAME (type));
790
791 #if 0
792 /* C++: Template classes break some assumptions made by this code about
793 the class names, constructor names, and encodings for assembler
794 label names. For now, disable output of dbx info for them. */
795 {
796 const char *ptr = IDENTIFIER_POINTER (type_encoding);
797 /* This should use index. (mrs) */
798 while (*ptr && *ptr != '<') ptr++;
799 if (*ptr != 0)
800 {
801 static int warned;
802 if (!warned)
803 warned = 1;
804 return;
805 }
806 }
807 #endif
808
809 type_identifier_length = IDENTIFIER_LENGTH (type_encoding);
810
811 sprintf(formatted_type_identifier_length, "%d", type_identifier_length);
812
813 if (TREE_CODE (methods) != TREE_VEC)
814 fndecl = methods;
815 else if (TREE_VEC_ELT (methods, 0) != NULL_TREE)
816 fndecl = TREE_VEC_ELT (methods, 0);
817 else
818 fndecl = TREE_VEC_ELT (methods, 1);
819
820 while (fndecl)
821 {
822 tree name = DECL_NAME (fndecl);
823 int need_prefix = 1;
824
825 /* Group together all the methods for the same operation.
826 These differ in the types of the arguments. */
827 for (last = NULL_TREE;
828 fndecl && (last == NULL_TREE || DECL_NAME (fndecl) == DECL_NAME (last));
829 fndecl = TREE_CHAIN (fndecl))
830 /* Output the name of the field (after overloading), as
831 well as the name of the field before overloading, along
832 with its parameter list */
833 {
834 /* This is the "mangled" name of the method.
835 It encodes the argument types. */
836 const char *debug_name;
837 int show_arg_types = 0;
838
839 /* Skip methods that aren't FUNCTION_DECLs. (In C++, these
840 include TEMPLATE_DECLs.) The debugger doesn't know what
841 to do with such entities anyhow. */
842 if (TREE_CODE (fndecl) != FUNCTION_DECL)
843 continue;
844
845 debug_name =
846 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl));
847
848 CONTIN;
849
850 last = fndecl;
851
852 /* Also ignore abstract methods; those are only interesting to
853 the DWARF backends. */
854 if (DECL_IGNORED_P (fndecl) || DECL_ABSTRACT (fndecl))
855 continue;
856
857 if (flag_minimal_debug)
858 {
859 char marker;
860
861 /* We can't optimize a method which uses an anonymous
862 class, because the debugger will not be able to
863 associate the arbitrary class name with the actual
864 class. */
865 #ifndef NO_DOLLAR_IN_LABEL
866 marker = '$';
867 #else
868 marker = '.';
869 #endif
870 if (strchr (debug_name, marker))
871 show_arg_types = 1;
872 /* Detect ordinary methods because their mangled names
873 start with the operation name. */
874 else if (!strncmp (IDENTIFIER_POINTER (name), debug_name,
875 IDENTIFIER_LENGTH (name)))
876 {
877 debug_name += IDENTIFIER_LENGTH (name);
878 if (debug_name[0] == '_' && debug_name[1] == '_')
879 {
880 const char *method_name = debug_name + 2;
881 const char *length_ptr =
882 formatted_type_identifier_length;
883 /* Get past const and volatile qualifiers. */
884 while (*method_name == 'C' || *method_name == 'V')
885 method_name++;
886 /* Skip digits for length of type_encoding. */
887 while (*method_name == *length_ptr && *length_ptr)
888 length_ptr++, method_name++;
889 if (! strncmp (method_name,
890 IDENTIFIER_POINTER (type_encoding),
891 type_identifier_length))
892 method_name += type_identifier_length;
893 debug_name = method_name;
894 }
895 }
896 /* Detect constructors by their style of name mangling. */
897 else if (debug_name[0] == '_' && debug_name[1] == '_')
898 {
899 const char *ctor_name = debug_name + 2;
900 const char *length_ptr = formatted_type_identifier_length;
901 while (*ctor_name == 'C' || *ctor_name == 'V')
902 ctor_name++;
903 /* Skip digits for length of type_encoding. */
904 while (*ctor_name == *length_ptr && *length_ptr)
905 length_ptr++, ctor_name++;
906 if (!strncmp (IDENTIFIER_POINTER (type_encoding), ctor_name,
907 type_identifier_length))
908 debug_name = ctor_name + type_identifier_length;
909 }
910 /* The other alternative is a destructor. */
911 else
912 show_arg_types = 1;
913
914 /* Output the operation name just once, for the first method
915 that we output. */
916 if (need_prefix)
917 {
918 fprintf (asmfile, "%s::", IDENTIFIER_POINTER (name));
919 CHARS (IDENTIFIER_LENGTH (name) + 2);
920 need_prefix = 0;
921 }
922 }
923
924 dbxout_type (TREE_TYPE (fndecl), 0, show_arg_types);
925
926 dbxout_type_method_1 (fndecl, debug_name);
927 }
928 if (!need_prefix)
929 {
930 putc (';', asmfile);
931 CHARS (1);
932 }
933 }
934 }
935
936 /* Emit a "range" type specification, which has the form:
937 "r<index type>;<lower bound>;<upper bound>;".
938 TYPE is an INTEGER_TYPE. */
939
940 static void
941 dbxout_range_type (type)
942 tree type;
943 {
944 fprintf (asmfile, "r");
945 if (TREE_TYPE (type))
946 dbxout_type (TREE_TYPE (type), 0, 0);
947 else if (TREE_CODE (type) != INTEGER_TYPE)
948 dbxout_type (type, 0, 0); /* E.g. Pascal's ARRAY [BOOLEAN] of INTEGER */
949 else
950 {
951 /* Traditionally, we made sure 'int' was type 1, and builtin types
952 were defined to be sub-ranges of int. Unfortunately, this
953 does not allow us to distinguish true sub-ranges from integer
954 types. So, instead we define integer (non-sub-range) types as
955 sub-ranges of themselves. This matters for Chill. If this isn't
956 a subrange type, then we want to define it in terms of itself.
957 However, in C, this may be an anonymous integer type, and we don't
958 want to emit debug info referring to it. Just calling
959 dbxout_type_index won't work anyways, because the type hasn't been
960 defined yet. We make this work for both cases by checked to see
961 whether this is a defined type, referring to it if it is, and using
962 'int' otherwise. */
963 if (TYPE_SYMTAB_ADDRESS (type) != 0)
964 dbxout_type_index (type);
965 else
966 dbxout_type_index (integer_type_node);
967 }
968
969 if (TYPE_MIN_VALUE (type) != 0
970 && host_integerp (TYPE_MIN_VALUE (type), 0))
971 {
972 fputc (';', asmfile);
973 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
974 tree_low_cst (TYPE_MIN_VALUE (type), 0));
975 }
976 else
977 fprintf (asmfile, ";0");
978
979 if (TYPE_MAX_VALUE (type) != 0
980 && host_integerp (TYPE_MAX_VALUE (type), 0))
981 {
982 fputc (';', asmfile);
983 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
984 tree_low_cst (TYPE_MAX_VALUE (type), 0));
985 fputc (';', asmfile);
986 }
987 else
988 fprintf (asmfile, ";-1;");
989 }
990 \f
991 /* Output a reference to a type. If the type has not yet been
992 described in the dbx output, output its definition now.
993 For a type already defined, just refer to its definition
994 using the type number.
995
996 If FULL is nonzero, and the type has been described only with
997 a forward-reference, output the definition now.
998 If FULL is zero in this case, just refer to the forward-reference
999 using the number previously allocated.
1000
1001 If SHOW_ARG_TYPES is nonzero, we output a description of the argument
1002 types for a METHOD_TYPE. */
1003
1004 static void
1005 dbxout_type (type, full, show_arg_types)
1006 tree type;
1007 int full;
1008 int show_arg_types;
1009 {
1010 register tree tem;
1011 static int anonymous_type_number = 0;
1012
1013 if (TREE_CODE (type) == VECTOR_TYPE)
1014 type = TYPE_DEBUG_REPRESENTATION_TYPE (type);
1015
1016 /* If there was an input error and we don't really have a type,
1017 avoid crashing and write something that is at least valid
1018 by assuming `int'. */
1019 if (type == error_mark_node)
1020 type = integer_type_node;
1021 else
1022 {
1023 /* Try to find the "main variant" with the same name but not const
1024 or volatile. (Since stabs does not distinguish const and volatile,
1025 there is no need to make them separate types. But types with
1026 different names are usefully distinguished.) */
1027
1028 for (tem = TYPE_MAIN_VARIANT (type); tem; tem = TYPE_NEXT_VARIANT (tem))
1029 if (!TYPE_READONLY (tem) && !TYPE_VOLATILE (tem)
1030 && TYPE_NAME (tem) == TYPE_NAME (type))
1031 {
1032 type = tem;
1033 break;
1034 }
1035 if (TYPE_NAME (type)
1036 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1037 && TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (type)))
1038 full = 0;
1039 }
1040
1041 if (TYPE_SYMTAB_ADDRESS (type) == 0)
1042 {
1043 /* Type has no dbx number assigned. Assign next available number. */
1044 TYPE_SYMTAB_ADDRESS (type) = next_type_number++;
1045
1046 /* Make sure type vector is long enough to record about this type. */
1047
1048 if (next_type_number == typevec_len)
1049 {
1050 typevec
1051 = (struct typeinfo *) xrealloc (typevec,
1052 typevec_len * 2 * sizeof typevec[0]);
1053 memset ((char *) (typevec + typevec_len), 0,
1054 typevec_len * sizeof typevec[0]);
1055 typevec_len *= 2;
1056 }
1057
1058 #ifdef DBX_USE_BINCL
1059 typevec[TYPE_SYMTAB_ADDRESS (type)].file_number
1060 = current_file->file_number;
1061 typevec[TYPE_SYMTAB_ADDRESS (type)].type_number
1062 = current_file->next_type_number++;
1063 #endif
1064 }
1065
1066 /* Output the number of this type, to refer to it. */
1067 dbxout_type_index (type);
1068
1069 #ifdef DBX_TYPE_DEFINED
1070 if (DBX_TYPE_DEFINED (type))
1071 return;
1072 #endif
1073
1074 /* If this type's definition has been output or is now being output,
1075 that is all. */
1076
1077 switch (typevec[TYPE_SYMTAB_ADDRESS (type)].status)
1078 {
1079 case TYPE_UNSEEN:
1080 break;
1081 case TYPE_XREF:
1082 /* If we have already had a cross reference,
1083 and either that's all we want or that's the best we could do,
1084 don't repeat the cross reference.
1085 Sun dbx crashes if we do. */
1086 if (! full || !COMPLETE_TYPE_P (type)
1087 /* No way in DBX fmt to describe a variable size. */
1088 || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
1089 return;
1090 break;
1091 case TYPE_DEFINED:
1092 return;
1093 }
1094
1095 #ifdef DBX_NO_XREFS
1096 /* For systems where dbx output does not allow the `=xsNAME:' syntax,
1097 leave the type-number completely undefined rather than output
1098 a cross-reference. If we have already used GNU debug info extensions,
1099 then it is OK to output a cross reference. This is necessary to get
1100 proper C++ debug output. */
1101 if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
1102 || TREE_CODE (type) == QUAL_UNION_TYPE
1103 || TREE_CODE (type) == ENUMERAL_TYPE)
1104 && ! use_gnu_debug_info_extensions)
1105 /* We must use the same test here as we use twice below when deciding
1106 whether to emit a cross-reference. */
1107 if ((TYPE_NAME (type) != 0
1108 && ! (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1109 && DECL_IGNORED_P (TYPE_NAME (type)))
1110 && !full)
1111 || !COMPLETE_TYPE_P (type)
1112 /* No way in DBX fmt to describe a variable size. */
1113 || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
1114 {
1115 typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
1116 return;
1117 }
1118 #endif
1119
1120 /* Output a definition now. */
1121
1122 fprintf (asmfile, "=");
1123 CHARS (1);
1124
1125 /* Mark it as defined, so that if it is self-referent
1126 we will not get into an infinite recursion of definitions. */
1127
1128 typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
1129
1130 if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1131 && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
1132 {
1133 dbxout_type (DECL_ORIGINAL_TYPE (TYPE_NAME (type)), 0, 0);
1134 return;
1135 }
1136
1137 switch (TREE_CODE (type))
1138 {
1139 case VOID_TYPE:
1140 case LANG_TYPE:
1141 /* For a void type, just define it as itself; ie, "5=5".
1142 This makes us consider it defined
1143 without saying what it is. The debugger will make it
1144 a void type when the reference is seen, and nothing will
1145 ever override that default. */
1146 dbxout_type_index (type);
1147 break;
1148
1149 case INTEGER_TYPE:
1150 if (type == char_type_node && ! TREE_UNSIGNED (type))
1151 {
1152 /* Output the type `char' as a subrange of itself!
1153 I don't understand this definition, just copied it
1154 from the output of pcc.
1155 This used to use `r2' explicitly and we used to
1156 take care to make sure that `char' was type number 2. */
1157 fprintf (asmfile, "r");
1158 dbxout_type_index (type);
1159 fprintf (asmfile, ";0;127;");
1160 }
1161
1162 /* If this is a subtype of another integer type, always prefer to
1163 write it as a subtype. */
1164 else if (TREE_TYPE (type) != 0
1165 && TREE_CODE (TREE_TYPE (type)) == INTEGER_CST)
1166 dbxout_range_type (type);
1167
1168 else
1169 {
1170 /* If the size is non-standard, say what it is if we can use
1171 GDB extensions. */
1172
1173 if (use_gnu_debug_info_extensions
1174 && TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node))
1175 fprintf (asmfile, "@s%d;", TYPE_PRECISION (type));
1176
1177 /* If we can use GDB extensions and the size is wider than a
1178 long (the size used by GDB to read them) or we may have
1179 trouble writing the bounds the usual way, write them in
1180 octal. Note the test is for the *target's* size of "long",
1181 not that of the host. The host test is just to make sure we
1182 can write it out in case the host wide int is narrower than the
1183 target "long". */
1184
1185 /* For unsigned types, we use octal if they are the same size or
1186 larger. This is because we print the bounds as signed decimal,
1187 and hence they can't span same size unsigned types. */
1188
1189 if (use_gnu_debug_info_extensions
1190 && TYPE_MIN_VALUE (type) != 0
1191 && TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST
1192 && TYPE_MAX_VALUE (type) != 0
1193 && TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST
1194 && (TYPE_PRECISION (type) > TYPE_PRECISION (integer_type_node)
1195 || (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)
1196 && TREE_UNSIGNED (type))
1197 || TYPE_PRECISION (type) > HOST_BITS_PER_WIDE_INT
1198 || (TYPE_PRECISION (type) == HOST_BITS_PER_WIDE_INT
1199 && TREE_UNSIGNED (type))))
1200 {
1201 fprintf (asmfile, "r");
1202 dbxout_type_index (type);
1203 fprintf (asmfile, ";");
1204 print_int_cst_octal (TYPE_MIN_VALUE (type));
1205 fprintf (asmfile, ";");
1206 print_int_cst_octal (TYPE_MAX_VALUE (type));
1207 fprintf (asmfile, ";");
1208 }
1209
1210 else
1211 /* Output other integer types as subranges of `int'. */
1212 dbxout_range_type (type);
1213 }
1214
1215 CHARS (22);
1216 break;
1217
1218 case REAL_TYPE:
1219 /* This used to say `r1' and we used to take care
1220 to make sure that `int' was type number 1. */
1221 fprintf (asmfile, "r");
1222 dbxout_type_index (integer_type_node);
1223 fputc (';', asmfile);
1224 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC, int_size_in_bytes (type));
1225 fputs (";0;", asmfile);
1226 CHARS (13);
1227 break;
1228
1229 case CHAR_TYPE:
1230 if (use_gnu_debug_info_extensions)
1231 {
1232 fputs ("@s", asmfile);
1233 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1234 BITS_PER_UNIT * int_size_in_bytes (type));
1235 fputs (";-20;", asmfile);
1236 }
1237 else
1238 {
1239 /* Output the type `char' as a subrange of itself.
1240 That is what pcc seems to do. */
1241 fprintf (asmfile, "r");
1242 dbxout_type_index (char_type_node);
1243 fprintf (asmfile, ";0;%d;", TREE_UNSIGNED (type) ? 255 : 127);
1244 }
1245 CHARS (9);
1246 break;
1247
1248 case BOOLEAN_TYPE:
1249 if (use_gnu_debug_info_extensions)
1250 {
1251 fputs ("@s", asmfile);
1252 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1253 BITS_PER_UNIT * int_size_in_bytes (type));
1254 fputs (";-16;", asmfile);
1255 }
1256 else /* Define as enumeral type (False, True) */
1257 fprintf (asmfile, "eFalse:0,True:1,;");
1258 CHARS (17);
1259 break;
1260
1261 case FILE_TYPE:
1262 putc ('d', asmfile);
1263 CHARS (1);
1264 dbxout_type (TREE_TYPE (type), 0, 0);
1265 break;
1266
1267 case COMPLEX_TYPE:
1268 /* Differs from the REAL_TYPE by its new data type number */
1269
1270 if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
1271 {
1272 fprintf (asmfile, "r");
1273 dbxout_type_index (type);
1274 fputc (';', asmfile);
1275 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1276 2 * int_size_in_bytes (TREE_TYPE (type)));
1277 fputs (";0;", asmfile);
1278 CHARS (12); /* The number is probably incorrect here. */
1279 }
1280 else
1281 {
1282 /* Output a complex integer type as a structure,
1283 pending some other way to do it. */
1284 fputc ('s', asmfile);
1285 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC, int_size_in_bytes (type));
1286
1287 fprintf (asmfile, "real:");
1288 CHARS (10);
1289 dbxout_type (TREE_TYPE (type), 0, 0);
1290 fprintf (asmfile, ",%d,%d;",
1291 0, TYPE_PRECISION (TREE_TYPE (type)));
1292 CHARS (8);
1293 fprintf (asmfile, "imag:");
1294 CHARS (5);
1295 dbxout_type (TREE_TYPE (type), 0, 0);
1296 fprintf (asmfile, ",%d,%d;;",
1297 TYPE_PRECISION (TREE_TYPE (type)),
1298 TYPE_PRECISION (TREE_TYPE (type)));
1299 CHARS (9);
1300 }
1301 break;
1302
1303 case SET_TYPE:
1304 if (use_gnu_debug_info_extensions)
1305 {
1306 have_used_extensions = 1;
1307 fputs ("@s", asmfile);
1308 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1309 BITS_PER_UNIT * int_size_in_bytes (type));
1310 fputc (';', asmfile);
1311 /* Check if a bitstring type, which in Chill is
1312 different from a [power]set. */
1313 if (TYPE_STRING_FLAG (type))
1314 fprintf (asmfile, "@S;");
1315 }
1316 putc ('S', asmfile);
1317 CHARS (1);
1318 dbxout_type (TYPE_DOMAIN (type), 0, 0);
1319 break;
1320
1321 case ARRAY_TYPE:
1322 /* Make arrays of packed bits look like bitstrings for chill. */
1323 if (TYPE_PACKED (type) && use_gnu_debug_info_extensions)
1324 {
1325 have_used_extensions = 1;
1326 fputs ("@s", asmfile);
1327 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1328 BITS_PER_UNIT * int_size_in_bytes (type));
1329 fputc (';', asmfile);
1330 fprintf (asmfile, "@S;");
1331 putc ('S', asmfile);
1332 CHARS (1);
1333 dbxout_type (TYPE_DOMAIN (type), 0, 0);
1334 break;
1335 }
1336 /* Output "a" followed by a range type definition
1337 for the index type of the array
1338 followed by a reference to the target-type.
1339 ar1;0;N;M for a C array of type M and size N+1. */
1340 /* Check if a character string type, which in Chill is
1341 different from an array of characters. */
1342 if (TYPE_STRING_FLAG (type) && use_gnu_debug_info_extensions)
1343 {
1344 have_used_extensions = 1;
1345 fprintf (asmfile, "@S;");
1346 }
1347 tem = TYPE_DOMAIN (type);
1348 if (tem == NULL)
1349 {
1350 fprintf (asmfile, "ar");
1351 dbxout_type_index (integer_type_node);
1352 fprintf (asmfile, ";0;-1;");
1353 }
1354 else
1355 {
1356 fprintf (asmfile, "a");
1357 dbxout_range_type (tem);
1358 }
1359 CHARS (14);
1360 dbxout_type (TREE_TYPE (type), 0, 0);
1361 break;
1362
1363 case RECORD_TYPE:
1364 case UNION_TYPE:
1365 case QUAL_UNION_TYPE:
1366 {
1367 int i, n_baseclasses = 0;
1368
1369 if (TYPE_BINFO (type) != 0
1370 && TREE_CODE (TYPE_BINFO (type)) == TREE_VEC
1371 && TYPE_BINFO_BASETYPES (type) != 0)
1372 n_baseclasses = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (type));
1373
1374 /* Output a structure type. We must use the same test here as we
1375 use in the DBX_NO_XREFS case above. */
1376 if ((TYPE_NAME (type) != 0
1377 && ! (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1378 && DECL_IGNORED_P (TYPE_NAME (type)))
1379 && !full)
1380 || !COMPLETE_TYPE_P (type)
1381 /* No way in DBX fmt to describe a variable size. */
1382 || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
1383 {
1384 /* If the type is just a cross reference, output one
1385 and mark the type as partially described.
1386 If it later becomes defined, we will output
1387 its real definition.
1388 If the type has a name, don't nest its definition within
1389 another type's definition; instead, output an xref
1390 and let the definition come when the name is defined. */
1391 fputs ((TREE_CODE (type) == RECORD_TYPE) ? "xs" : "xu", asmfile);
1392 CHARS (3);
1393 #if 0 /* This assertion is legitimately false in C++. */
1394 /* We shouldn't be outputting a reference to a type before its
1395 definition unless the type has a tag name.
1396 A typedef name without a tag name should be impossible. */
1397 if (TREE_CODE (TYPE_NAME (type)) != IDENTIFIER_NODE)
1398 abort ();
1399 #endif
1400 if (TYPE_NAME (type) != 0)
1401 dbxout_type_name (type);
1402 else
1403 fprintf (asmfile, "$$%d", anonymous_type_number++);
1404 fprintf (asmfile, ":");
1405 typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
1406 break;
1407 }
1408
1409 /* Identify record or union, and print its size. */
1410 fputc (((TREE_CODE (type) == RECORD_TYPE) ? 's' : 'u'), asmfile);
1411 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1412 int_size_in_bytes (type));
1413
1414 if (use_gnu_debug_info_extensions)
1415 {
1416 if (n_baseclasses)
1417 {
1418 have_used_extensions = 1;
1419 fprintf (asmfile, "!%d,", n_baseclasses);
1420 CHARS (8);
1421 }
1422 }
1423 for (i = 0; i < n_baseclasses; i++)
1424 {
1425 tree child = TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (type)), i);
1426
1427 if (use_gnu_debug_info_extensions)
1428 {
1429 have_used_extensions = 1;
1430 putc (TREE_VIA_VIRTUAL (child) ? '1' : '0', asmfile);
1431 putc (TREE_VIA_PUBLIC (child) ? '2' : '0', asmfile);
1432 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1433 (tree_low_cst (BINFO_OFFSET (child), 0)
1434 * BITS_PER_UNIT));
1435 fputc (',', asmfile);
1436 CHARS (15);
1437 dbxout_type (BINFO_TYPE (child), 0, 0);
1438 putc (';', asmfile);
1439 }
1440 else
1441 {
1442 /* Print out the base class information with fields
1443 which have the same names at the types they hold. */
1444 dbxout_type_name (BINFO_TYPE (child));
1445 putc (':', asmfile);
1446 dbxout_type (BINFO_TYPE (child), full, 0);
1447 fputc (',', asmfile);
1448 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1449 tree_low_cst (BINFO_OFFSET (child), 0)
1450 * BITS_PER_UNIT);
1451 fputc (',', asmfile);
1452 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1453 (tree_low_cst (DECL_SIZE (TYPE_NAME
1454 (BINFO_TYPE (child))), 0)
1455 * BITS_PER_UNIT));
1456 fputc (';', asmfile);
1457 CHARS (20);
1458 }
1459 }
1460 }
1461
1462 CHARS (11);
1463
1464 /* Write out the field declarations. */
1465 dbxout_type_fields (type);
1466 if (use_gnu_debug_info_extensions && TYPE_METHODS (type) != NULL_TREE)
1467 {
1468 have_used_extensions = 1;
1469 dbxout_type_methods (type);
1470 }
1471
1472 putc (';', asmfile);
1473
1474 if (use_gnu_debug_info_extensions && TREE_CODE (type) == RECORD_TYPE
1475 /* Avoid the ~ if we don't really need it--it confuses dbx. */
1476 && TYPE_VFIELD (type))
1477 {
1478 have_used_extensions = 1;
1479
1480 /* Tell GDB+ that it may keep reading. */
1481 putc ('~', asmfile);
1482
1483 /* We need to write out info about what field this class
1484 uses as its "main" vtable pointer field, because if this
1485 field is inherited from a base class, GDB cannot necessarily
1486 figure out which field it's using in time. */
1487 if (TYPE_VFIELD (type))
1488 {
1489 putc ('%', asmfile);
1490 dbxout_type (DECL_FCONTEXT (TYPE_VFIELD (type)), 0, 0);
1491 }
1492 putc (';', asmfile);
1493 CHARS (3);
1494 }
1495 break;
1496
1497 case ENUMERAL_TYPE:
1498 /* We must use the same test here as we use in the DBX_NO_XREFS case
1499 above. We simplify it a bit since an enum will never have a variable
1500 size. */
1501 if ((TYPE_NAME (type) != 0
1502 && ! (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1503 && DECL_IGNORED_P (TYPE_NAME (type)))
1504 && !full)
1505 || !COMPLETE_TYPE_P (type))
1506 {
1507 fprintf (asmfile, "xe");
1508 CHARS (3);
1509 dbxout_type_name (type);
1510 typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
1511 fprintf (asmfile, ":");
1512 return;
1513 }
1514 #ifdef DBX_OUTPUT_ENUM
1515 DBX_OUTPUT_ENUM (asmfile, type);
1516 #else
1517 if (use_gnu_debug_info_extensions
1518 && TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node))
1519 fprintf (asmfile, "@s%d;", TYPE_PRECISION (type));
1520 putc ('e', asmfile);
1521 CHARS (1);
1522 for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem))
1523 {
1524 fprintf (asmfile, "%s:", IDENTIFIER_POINTER (TREE_PURPOSE (tem)));
1525 if (TREE_INT_CST_HIGH (TREE_VALUE (tem)) == 0)
1526 fprintf (asmfile, HOST_WIDE_INT_PRINT_UNSIGNED,
1527 TREE_INT_CST_LOW (TREE_VALUE (tem)));
1528 else if (TREE_INT_CST_HIGH (TREE_VALUE (tem)) == -1
1529 && (HOST_WIDE_INT) TREE_INT_CST_LOW (TREE_VALUE (tem)) < 0)
1530 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1531 TREE_INT_CST_LOW (TREE_VALUE (tem)));
1532 else
1533 print_int_cst_octal (TREE_VALUE (tem));
1534 fprintf (asmfile, ",");
1535 CHARS (20 + IDENTIFIER_LENGTH (TREE_PURPOSE (tem)));
1536 if (TREE_CHAIN (tem) != 0)
1537 {
1538 CONTIN;
1539 }
1540 }
1541 putc (';', asmfile);
1542 CHARS (1);
1543 #endif
1544 break;
1545
1546 case POINTER_TYPE:
1547 putc ('*', asmfile);
1548 CHARS (1);
1549 dbxout_type (TREE_TYPE (type), 0, 0);
1550 break;
1551
1552 case METHOD_TYPE:
1553 if (use_gnu_debug_info_extensions)
1554 {
1555 have_used_extensions = 1;
1556 putc ('#', asmfile);
1557 CHARS (1);
1558 if (flag_minimal_debug && !show_arg_types)
1559 {
1560 /* Normally, just output the return type.
1561 The argument types are encoded in the method name. */
1562 putc ('#', asmfile);
1563 CHARS (1);
1564 dbxout_type (TREE_TYPE (type), 0, 0);
1565 putc (';', asmfile);
1566 CHARS (1);
1567 }
1568 else
1569 {
1570 /* When outputting destructors, we need to write
1571 the argument types out longhand. */
1572 dbxout_type (TYPE_METHOD_BASETYPE (type), 0, 0);
1573 putc (',', asmfile);
1574 CHARS (1);
1575 dbxout_type (TREE_TYPE (type), 0, 0);
1576 dbxout_args (TYPE_ARG_TYPES (type));
1577 putc (';', asmfile);
1578 CHARS (1);
1579 }
1580 }
1581 else
1582 {
1583 /* Treat it as a function type. */
1584 dbxout_type (TREE_TYPE (type), 0, 0);
1585 }
1586 break;
1587
1588 case OFFSET_TYPE:
1589 if (use_gnu_debug_info_extensions)
1590 {
1591 have_used_extensions = 1;
1592 putc ('@', asmfile);
1593 CHARS (1);
1594 dbxout_type (TYPE_OFFSET_BASETYPE (type), 0, 0);
1595 putc (',', asmfile);
1596 CHARS (1);
1597 dbxout_type (TREE_TYPE (type), 0, 0);
1598 }
1599 else
1600 {
1601 /* Should print as an int, because it is really
1602 just an offset. */
1603 dbxout_type (integer_type_node, 0, 0);
1604 }
1605 break;
1606
1607 case REFERENCE_TYPE:
1608 if (use_gnu_debug_info_extensions)
1609 have_used_extensions = 1;
1610 putc (use_gnu_debug_info_extensions ? '&' : '*', asmfile);
1611 CHARS (1);
1612 dbxout_type (TREE_TYPE (type), 0, 0);
1613 break;
1614
1615 case FUNCTION_TYPE:
1616 putc ('f', asmfile);
1617 CHARS (1);
1618 dbxout_type (TREE_TYPE (type), 0, 0);
1619 break;
1620
1621 default:
1622 abort ();
1623 }
1624 }
1625
1626 /* Print the value of integer constant C, in octal,
1627 handling double precision. */
1628
1629 static void
1630 print_int_cst_octal (c)
1631 tree c;
1632 {
1633 unsigned HOST_WIDE_INT high = TREE_INT_CST_HIGH (c);
1634 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (c);
1635 int excess = (3 - (HOST_BITS_PER_WIDE_INT % 3));
1636 unsigned int width = TYPE_PRECISION (TREE_TYPE (c));
1637
1638 /* GDB wants constants with no extra leading "1" bits, so
1639 we need to remove any sign-extension that might be
1640 present. */
1641 if (width == HOST_BITS_PER_WIDE_INT * 2)
1642 ;
1643 else if (width > HOST_BITS_PER_WIDE_INT)
1644 high &= (((HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT)) - 1);
1645 else if (width == HOST_BITS_PER_WIDE_INT)
1646 high = 0;
1647 else
1648 high = 0, low &= (((HOST_WIDE_INT) 1 << width) - 1);
1649
1650 fprintf (asmfile, "0");
1651
1652 if (excess == 3)
1653 {
1654 print_octal (high, HOST_BITS_PER_WIDE_INT / 3);
1655 print_octal (low, HOST_BITS_PER_WIDE_INT / 3);
1656 }
1657 else
1658 {
1659 unsigned HOST_WIDE_INT beg = high >> excess;
1660 unsigned HOST_WIDE_INT middle
1661 = ((high & (((HOST_WIDE_INT) 1 << excess) - 1)) << (3 - excess)
1662 | (low >> (HOST_BITS_PER_WIDE_INT / 3 * 3)));
1663 unsigned HOST_WIDE_INT end
1664 = low & (((unsigned HOST_WIDE_INT) 1
1665 << (HOST_BITS_PER_WIDE_INT / 3 * 3))
1666 - 1);
1667
1668 fprintf (asmfile, "%o%01o", (int) beg, (int) middle);
1669 print_octal (end, HOST_BITS_PER_WIDE_INT / 3);
1670 }
1671 }
1672
1673 static void
1674 print_octal (value, digits)
1675 unsigned HOST_WIDE_INT value;
1676 int digits;
1677 {
1678 int i;
1679
1680 for (i = digits - 1; i >= 0; i--)
1681 fprintf (asmfile, "%01o", (int) ((value >> (3 * i)) & 7));
1682 }
1683
1684 /* Output the name of type TYPE, with no punctuation.
1685 Such names can be set up either by typedef declarations
1686 or by struct, enum and union tags. */
1687
1688 static void
1689 dbxout_type_name (type)
1690 register tree type;
1691 {
1692 tree t;
1693 if (TYPE_NAME (type) == 0)
1694 abort ();
1695 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
1696 {
1697 t = TYPE_NAME (type);
1698 }
1699 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
1700 {
1701 t = DECL_NAME (TYPE_NAME (type));
1702 }
1703 else
1704 abort ();
1705
1706 fprintf (asmfile, "%s", IDENTIFIER_POINTER (t));
1707 CHARS (IDENTIFIER_LENGTH (t));
1708 }
1709 \f
1710 /* Output a .stabs for the symbol defined by DECL,
1711 which must be a ..._DECL node in the normal namespace.
1712 It may be a CONST_DECL, a FUNCTION_DECL, a PARM_DECL or a VAR_DECL.
1713 LOCAL is nonzero if the scope is less than the entire file.
1714 Return 1 if a stabs might have been emitted. */
1715
1716 int
1717 dbxout_symbol (decl, local)
1718 tree decl;
1719 int local ATTRIBUTE_UNUSED;
1720 {
1721 tree type = TREE_TYPE (decl);
1722 tree context = NULL_TREE;
1723 int result = 0;
1724
1725 /* Cast avoids warning in old compilers. */
1726 current_sym_code = (STAB_CODE_TYPE) 0;
1727 current_sym_value = 0;
1728 current_sym_addr = 0;
1729
1730 /* Ignore nameless syms, but don't ignore type tags. */
1731
1732 if ((DECL_NAME (decl) == 0 && TREE_CODE (decl) != TYPE_DECL)
1733 || DECL_IGNORED_P (decl))
1734 return 0;
1735
1736 dbxout_prepare_symbol (decl);
1737
1738 /* The output will always start with the symbol name,
1739 so always count that in the length-output-so-far. */
1740
1741 if (DECL_NAME (decl) != 0)
1742 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (decl));
1743
1744 switch (TREE_CODE (decl))
1745 {
1746 case CONST_DECL:
1747 /* Enum values are defined by defining the enum type. */
1748 break;
1749
1750 case FUNCTION_DECL:
1751 if (DECL_RTL (decl) == 0)
1752 return 0;
1753 if (DECL_EXTERNAL (decl))
1754 break;
1755 /* Don't mention a nested function under its parent. */
1756 context = decl_function_context (decl);
1757 if (context == current_function_decl)
1758 break;
1759 if (GET_CODE (DECL_RTL (decl)) != MEM
1760 || GET_CODE (XEXP (DECL_RTL (decl), 0)) != SYMBOL_REF)
1761 break;
1762 FORCE_TEXT;
1763
1764 fprintf (asmfile, "%s\"%s:%c", ASM_STABS_OP,
1765 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
1766 TREE_PUBLIC (decl) ? 'F' : 'f');
1767 result = 1;
1768
1769 current_sym_code = N_FUN;
1770 current_sym_addr = XEXP (DECL_RTL (decl), 0);
1771
1772 if (TREE_TYPE (type))
1773 dbxout_type (TREE_TYPE (type), 0, 0);
1774 else
1775 dbxout_type (void_type_node, 0, 0);
1776
1777 /* For a nested function, when that function is compiled,
1778 mention the containing function name
1779 as well as (since dbx wants it) our own assembler-name. */
1780 if (context != 0)
1781 fprintf (asmfile, ",%s,%s",
1782 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
1783 IDENTIFIER_POINTER (DECL_NAME (context)));
1784
1785 dbxout_finish_symbol (decl);
1786 break;
1787
1788 case TYPE_DECL:
1789 #if 0
1790 /* This seems all wrong. Outputting most kinds of types gives no name
1791 at all. A true definition gives no name; a cross-ref for a
1792 structure can give the tag name, but not a type name.
1793 It seems that no typedef name is defined by outputting a type. */
1794
1795 /* If this typedef name was defined by outputting the type,
1796 don't duplicate it. */
1797 if (typevec[TYPE_SYMTAB_ADDRESS (type)].status == TYPE_DEFINED
1798 && TYPE_NAME (TREE_TYPE (decl)) == decl)
1799 return 0;
1800 #endif
1801 /* Don't output the same typedef twice.
1802 And don't output what language-specific stuff doesn't want output. */
1803 if (TREE_ASM_WRITTEN (decl) || TYPE_DECL_SUPPRESS_DEBUG (decl))
1804 return 0;
1805
1806 FORCE_TEXT;
1807 result = 1;
1808 {
1809 int tag_needed = 1;
1810 int did_output = 0;
1811
1812 if (DECL_NAME (decl))
1813 {
1814 /* Nonzero means we must output a tag as well as a typedef. */
1815 tag_needed = 0;
1816
1817 /* Handle the case of a C++ structure or union
1818 where the TYPE_NAME is a TYPE_DECL
1819 which gives both a typedef name and a tag. */
1820 /* dbx requires the tag first and the typedef second. */
1821 if ((TREE_CODE (type) == RECORD_TYPE
1822 || TREE_CODE (type) == UNION_TYPE
1823 || TREE_CODE (type) == QUAL_UNION_TYPE)
1824 && TYPE_NAME (type) == decl
1825 && !(use_gnu_debug_info_extensions && have_used_extensions)
1826 && !TREE_ASM_WRITTEN (TYPE_NAME (type))
1827 /* Distinguish the implicit typedefs of C++
1828 from explicit ones that might be found in C. */
1829 && DECL_ARTIFICIAL (decl))
1830 {
1831 tree name = TYPE_NAME (type);
1832 if (TREE_CODE (name) == TYPE_DECL)
1833 name = DECL_NAME (name);
1834
1835 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1836 current_sym_value = 0;
1837 current_sym_addr = 0;
1838 current_sym_nchars = 2 + IDENTIFIER_LENGTH (name);
1839
1840 fprintf (asmfile, "%s\"%s:T", ASM_STABS_OP,
1841 IDENTIFIER_POINTER (name));
1842 dbxout_type (type, 1, 0);
1843 dbxout_finish_symbol (NULL_TREE);
1844 }
1845
1846 /* Output typedef name. */
1847 fprintf (asmfile, "%s\"%s:", ASM_STABS_OP,
1848 IDENTIFIER_POINTER (DECL_NAME (decl)));
1849
1850 /* Short cut way to output a tag also. */
1851 if ((TREE_CODE (type) == RECORD_TYPE
1852 || TREE_CODE (type) == UNION_TYPE
1853 || TREE_CODE (type) == QUAL_UNION_TYPE)
1854 && TYPE_NAME (type) == decl
1855 /* Distinguish the implicit typedefs of C++
1856 from explicit ones that might be found in C. */
1857 && DECL_ARTIFICIAL (decl))
1858 {
1859 if (use_gnu_debug_info_extensions && have_used_extensions)
1860 {
1861 putc ('T', asmfile);
1862 TREE_ASM_WRITTEN (TYPE_NAME (type)) = 1;
1863 }
1864 #if 0 /* Now we generate the tag for this case up above. */
1865 else
1866 tag_needed = 1;
1867 #endif
1868 }
1869
1870 putc ('t', asmfile);
1871 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1872
1873 dbxout_type (type, 1, 0);
1874 dbxout_finish_symbol (decl);
1875 did_output = 1;
1876 }
1877
1878 /* Don't output a tag if this is an incomplete type (TYPE_SIZE is
1879 zero). This prevents the sun4 Sun OS 4.x dbx from crashing. */
1880
1881 if (tag_needed && TYPE_NAME (type) != 0
1882 && (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE
1883 || (DECL_NAME (TYPE_NAME (type)) != 0))
1884 && COMPLETE_TYPE_P (type)
1885 && !TREE_ASM_WRITTEN (TYPE_NAME (type)))
1886 {
1887 /* For a TYPE_DECL with no name, but the type has a name,
1888 output a tag.
1889 This is what represents `struct foo' with no typedef. */
1890 /* In C++, the name of a type is the corresponding typedef.
1891 In C, it is an IDENTIFIER_NODE. */
1892 tree name = TYPE_NAME (type);
1893 if (TREE_CODE (name) == TYPE_DECL)
1894 name = DECL_NAME (name);
1895
1896 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1897 current_sym_value = 0;
1898 current_sym_addr = 0;
1899 current_sym_nchars = 2 + IDENTIFIER_LENGTH (name);
1900
1901 fprintf (asmfile, "%s\"%s:T", ASM_STABS_OP,
1902 IDENTIFIER_POINTER (name));
1903 dbxout_type (type, 1, 0);
1904 dbxout_finish_symbol (NULL_TREE);
1905 did_output = 1;
1906 }
1907
1908 /* If an enum type has no name, it cannot be referred to,
1909 but we must output it anyway, since the enumeration constants
1910 can be referred to. */
1911 if (!did_output && TREE_CODE (type) == ENUMERAL_TYPE)
1912 {
1913 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1914 current_sym_value = 0;
1915 current_sym_addr = 0;
1916 current_sym_nchars = 2;
1917
1918 /* Some debuggers fail when given NULL names, so give this a
1919 harmless name of ` '. */
1920 fprintf (asmfile, "%s\" :T", ASM_STABS_OP);
1921 dbxout_type (type, 1, 0);
1922 dbxout_finish_symbol (NULL_TREE);
1923 }
1924
1925 /* Prevent duplicate output of a typedef. */
1926 TREE_ASM_WRITTEN (decl) = 1;
1927 break;
1928 }
1929
1930 case PARM_DECL:
1931 /* Parm decls go in their own separate chains
1932 and are output by dbxout_reg_parms and dbxout_parms. */
1933 abort ();
1934
1935 case RESULT_DECL:
1936 /* Named return value, treat like a VAR_DECL. */
1937 case VAR_DECL:
1938 if (DECL_RTL (decl) == 0)
1939 return 0;
1940 /* Don't mention a variable that is external.
1941 Let the file that defines it describe it. */
1942 if (DECL_EXTERNAL (decl))
1943 break;
1944
1945 /* If the variable is really a constant
1946 and not written in memory, inform the debugger. */
1947 if (TREE_STATIC (decl) && TREE_READONLY (decl)
1948 && DECL_INITIAL (decl) != 0
1949 && host_integerp (DECL_INITIAL (decl), 0)
1950 && ! TREE_ASM_WRITTEN (decl)
1951 && (DECL_CONTEXT (decl) == NULL_TREE
1952 || TREE_CODE (DECL_CONTEXT (decl)) == BLOCK))
1953 {
1954 if (TREE_PUBLIC (decl) == 0)
1955 {
1956 /* The sun4 assembler does not grok this. */
1957 const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
1958
1959 if (TREE_CODE (TREE_TYPE (decl)) == INTEGER_TYPE
1960 || TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE)
1961 {
1962 HOST_WIDE_INT ival = tree_low_cst (DECL_INITIAL (decl), 0);
1963 #ifdef DBX_OUTPUT_CONSTANT_SYMBOL
1964 DBX_OUTPUT_CONSTANT_SYMBOL (asmfile, name, ival);
1965 #else
1966 fprintf (asmfile, "%s\"%s:c=i", ASM_STABS_OP, name);
1967
1968 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC, ival);
1969 fprintf (asmfile, "\",0x%x,0,0,0\n", N_LSYM);
1970 #endif
1971 return 1;
1972 }
1973 else if (TREE_CODE (TREE_TYPE (decl)) == REAL_TYPE)
1974 {
1975 /* don't know how to do this yet. */
1976 }
1977 break;
1978 }
1979 /* else it is something we handle like a normal variable. */
1980 }
1981
1982 SET_DECL_RTL (decl, eliminate_regs (DECL_RTL (decl), 0, NULL_RTX));
1983 #ifdef LEAF_REG_REMAP
1984 if (current_function_uses_only_leaf_regs)
1985 leaf_renumber_regs_insn (DECL_RTL (decl));
1986 #endif
1987
1988 result = dbxout_symbol_location (decl, type, 0, DECL_RTL (decl));
1989 break;
1990
1991 default:
1992 break;
1993 }
1994 return result;
1995 }
1996 \f
1997 /* Output the stab for DECL, a VAR_DECL, RESULT_DECL or PARM_DECL.
1998 Add SUFFIX to its name, if SUFFIX is not 0.
1999 Describe the variable as residing in HOME
2000 (usually HOME is DECL_RTL (DECL), but not always).
2001 Returns 1 if the stab was really emitted. */
2002
2003 static int
2004 dbxout_symbol_location (decl, type, suffix, home)
2005 tree decl, type;
2006 const char *suffix;
2007 rtx home;
2008 {
2009 int letter = 0;
2010 int regno = -1;
2011
2012 /* Don't mention a variable at all
2013 if it was completely optimized into nothingness.
2014
2015 If the decl was from an inline function, then its rtl
2016 is not identically the rtl that was used in this
2017 particular compilation. */
2018 if (GET_CODE (home) == REG)
2019 {
2020 regno = REGNO (home);
2021 if (regno >= FIRST_PSEUDO_REGISTER)
2022 return 0;
2023 }
2024 else if (GET_CODE (home) == SUBREG)
2025 {
2026 rtx value = home;
2027 int offset = 0;
2028 while (GET_CODE (value) == SUBREG)
2029 {
2030 offset += SUBREG_WORD (value);
2031 value = SUBREG_REG (value);
2032 }
2033 if (GET_CODE (value) == REG)
2034 {
2035 regno = REGNO (value);
2036 if (regno >= FIRST_PSEUDO_REGISTER)
2037 return 0;
2038 regno += offset;
2039 }
2040 alter_subreg (home);
2041 }
2042
2043 /* The kind-of-variable letter depends on where
2044 the variable is and on the scope of its name:
2045 G and N_GSYM for static storage and global scope,
2046 S for static storage and file scope,
2047 V for static storage and local scope,
2048 for those two, use N_LCSYM if data is in bss segment,
2049 N_STSYM if in data segment, N_FUN otherwise.
2050 (We used N_FUN originally, then changed to N_STSYM
2051 to please GDB. However, it seems that confused ld.
2052 Now GDB has been fixed to like N_FUN, says Kingdon.)
2053 no letter at all, and N_LSYM, for auto variable,
2054 r and N_RSYM for register variable. */
2055
2056 if (GET_CODE (home) == MEM
2057 && GET_CODE (XEXP (home, 0)) == SYMBOL_REF)
2058 {
2059 if (TREE_PUBLIC (decl))
2060 {
2061 letter = 'G';
2062 current_sym_code = N_GSYM;
2063 }
2064 else
2065 {
2066 current_sym_addr = XEXP (home, 0);
2067
2068 letter = decl_function_context (decl) ? 'V' : 'S';
2069
2070 /* This should be the same condition as in assemble_variable, but
2071 we don't have access to dont_output_data here. So, instead,
2072 we rely on the fact that error_mark_node initializers always
2073 end up in bss for C++ and never end up in bss for C. */
2074 if (DECL_INITIAL (decl) == 0
2075 || (!strcmp (lang_identify (), "cplusplus")
2076 && DECL_INITIAL (decl) == error_mark_node))
2077 current_sym_code = N_LCSYM;
2078 else if (DECL_IN_TEXT_SECTION (decl))
2079 /* This is not quite right, but it's the closest
2080 of all the codes that Unix defines. */
2081 current_sym_code = DBX_STATIC_CONST_VAR_CODE;
2082 else
2083 {
2084 /* Ultrix `as' seems to need this. */
2085 #ifdef DBX_STATIC_STAB_DATA_SECTION
2086 data_section ();
2087 #endif
2088 current_sym_code = N_STSYM;
2089 }
2090 }
2091 }
2092 else if (regno >= 0)
2093 {
2094 letter = 'r';
2095 current_sym_code = N_RSYM;
2096 current_sym_value = DBX_REGISTER_NUMBER (regno);
2097 }
2098 else if (GET_CODE (home) == MEM
2099 && (GET_CODE (XEXP (home, 0)) == MEM
2100 || (GET_CODE (XEXP (home, 0)) == REG
2101 && REGNO (XEXP (home, 0)) != HARD_FRAME_POINTER_REGNUM
2102 && REGNO (XEXP (home, 0)) != STACK_POINTER_REGNUM
2103 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
2104 && REGNO (XEXP (home, 0)) != ARG_POINTER_REGNUM
2105 #endif
2106 )))
2107 /* If the value is indirect by memory or by a register
2108 that isn't the frame pointer
2109 then it means the object is variable-sized and address through
2110 that register or stack slot. DBX has no way to represent this
2111 so all we can do is output the variable as a pointer.
2112 If it's not a parameter, ignore it.
2113 (VAR_DECLs like this can be made by integrate.c.) */
2114 {
2115 if (GET_CODE (XEXP (home, 0)) == REG)
2116 {
2117 letter = 'r';
2118 current_sym_code = N_RSYM;
2119 current_sym_value = DBX_REGISTER_NUMBER (REGNO (XEXP (home, 0)));
2120 }
2121 else
2122 {
2123 current_sym_code = N_LSYM;
2124 /* RTL looks like (MEM (MEM (PLUS (REG...) (CONST_INT...)))).
2125 We want the value of that CONST_INT. */
2126 current_sym_value
2127 = DEBUGGER_AUTO_OFFSET (XEXP (XEXP (home, 0), 0));
2128 }
2129
2130 /* Effectively do build_pointer_type, but don't cache this type,
2131 since it might be temporary whereas the type it points to
2132 might have been saved for inlining. */
2133 /* Don't use REFERENCE_TYPE because dbx can't handle that. */
2134 type = make_node (POINTER_TYPE);
2135 TREE_TYPE (type) = TREE_TYPE (decl);
2136 }
2137 else if (GET_CODE (home) == MEM
2138 && GET_CODE (XEXP (home, 0)) == REG)
2139 {
2140 current_sym_code = N_LSYM;
2141 current_sym_value = DEBUGGER_AUTO_OFFSET (XEXP (home, 0));
2142 }
2143 else if (GET_CODE (home) == MEM
2144 && GET_CODE (XEXP (home, 0)) == PLUS
2145 && GET_CODE (XEXP (XEXP (home, 0), 1)) == CONST_INT)
2146 {
2147 current_sym_code = N_LSYM;
2148 /* RTL looks like (MEM (PLUS (REG...) (CONST_INT...)))
2149 We want the value of that CONST_INT. */
2150 current_sym_value = DEBUGGER_AUTO_OFFSET (XEXP (home, 0));
2151 }
2152 else if (GET_CODE (home) == MEM
2153 && GET_CODE (XEXP (home, 0)) == CONST)
2154 {
2155 /* Handle an obscure case which can arise when optimizing and
2156 when there are few available registers. (This is *always*
2157 the case for i386/i486 targets). The RTL looks like
2158 (MEM (CONST ...)) even though this variable is a local `auto'
2159 or a local `register' variable. In effect, what has happened
2160 is that the reload pass has seen that all assignments and
2161 references for one such a local variable can be replaced by
2162 equivalent assignments and references to some static storage
2163 variable, thereby avoiding the need for a register. In such
2164 cases we're forced to lie to debuggers and tell them that
2165 this variable was itself `static'. */
2166 current_sym_code = N_LCSYM;
2167 letter = 'V';
2168 current_sym_addr = XEXP (XEXP (home, 0), 0);
2169 }
2170 else if (GET_CODE (home) == CONCAT)
2171 {
2172 tree subtype = TREE_TYPE (type);
2173
2174 /* If the variable's storage is in two parts,
2175 output each as a separate stab with a modified name. */
2176 if (WORDS_BIG_ENDIAN)
2177 dbxout_symbol_location (decl, subtype, "$imag", XEXP (home, 0));
2178 else
2179 dbxout_symbol_location (decl, subtype, "$real", XEXP (home, 0));
2180
2181 /* Cast avoids warning in old compilers. */
2182 current_sym_code = (STAB_CODE_TYPE) 0;
2183 current_sym_value = 0;
2184 current_sym_addr = 0;
2185 dbxout_prepare_symbol (decl);
2186
2187 if (WORDS_BIG_ENDIAN)
2188 dbxout_symbol_location (decl, subtype, "$real", XEXP (home, 1));
2189 else
2190 dbxout_symbol_location (decl, subtype, "$imag", XEXP (home, 1));
2191 return 1;
2192 }
2193 else
2194 /* Address might be a MEM, when DECL is a variable-sized object.
2195 Or it might be const0_rtx, meaning previous passes
2196 want us to ignore this variable. */
2197 return 0;
2198
2199 /* Ok, start a symtab entry and output the variable name. */
2200 FORCE_TEXT;
2201
2202 #ifdef DBX_STATIC_BLOCK_START
2203 DBX_STATIC_BLOCK_START (asmfile, current_sym_code);
2204 #endif
2205
2206 dbxout_symbol_name (decl, suffix, letter);
2207 dbxout_type (type, 0, 0);
2208 dbxout_finish_symbol (decl);
2209
2210 #ifdef DBX_STATIC_BLOCK_END
2211 DBX_STATIC_BLOCK_END (asmfile, current_sym_code);
2212 #endif
2213 return 1;
2214 }
2215 \f
2216 /* Output the symbol name of DECL for a stabs, with suffix SUFFIX.
2217 Then output LETTER to indicate the kind of location the symbol has. */
2218
2219 static void
2220 dbxout_symbol_name (decl, suffix, letter)
2221 tree decl;
2222 const char *suffix;
2223 int letter;
2224 {
2225 const char *name;
2226
2227 if (DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl)))
2228 /* One slight hitch: if this is a VAR_DECL which is a static
2229 class member, we must put out the mangled name instead of the
2230 DECL_NAME. Note also that static member (variable) names DO NOT begin
2231 with underscores in .stabs directives. */
2232 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
2233 else
2234 /* ...but if we're function-local, we don't want to include the junk
2235 added by ASM_FORMAT_PRIVATE_NAME. */
2236 name = IDENTIFIER_POINTER (DECL_NAME (decl));
2237
2238 if (name == 0)
2239 name = "(anon)";
2240 fprintf (asmfile, "%s\"%s%s:", ASM_STABS_OP, name,
2241 (suffix ? suffix : ""));
2242
2243 if (letter) putc (letter, asmfile);
2244 }
2245
2246 static void
2247 dbxout_prepare_symbol (decl)
2248 tree decl ATTRIBUTE_UNUSED;
2249 {
2250 #ifdef WINNING_GDB
2251 const char *filename = DECL_SOURCE_FILE (decl);
2252
2253 dbxout_source_file (asmfile, filename);
2254 #endif
2255 }
2256
2257 static void
2258 dbxout_finish_symbol (sym)
2259 tree sym;
2260 {
2261 #ifdef DBX_FINISH_SYMBOL
2262 DBX_FINISH_SYMBOL (sym);
2263 #else
2264 int line = 0;
2265 if (use_gnu_debug_info_extensions && sym != 0)
2266 line = DECL_SOURCE_LINE (sym);
2267
2268 fprintf (asmfile, "\",%d,0,%d,", current_sym_code, line);
2269 if (current_sym_addr)
2270 output_addr_const (asmfile, current_sym_addr);
2271 else
2272 fprintf (asmfile, "%d", current_sym_value);
2273 putc ('\n', asmfile);
2274 #endif
2275 }
2276
2277 /* Output definitions of all the decls in a chain. Return non-zero if
2278 anything was output */
2279
2280 int
2281 dbxout_syms (syms)
2282 tree syms;
2283 {
2284 int result = 0;
2285 while (syms)
2286 {
2287 result += dbxout_symbol (syms, 1);
2288 syms = TREE_CHAIN (syms);
2289 }
2290 return result;
2291 }
2292 \f
2293 /* The following two functions output definitions of function parameters.
2294 Each parameter gets a definition locating it in the parameter list.
2295 Each parameter that is a register variable gets a second definition
2296 locating it in the register.
2297
2298 Printing or argument lists in gdb uses the definitions that
2299 locate in the parameter list. But reference to the variable in
2300 expressions uses preferentially the definition as a register. */
2301
2302 /* Output definitions, referring to storage in the parmlist,
2303 of all the parms in PARMS, which is a chain of PARM_DECL nodes. */
2304
2305 void
2306 dbxout_parms (parms)
2307 tree parms;
2308 {
2309 for (; parms; parms = TREE_CHAIN (parms))
2310 if (DECL_NAME (parms) && TREE_TYPE (parms) != error_mark_node)
2311 {
2312 dbxout_prepare_symbol (parms);
2313
2314 /* Perform any necessary register eliminations on the parameter's rtl,
2315 so that the debugging output will be accurate. */
2316 DECL_INCOMING_RTL (parms)
2317 = eliminate_regs (DECL_INCOMING_RTL (parms), 0, NULL_RTX);
2318 SET_DECL_RTL (parms, eliminate_regs (DECL_RTL (parms), 0, NULL_RTX));
2319 #ifdef LEAF_REG_REMAP
2320 if (current_function_uses_only_leaf_regs)
2321 {
2322 leaf_renumber_regs_insn (DECL_INCOMING_RTL (parms));
2323 leaf_renumber_regs_insn (DECL_RTL (parms));
2324 }
2325 #endif
2326
2327 if (PARM_PASSED_IN_MEMORY (parms))
2328 {
2329 rtx addr = XEXP (DECL_INCOMING_RTL (parms), 0);
2330
2331 /* ??? Here we assume that the parm address is indexed
2332 off the frame pointer or arg pointer.
2333 If that is not true, we produce meaningless results,
2334 but do not crash. */
2335 if (GET_CODE (addr) == PLUS
2336 && GET_CODE (XEXP (addr, 1)) == CONST_INT)
2337 current_sym_value = INTVAL (XEXP (addr, 1));
2338 else
2339 current_sym_value = 0;
2340
2341 current_sym_code = N_PSYM;
2342 current_sym_addr = 0;
2343
2344 FORCE_TEXT;
2345 if (DECL_NAME (parms))
2346 {
2347 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
2348
2349 fprintf (asmfile, "%s\"%s:%c", ASM_STABS_OP,
2350 IDENTIFIER_POINTER (DECL_NAME (parms)),
2351 DBX_MEMPARM_STABS_LETTER);
2352 }
2353 else
2354 {
2355 current_sym_nchars = 8;
2356 fprintf (asmfile, "%s\"(anon):%c", ASM_STABS_OP,
2357 DBX_MEMPARM_STABS_LETTER);
2358 }
2359
2360 /* It is quite tempting to use:
2361
2362 dbxout_type (TREE_TYPE (parms), 0, 0);
2363
2364 as the next statement, rather than using DECL_ARG_TYPE(), so
2365 that gcc reports the actual type of the parameter, rather
2366 than the promoted type. This certainly makes GDB's life
2367 easier, at least for some ports. The change is a bad idea
2368 however, since GDB expects to be able access the type without
2369 performing any conversions. So for example, if we were
2370 passing a float to an unprototyped function, gcc will store a
2371 double on the stack, but if we emit a stab saying the type is a
2372 float, then gdb will only read in a single value, and this will
2373 produce an erropneous value. */
2374 dbxout_type (DECL_ARG_TYPE (parms), 0, 0);
2375 current_sym_value = DEBUGGER_ARG_OFFSET (current_sym_value, addr);
2376 dbxout_finish_symbol (parms);
2377 }
2378 else if (GET_CODE (DECL_RTL (parms)) == REG)
2379 {
2380 rtx best_rtl;
2381 char regparm_letter;
2382 tree parm_type;
2383 /* Parm passed in registers and lives in registers or nowhere. */
2384
2385 current_sym_code = DBX_REGPARM_STABS_CODE;
2386 regparm_letter = DBX_REGPARM_STABS_LETTER;
2387 current_sym_addr = 0;
2388
2389 /* If parm lives in a register, use that register;
2390 pretend the parm was passed there. It would be more consistent
2391 to describe the register where the parm was passed,
2392 but in practice that register usually holds something else.
2393
2394 If we use DECL_RTL, then we must use the declared type of
2395 the variable, not the type that it arrived in. */
2396 if (REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
2397 {
2398 best_rtl = DECL_RTL (parms);
2399 parm_type = TREE_TYPE (parms);
2400 }
2401 /* If the parm lives nowhere, use the register where it was
2402 passed. It is also better to use the declared type here. */
2403 else
2404 {
2405 best_rtl = DECL_INCOMING_RTL (parms);
2406 parm_type = TREE_TYPE (parms);
2407 }
2408 current_sym_value = DBX_REGISTER_NUMBER (REGNO (best_rtl));
2409
2410 FORCE_TEXT;
2411 if (DECL_NAME (parms))
2412 {
2413 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
2414 fprintf (asmfile, "%s\"%s:%c", ASM_STABS_OP,
2415 IDENTIFIER_POINTER (DECL_NAME (parms)),
2416 regparm_letter);
2417 }
2418 else
2419 {
2420 current_sym_nchars = 8;
2421 fprintf (asmfile, "%s\"(anon):%c", ASM_STABS_OP,
2422 regparm_letter);
2423 }
2424
2425 dbxout_type (parm_type, 0, 0);
2426 dbxout_finish_symbol (parms);
2427 }
2428 else if (GET_CODE (DECL_RTL (parms)) == MEM
2429 && GET_CODE (XEXP (DECL_RTL (parms), 0)) == REG
2430 && REGNO (XEXP (DECL_RTL (parms), 0)) != HARD_FRAME_POINTER_REGNUM
2431 && REGNO (XEXP (DECL_RTL (parms), 0)) != STACK_POINTER_REGNUM
2432 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
2433 && REGNO (XEXP (DECL_RTL (parms), 0)) != ARG_POINTER_REGNUM
2434 #endif
2435 )
2436 {
2437 /* Parm was passed via invisible reference.
2438 That is, its address was passed in a register.
2439 Output it as if it lived in that register.
2440 The debugger will know from the type
2441 that it was actually passed by invisible reference. */
2442
2443 char regparm_letter;
2444 /* Parm passed in registers and lives in registers or nowhere. */
2445
2446 current_sym_code = DBX_REGPARM_STABS_CODE;
2447 if (use_gnu_debug_info_extensions)
2448 regparm_letter = GDB_INV_REF_REGPARM_STABS_LETTER;
2449 else
2450 regparm_letter = DBX_REGPARM_STABS_LETTER;
2451
2452 /* DECL_RTL looks like (MEM (REG...). Get the register number.
2453 If it is an unallocated pseudo-reg, then use the register where
2454 it was passed instead. */
2455 if (REGNO (XEXP (DECL_RTL (parms), 0)) < FIRST_PSEUDO_REGISTER)
2456 current_sym_value = REGNO (XEXP (DECL_RTL (parms), 0));
2457 else
2458 current_sym_value = REGNO (DECL_INCOMING_RTL (parms));
2459
2460 current_sym_addr = 0;
2461
2462 FORCE_TEXT;
2463 if (DECL_NAME (parms))
2464 {
2465 current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms)));
2466
2467 fprintf (asmfile, "%s\"%s:%c", ASM_STABS_OP,
2468 IDENTIFIER_POINTER (DECL_NAME (parms)),
2469 regparm_letter);
2470 }
2471 else
2472 {
2473 current_sym_nchars = 8;
2474 fprintf (asmfile, "%s\"(anon):%c", ASM_STABS_OP,
2475 regparm_letter);
2476 }
2477
2478 dbxout_type (TREE_TYPE (parms), 0, 0);
2479 dbxout_finish_symbol (parms);
2480 }
2481 else if (GET_CODE (DECL_RTL (parms)) == MEM
2482 && GET_CODE (XEXP (DECL_RTL (parms), 0)) == MEM)
2483 {
2484 /* Parm was passed via invisible reference, with the reference
2485 living on the stack. DECL_RTL looks like
2486 (MEM (MEM (PLUS (REG ...) (CONST_INT ...)))) or it
2487 could look like (MEM (MEM (REG))). */
2488 const char *decl_name = (DECL_NAME (parms)
2489 ? IDENTIFIER_POINTER (DECL_NAME (parms))
2490 : "(anon)");
2491 if (GET_CODE (XEXP (XEXP (DECL_RTL (parms), 0), 0)) == REG)
2492 current_sym_value = 0;
2493 else
2494 current_sym_value
2495 = INTVAL (XEXP (XEXP (XEXP (DECL_RTL (parms), 0), 0), 1));
2496 current_sym_addr = 0;
2497
2498 FORCE_TEXT;
2499 fprintf (asmfile, "%s\"%s:v", ASM_STABS_OP, decl_name);
2500 dbxout_type (TREE_TYPE (parms), 0, 0);
2501 dbxout_finish_symbol (parms);
2502 }
2503 else if (GET_CODE (DECL_RTL (parms)) == MEM
2504 && XEXP (DECL_RTL (parms), 0) != const0_rtx
2505 /* ??? A constant address for a parm can happen
2506 when the reg it lives in is equiv to a constant in memory.
2507 Should make this not happen, after 2.4. */
2508 && ! CONSTANT_P (XEXP (DECL_RTL (parms), 0)))
2509 {
2510 /* Parm was passed in registers but lives on the stack. */
2511
2512 current_sym_code = N_PSYM;
2513 /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...))),
2514 in which case we want the value of that CONST_INT,
2515 or (MEM (REG ...)),
2516 in which case we use a value of zero. */
2517 if (GET_CODE (XEXP (DECL_RTL (parms), 0)) == REG)
2518 current_sym_value = 0;
2519 else
2520 current_sym_value
2521 = INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1));
2522
2523 current_sym_addr = 0;
2524
2525 /* Make a big endian correction if the mode of the type of the
2526 parameter is not the same as the mode of the rtl. */
2527 if (BYTES_BIG_ENDIAN
2528 && TYPE_MODE (TREE_TYPE (parms)) != GET_MODE (DECL_RTL (parms))
2529 && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (parms))) < UNITS_PER_WORD)
2530 {
2531 current_sym_value +=
2532 GET_MODE_SIZE (GET_MODE (DECL_RTL (parms)))
2533 - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (parms)));
2534 }
2535
2536 FORCE_TEXT;
2537 if (DECL_NAME (parms))
2538 {
2539 current_sym_nchars
2540 = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms)));
2541
2542 fprintf (asmfile, "%s\"%s:%c", ASM_STABS_OP,
2543 IDENTIFIER_POINTER (DECL_NAME (parms)),
2544 DBX_MEMPARM_STABS_LETTER);
2545 }
2546 else
2547 {
2548 current_sym_nchars = 8;
2549 fprintf (asmfile, "%s\"(anon):%c", ASM_STABS_OP,
2550 DBX_MEMPARM_STABS_LETTER);
2551 }
2552
2553 current_sym_value
2554 = DEBUGGER_ARG_OFFSET (current_sym_value,
2555 XEXP (DECL_RTL (parms), 0));
2556 dbxout_type (TREE_TYPE (parms), 0, 0);
2557 dbxout_finish_symbol (parms);
2558 }
2559 }
2560 }
2561
2562 /* Output definitions for the places where parms live during the function,
2563 when different from where they were passed, when the parms were passed
2564 in memory.
2565
2566 It is not useful to do this for parms passed in registers
2567 that live during the function in different registers, because it is
2568 impossible to look in the passed register for the passed value,
2569 so we use the within-the-function register to begin with.
2570
2571 PARMS is a chain of PARM_DECL nodes. */
2572
2573 void
2574 dbxout_reg_parms (parms)
2575 tree parms;
2576 {
2577 for (; parms; parms = TREE_CHAIN (parms))
2578 if (DECL_NAME (parms) && PARM_PASSED_IN_MEMORY (parms))
2579 {
2580 dbxout_prepare_symbol (parms);
2581
2582 /* Report parms that live in registers during the function
2583 but were passed in memory. */
2584 if (GET_CODE (DECL_RTL (parms)) == REG
2585 && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
2586 dbxout_symbol_location (parms, TREE_TYPE (parms),
2587 0, DECL_RTL (parms));
2588 else if (GET_CODE (DECL_RTL (parms)) == CONCAT)
2589 dbxout_symbol_location (parms, TREE_TYPE (parms),
2590 0, DECL_RTL (parms));
2591 /* Report parms that live in memory but not where they were passed. */
2592 else if (GET_CODE (DECL_RTL (parms)) == MEM
2593 && ! rtx_equal_p (DECL_RTL (parms), DECL_INCOMING_RTL (parms)))
2594 dbxout_symbol_location (parms, TREE_TYPE (parms),
2595 0, DECL_RTL (parms));
2596 }
2597 }
2598 \f
2599 /* Given a chain of ..._TYPE nodes (as come in a parameter list),
2600 output definitions of those names, in raw form */
2601
2602 void
2603 dbxout_args (args)
2604 tree args;
2605 {
2606 while (args)
2607 {
2608 putc (',', asmfile);
2609 dbxout_type (TREE_VALUE (args), 0, 0);
2610 CHARS (1);
2611 args = TREE_CHAIN (args);
2612 }
2613 }
2614 \f
2615 /* Given a chain of ..._TYPE nodes,
2616 find those which have typedef names and output those names.
2617 This is to ensure those types get output. */
2618
2619 void
2620 dbxout_types (types)
2621 register tree types;
2622 {
2623 while (types)
2624 {
2625 if (TYPE_NAME (types)
2626 && TREE_CODE (TYPE_NAME (types)) == TYPE_DECL
2627 && ! TREE_ASM_WRITTEN (TYPE_NAME (types)))
2628 dbxout_symbol (TYPE_NAME (types), 1);
2629 types = TREE_CHAIN (types);
2630 }
2631 }
2632 \f
2633 /* Output everything about a symbol block (a BLOCK node
2634 that represents a scope level),
2635 including recursive output of contained blocks.
2636
2637 BLOCK is the BLOCK node.
2638 DEPTH is its depth within containing symbol blocks.
2639 ARGS is usually zero; but for the outermost block of the
2640 body of a function, it is a chain of PARM_DECLs for the function parameters.
2641 We output definitions of all the register parms
2642 as if they were local variables of that block.
2643
2644 If -g1 was used, we count blocks just the same, but output nothing
2645 except for the outermost block.
2646
2647 Actually, BLOCK may be several blocks chained together.
2648 We handle them all in sequence. */
2649
2650 static void
2651 dbxout_block (block, depth, args)
2652 register tree block;
2653 int depth;
2654 tree args;
2655 {
2656 int blocknum = -1;
2657
2658 #if DBX_BLOCKS_FUNCTION_RELATIVE
2659 const char *begin_label;
2660 if (current_function_func_begin_label != NULL_TREE)
2661 begin_label = IDENTIFIER_POINTER (current_function_func_begin_label);
2662 else
2663 begin_label = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
2664 #endif
2665
2666 while (block)
2667 {
2668 /* Ignore blocks never expanded or otherwise marked as real. */
2669 if (TREE_USED (block) && TREE_ASM_WRITTEN (block))
2670 {
2671 int did_output;
2672
2673 #ifdef DBX_LBRAC_FIRST
2674 did_output = 1;
2675 #else
2676 /* In dbx format, the syms of a block come before the N_LBRAC.
2677 If nothing is output, we don't need the N_LBRAC, either. */
2678 did_output = 0;
2679 if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
2680 did_output = dbxout_syms (BLOCK_VARS (block));
2681 if (args)
2682 dbxout_reg_parms (args);
2683 #endif
2684
2685 /* Now output an N_LBRAC symbol to represent the beginning of
2686 the block. Use the block's tree-walk order to generate
2687 the assembler symbols LBBn and LBEn
2688 that final will define around the code in this block. */
2689 if (depth > 0 && did_output)
2690 {
2691 char buf[20];
2692 blocknum = BLOCK_NUMBER (block);
2693 ASM_GENERATE_INTERNAL_LABEL (buf, "LBB", blocknum);
2694
2695 if (BLOCK_HANDLER_BLOCK (block))
2696 {
2697 /* A catch block. Must precede N_LBRAC. */
2698 tree decl = BLOCK_VARS (block);
2699 while (decl)
2700 {
2701 #ifdef DBX_OUTPUT_CATCH
2702 DBX_OUTPUT_CATCH (asmfile, decl, buf);
2703 #else
2704 fprintf (asmfile, "%s\"%s:C1\",%d,0,0,", ASM_STABS_OP,
2705 IDENTIFIER_POINTER (DECL_NAME (decl)), N_CATCH);
2706 assemble_name (asmfile, buf);
2707 fprintf (asmfile, "\n");
2708 #endif
2709 decl = TREE_CHAIN (decl);
2710 }
2711 }
2712
2713 #ifdef DBX_OUTPUT_LBRAC
2714 DBX_OUTPUT_LBRAC (asmfile, buf);
2715 #else
2716 fprintf (asmfile, "%s%d,0,0,", ASM_STABN_OP, N_LBRAC);
2717 assemble_name (asmfile, buf);
2718 #if DBX_BLOCKS_FUNCTION_RELATIVE
2719 fputc ('-', asmfile);
2720 assemble_name (asmfile, begin_label);
2721 #endif
2722 fprintf (asmfile, "\n");
2723 #endif
2724 }
2725
2726 #ifdef DBX_LBRAC_FIRST
2727 /* On some weird machines, the syms of a block
2728 come after the N_LBRAC. */
2729 if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
2730 dbxout_syms (BLOCK_VARS (block));
2731 if (args)
2732 dbxout_reg_parms (args);
2733 #endif
2734
2735 /* Output the subblocks. */
2736 dbxout_block (BLOCK_SUBBLOCKS (block), depth + 1, NULL_TREE);
2737
2738 /* Refer to the marker for the end of the block. */
2739 if (depth > 0 && did_output)
2740 {
2741 char buf[20];
2742 ASM_GENERATE_INTERNAL_LABEL (buf, "LBE", blocknum);
2743 #ifdef DBX_OUTPUT_RBRAC
2744 DBX_OUTPUT_RBRAC (asmfile, buf);
2745 #else
2746 fprintf (asmfile, "%s%d,0,0,", ASM_STABN_OP, N_RBRAC);
2747 assemble_name (asmfile, buf);
2748 #if DBX_BLOCKS_FUNCTION_RELATIVE
2749 fputc ('-', asmfile);
2750 assemble_name (asmfile, begin_label);
2751 #endif
2752 fprintf (asmfile, "\n");
2753 #endif
2754 }
2755 }
2756 block = BLOCK_CHAIN (block);
2757 }
2758 }
2759
2760 /* Output the information about a function and its arguments and result.
2761 Usually this follows the function's code,
2762 but on some systems, it comes before. */
2763
2764 static void
2765 dbxout_really_begin_function (decl)
2766 tree decl;
2767 {
2768 dbxout_symbol (decl, 0);
2769 dbxout_parms (DECL_ARGUMENTS (decl));
2770 if (DECL_NAME (DECL_RESULT (decl)) != 0)
2771 dbxout_symbol (DECL_RESULT (decl), 1);
2772 }
2773
2774 /* Called at beginning of output of function definition. */
2775
2776 void
2777 dbxout_begin_function (decl)
2778 tree decl ATTRIBUTE_UNUSED;
2779 {
2780 #ifdef DBX_FUNCTION_FIRST
2781 dbxout_really_begin_function (decl);
2782 #endif
2783 }
2784
2785 /* Output dbx data for a function definition.
2786 This includes a definition of the function name itself (a symbol),
2787 definitions of the parameters (locating them in the parameter list)
2788 and then output the block that makes up the function's body
2789 (including all the auto variables of the function). */
2790
2791 void
2792 dbxout_function (decl)
2793 tree decl;
2794 {
2795 #ifndef DBX_FUNCTION_FIRST
2796 dbxout_really_begin_function (decl);
2797 #endif
2798 dbxout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl));
2799 #ifdef DBX_OUTPUT_FUNCTION_END
2800 DBX_OUTPUT_FUNCTION_END (asmfile, decl);
2801 #endif
2802 #if defined(ASM_OUTPUT_SECTION_NAME)
2803 if (use_gnu_debug_info_extensions
2804 #if defined(NO_DBX_FUNCTION_END)
2805 && ! NO_DBX_FUNCTION_END
2806 #endif
2807 )
2808 dbxout_function_end ();
2809 #endif
2810 }
2811 #endif /* DBX_DEBUGGING_INFO || XCOFF_DEBUGGING_INFO */