(DBX_CONTIN_LENGTH): Set to 80.
[official-gcc.git] / gcc / dbxout.c
blob7da2d41467b3403199d729da246a0a1495279457
1 /* Output dbx-format symbol table information from GNU compiler.
2 Copyright (C) 1987, 1988, 1992, 1993, 1994 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21 /* Output dbx-format symbol table data.
22 This consists of many symbol table entries, each of them
23 a .stabs assembler pseudo-op with four operands:
24 a "name" which is really a description of one symbol and its type,
25 a "code", which is a symbol defined in stab.h whose name starts with N_,
26 an unused operand always 0,
27 and a "value" which is an address or an offset.
28 The name is enclosed in doublequote characters.
30 Each function, variable, typedef, and structure tag
31 has a symbol table entry to define it.
32 The beginning and end of each level of name scoping within
33 a function are also marked by special symbol table entries.
35 The "name" consists of the symbol name, a colon, a kind-of-symbol letter,
36 and a data type number. The data type number may be followed by
37 "=" and a type definition; normally this will happen the first time
38 the type number is mentioned. The type definition may refer to
39 other types by number, and those type numbers may be followed
40 by "=" and nested definitions.
42 This can make the "name" quite long.
43 When a name is more than 80 characters, we split the .stabs pseudo-op
44 into two .stabs pseudo-ops, both sharing the same "code" and "value".
45 The first one is marked as continued with a double-backslash at the
46 end of its "name".
48 The kind-of-symbol letter distinguished function names from global
49 variables from file-scope variables from parameters from auto
50 variables in memory from typedef names from register variables.
51 See `dbxout_symbol'.
53 The "code" is mostly redundant with the kind-of-symbol letter
54 that goes in the "name", but not entirely: for symbols located
55 in static storage, the "code" says which segment the address is in,
56 which controls how it is relocated.
58 The "value" for a symbol in static storage
59 is the core address of the symbol (actually, the assembler
60 label for the symbol). For a symbol located in a stack slot
61 it is the stack offset; for one in a register, the register number.
62 For a typedef symbol, it is zero.
64 If DEBUG_SYMS_TEXT is defined, all debugging symbols must be
65 output while in the text section.
67 For more on data type definitions, see `dbxout_type'. */
69 /* Include these first, because they may define MIN and MAX. */
70 #include <stdio.h>
71 #include <errno.h>
73 #include "config.h"
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 "defaults.h"
81 #include "output.h" /* ASM_OUTPUT_SOURCE_LINE may refer to sdb functions. */
83 #ifndef errno
84 extern int errno;
85 #endif
87 #ifdef XCOFF_DEBUGGING_INFO
88 #include "xcoffout.h"
89 #endif
91 #ifndef ASM_STABS_OP
92 #define ASM_STABS_OP ".stabs"
93 #endif
95 #ifndef ASM_STABN_OP
96 #define ASM_STABN_OP ".stabn"
97 #endif
99 #ifndef DBX_TYPE_DECL_STABS_CODE
100 #define DBX_TYPE_DECL_STABS_CODE N_LSYM
101 #endif
103 #ifndef DBX_STATIC_CONST_VAR_CODE
104 #define DBX_STATIC_CONST_VAR_CODE N_FUN
105 #endif
107 #ifndef DBX_REGPARM_STABS_CODE
108 #define DBX_REGPARM_STABS_CODE N_RSYM
109 #endif
111 #ifndef DBX_REGPARM_STABS_LETTER
112 #define DBX_REGPARM_STABS_LETTER 'P'
113 #endif
115 #ifndef DBX_MEMPARM_STABS_LETTER
116 #define DBX_MEMPARM_STABS_LETTER 'p'
117 #endif
119 #ifndef FILE_NAME_JOINER
120 #define FILE_NAME_JOINER "/"
121 #endif
123 /* Nonzero means if the type has methods, only output debugging
124 information if methods are actually written to the asm file. */
126 static int flag_minimal_debug = 1;
128 /* Nonzero if we have actually used any of the GDB extensions
129 to the debugging format. The idea is that we use them for the
130 first time only if there's a strong reason, but once we have done that,
131 we use them whenever convenient. */
133 static int have_used_extensions = 0;
135 /* Number for the next N_SOL filename stabs label. The number 0 is reserved
136 for the N_SO filename stabs label. */
138 static int source_label_number = 1;
140 char *getpwd ();
142 /* Typical USG systems don't have stab.h, and they also have
143 no use for DBX-format debugging info. */
145 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
147 #ifdef DEBUG_SYMS_TEXT
148 #define FORCE_TEXT text_section ();
149 #else
150 #define FORCE_TEXT
151 #endif
153 #if defined (USG) || defined (NO_STAB_H)
154 #include "gstab.h" /* If doing DBX on sysV, use our own stab.h. */
155 #else
156 #include <stab.h> /* On BSD, use the system's stab.h. */
158 /* This is a GNU extension we need to reference in this file. */
159 #ifndef N_CATCH
160 #define N_CATCH 0x54
161 #endif
162 #endif /* not USG */
164 #ifdef __GNU_STAB__
165 #define STAB_CODE_TYPE enum __stab_debug_code
166 #else
167 #define STAB_CODE_TYPE int
168 #endif
170 /* 1 if PARM is passed to this function in memory. */
172 #define PARM_PASSED_IN_MEMORY(PARM) \
173 (GET_CODE (DECL_INCOMING_RTL (PARM)) == MEM)
175 /* A C expression for the integer offset value of an automatic variable
176 (N_LSYM) having address X (an RTX). */
177 #ifndef DEBUGGER_AUTO_OFFSET
178 #define DEBUGGER_AUTO_OFFSET(X) \
179 (GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0)
180 #endif
182 /* A C expression for the integer offset value of an argument (N_PSYM)
183 having address X (an RTX). The nominal offset is OFFSET. */
184 #ifndef DEBUGGER_ARG_OFFSET
185 #define DEBUGGER_ARG_OFFSET(OFFSET, X) (OFFSET)
186 #endif
188 /* Stream for writing to assembler file. */
190 static FILE *asmfile;
192 /* Last source file name mentioned in a NOTE insn. */
194 static char *lastfile;
196 /* Current working directory. */
198 static char *cwd;
200 enum typestatus {TYPE_UNSEEN, TYPE_XREF, TYPE_DEFINED};
202 /* Vector recording the status of describing C data types.
203 When we first notice a data type (a tree node),
204 we assign it a number using next_type_number.
205 That is its index in this vector.
206 The vector element says whether we have yet output
207 the definition of the type. TYPE_XREF says we have
208 output it as a cross-reference only. */
210 enum typestatus *typevec;
212 /* Number of elements of space allocated in `typevec'. */
214 static int typevec_len;
216 /* In dbx output, each type gets a unique number.
217 This is the number for the next type output.
218 The number, once assigned, is in the TYPE_SYMTAB_ADDRESS field. */
220 static int next_type_number;
222 /* In dbx output, we must assign symbol-blocks id numbers
223 in the order in which their beginnings are encountered.
224 We output debugging info that refers to the beginning and
225 end of the ranges of code in each block
226 with assembler labels LBBn and LBEn, where n is the block number.
227 The labels are generated in final, which assigns numbers to the
228 blocks in the same way. */
230 static int next_block_number;
232 /* These variables are for dbxout_symbol to communicate to
233 dbxout_finish_symbol.
234 current_sym_code is the symbol-type-code, a symbol N_... define in stab.h.
235 current_sym_value and current_sym_addr are two ways to address the
236 value to store in the symtab entry.
237 current_sym_addr if nonzero represents the value as an rtx.
238 If that is zero, current_sym_value is used. This is used
239 when the value is an offset (such as for auto variables,
240 register variables and parms). */
242 static STAB_CODE_TYPE current_sym_code;
243 static int current_sym_value;
244 static rtx current_sym_addr;
246 /* Number of chars of symbol-description generated so far for the
247 current symbol. Used by CHARS and CONTIN. */
249 static int current_sym_nchars;
251 /* Report having output N chars of the current symbol-description. */
253 #define CHARS(N) (current_sym_nchars += (N))
255 /* Break the current symbol-description, generating a continuation,
256 if it has become long. */
258 #ifndef DBX_CONTIN_LENGTH
259 #define DBX_CONTIN_LENGTH 80
260 #endif
262 #if DBX_CONTIN_LENGTH > 0
263 #define CONTIN \
264 do {if (current_sym_nchars > DBX_CONTIN_LENGTH) dbxout_continue ();} while (0)
265 #else
266 #define CONTIN
267 #endif
269 void dbxout_types ();
270 void dbxout_args ();
271 void dbxout_symbol ();
272 static void dbxout_type_name ();
273 static void dbxout_type ();
274 static void dbxout_typedefs ();
275 static void dbxout_symbol_name ();
276 static void dbxout_symbol_location ();
277 static void dbxout_prepare_symbol ();
278 static void dbxout_finish_symbol ();
279 static void dbxout_continue ();
280 static void print_int_cst_octal ();
281 static void print_octal ();
283 #if 0 /* Not clear we will actually need this. */
285 /* Return the absolutized filename for the given relative
286 filename. Note that if that filename is already absolute, it may
287 still be returned in a modified form because this routine also
288 eliminates redundant slashes and single dots and eliminates double
289 dots to get a shortest possible filename from the given input
290 filename. The absolutization of relative filenames is made by
291 assuming that the given filename is to be taken as relative to
292 the first argument (cwd) or to the current directory if cwd is
293 NULL. */
295 static char *
296 abspath (rel_filename)
297 char *rel_filename;
299 /* Setup the current working directory as needed. */
300 char *abs_buffer
301 = (char *) alloca (strlen (cwd) + strlen (rel_filename) + 1);
302 char *endp = abs_buffer;
303 char *outp, *inp;
304 char *value;
306 /* Copy the filename (possibly preceded by the current working
307 directory name) into the absolutization buffer. */
310 char *src_p;
312 if (rel_filename[0] != '/')
314 src_p = cwd;
315 while (*endp++ = *src_p++)
316 continue;
317 *(endp-1) = '/'; /* overwrite null */
319 src_p = rel_filename;
320 while (*endp++ = *src_p++)
321 continue;
322 if (endp[-1] == '/')
323 *endp = '\0';
325 /* Now make a copy of abs_buffer into abs_buffer, shortening the
326 filename (by taking out slashes and dots) as we go. */
328 outp = inp = abs_buffer;
329 *outp++ = *inp++; /* copy first slash */
330 for (;;)
332 if (!inp[0])
333 break;
334 else if (inp[0] == '/' && outp[-1] == '/')
336 inp++;
337 continue;
339 else if (inp[0] == '.' && outp[-1] == '/')
341 if (!inp[1])
342 break;
343 else if (inp[1] == '/')
345 inp += 2;
346 continue;
348 else if ((inp[1] == '.') && (inp[2] == 0 || inp[2] == '/'))
350 inp += (inp[2] == '/') ? 3 : 2;
351 outp -= 2;
352 while (outp >= abs_buffer && *outp != '/')
353 outp--;
354 if (outp < abs_buffer)
356 /* Catch cases like /.. where we try to backup to a
357 point above the absolute root of the logical file
358 system. */
360 fprintf (stderr, "%s: invalid file name: %s\n",
361 pname, rel_filename);
362 exit (1);
364 *++outp = '\0';
365 continue;
368 *outp++ = *inp++;
371 /* On exit, make sure that there is a trailing null, and make sure that
372 the last character of the returned string is *not* a slash. */
374 *outp = '\0';
375 if (outp[-1] == '/')
376 *--outp = '\0';
378 /* Make a copy (in the heap) of the stuff left in the absolutization
379 buffer and return a pointer to the copy. */
381 value = (char *) oballoc (strlen (abs_buffer) + 1);
382 strcpy (value, abs_buffer);
383 return value;
385 #endif /* 0 */
387 /* At the beginning of compilation, start writing the symbol table.
388 Initialize `typevec' and output the standard data types of C. */
390 void
391 dbxout_init (asm_file, input_file_name, syms)
392 FILE *asm_file;
393 char *input_file_name;
394 tree syms;
396 char ltext_label_name[100];
398 asmfile = asm_file;
400 typevec_len = 100;
401 typevec = (enum typestatus *) xmalloc (typevec_len * sizeof typevec[0]);
402 bzero ((char *) typevec, typevec_len * sizeof typevec[0]);
404 /* Convert Ltext into the appropriate format for local labels in case
405 the system doesn't insert underscores in front of user generated
406 labels. */
407 ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext", 0);
409 /* Put the current working directory in an N_SO symbol. */
410 #ifndef DBX_WORKING_DIRECTORY /* Only some versions of DBX want this,
411 but GDB always does. */
412 if (use_gnu_debug_info_extensions)
413 #endif
415 if (!cwd && (cwd = getpwd ()) && (!*cwd || cwd[strlen (cwd) - 1] != '/'))
417 char *wdslash = xmalloc (strlen (cwd) + sizeof (FILE_NAME_JOINER));
418 sprintf (wdslash, "%s%s", cwd, FILE_NAME_JOINER);
419 cwd = wdslash;
421 if (cwd)
423 #ifdef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
424 DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (asmfile, cwd);
425 #else /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
426 fprintf (asmfile, "%s ", ASM_STABS_OP);
427 output_quoted_string (asmfile, cwd);
428 fprintf (asmfile, ",%d,0,0,%s\n", N_SO, &ltext_label_name[1]);
429 #endif /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
433 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILENAME
434 /* This should NOT be DBX_OUTPUT_SOURCE_FILENAME. That
435 would give us an N_SOL, and we want an N_SO. */
436 DBX_OUTPUT_MAIN_SOURCE_FILENAME (asmfile, input_file_name);
437 #else /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
438 /* We include outputting `Ltext:' here,
439 because that gives you a way to override it. */
440 /* Used to put `Ltext:' before the reference, but that loses on sun 4. */
441 fprintf (asmfile, "%s ", ASM_STABS_OP);
442 output_quoted_string (asmfile, input_file_name);
443 fprintf (asmfile, ",%d,0,0,%s\n",
444 N_SO, &ltext_label_name[1]);
445 text_section ();
446 ASM_OUTPUT_INTERNAL_LABEL (asmfile, "Ltext", 0);
447 #endif /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
449 /* Possibly output something to inform GDB that this compilation was by
450 GCC. It's easier for GDB to parse it when after the N_SO's. This
451 is used in Solaris 2. */
452 #ifdef ASM_IDENTIFY_GCC_AFTER_SOURCE
453 ASM_IDENTIFY_GCC_AFTER_SOURCE (asmfile);
454 #endif
456 lastfile = input_file_name;
458 next_type_number = 1;
459 next_block_number = 2;
461 /* Make sure that types `int' and `char' have numbers 1 and 2.
462 Definitions of other integer types will refer to those numbers.
463 (Actually it should no longer matter what their numbers are.
464 Also, if any types with tags have been defined, dbxout_symbol
465 will output them first, so the numbers won't be 1 and 2. That
466 happens in C++. So it's a good thing it should no longer matter). */
468 #ifdef DBX_OUTPUT_STANDARD_TYPES
469 DBX_OUTPUT_STANDARD_TYPES (syms);
470 #else
471 dbxout_symbol (TYPE_NAME (integer_type_node), 0);
472 dbxout_symbol (TYPE_NAME (char_type_node), 0);
473 #endif
475 /* Get all permanent types that have typedef names,
476 and output them all, except for those already output. */
478 dbxout_typedefs (syms);
481 /* Output any typedef names for types described by TYPE_DECLs in SYMS,
482 in the reverse order from that which is found in SYMS. */
484 static void
485 dbxout_typedefs (syms)
486 tree syms;
488 if (syms)
490 dbxout_typedefs (TREE_CHAIN (syms));
491 if (TREE_CODE (syms) == TYPE_DECL)
493 tree type = TREE_TYPE (syms);
494 if (TYPE_NAME (type)
495 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
496 && ! TREE_ASM_WRITTEN (TYPE_NAME (type)))
497 dbxout_symbol (TYPE_NAME (type), 0);
502 /* Output debugging info to FILE to switch to sourcefile FILENAME. */
504 void
505 dbxout_source_file (file, filename)
506 FILE *file;
507 char *filename;
509 char ltext_label_name[100];
511 if (filename && (lastfile == 0 || strcmp (filename, lastfile)))
513 #ifdef DBX_OUTPUT_SOURCE_FILENAME
514 DBX_OUTPUT_SOURCE_FILENAME (file, filename);
515 #else
516 ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext",
517 source_label_number);
518 fprintf (file, "%s ", ASM_STABS_OP);
519 output_quoted_string (file, filename);
520 fprintf (file, ",%d,0,0,%s\n", N_SOL, &ltext_label_name[1]);
521 text_section ();
522 ASM_OUTPUT_INTERNAL_LABEL (asmfile, "Ltext", source_label_number++);
523 #endif
524 lastfile = filename;
528 /* Output a line number symbol entry into output stream FILE,
529 for source file FILENAME and line number LINENO. */
531 void
532 dbxout_source_line (file, filename, lineno)
533 FILE *file;
534 char *filename;
535 int lineno;
537 dbxout_source_file (file, filename);
539 #ifdef ASM_OUTPUT_SOURCE_LINE
540 ASM_OUTPUT_SOURCE_LINE (file, lineno);
541 #else
542 fprintf (file, "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno);
543 #endif
546 /* At the end of compilation, finish writing the symbol table.
547 Unless you define DBX_OUTPUT_MAIN_SOURCE_FILE_END, the default is
548 to do nothing. */
550 void
551 dbxout_finish (file, filename)
552 FILE *file;
553 char *filename;
555 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILE_END
556 DBX_OUTPUT_MAIN_SOURCE_FILE_END (file, filename);
557 #endif /* DBX_OUTPUT_MAIN_SOURCE_FILE_END */
560 /* Continue a symbol-description that gets too big.
561 End one symbol table entry with a double-backslash
562 and start a new one, eventually producing something like
563 .stabs "start......\\",code,0,value
564 .stabs "...rest",code,0,value */
566 static void
567 dbxout_continue ()
569 #ifdef DBX_CONTIN_CHAR
570 fprintf (asmfile, "%c", DBX_CONTIN_CHAR);
571 #else
572 fprintf (asmfile, "\\\\");
573 #endif
574 dbxout_finish_symbol (NULL_TREE);
575 fprintf (asmfile, "%s \"", ASM_STABS_OP);
576 current_sym_nchars = 0;
579 /* Subroutine of `dbxout_type'. Output the type fields of TYPE.
580 This must be a separate function because anonymous unions require
581 recursive calls. */
583 static void
584 dbxout_type_fields (type)
585 tree type;
587 tree tem;
588 /* Output the name, type, position (in bits), size (in bits) of each
589 field. */
590 for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
592 /* Omit here local type decls until we know how to support them. */
593 if (TREE_CODE (tem) == TYPE_DECL)
594 continue;
595 /* Omit fields whose position or size are variable. */
596 else if (TREE_CODE (tem) == FIELD_DECL
597 && (TREE_CODE (DECL_FIELD_BITPOS (tem)) != INTEGER_CST
598 || TREE_CODE (DECL_SIZE (tem)) != INTEGER_CST))
599 continue;
600 /* Omit here the nameless fields that are used to skip bits. */
601 else if (TREE_CODE (tem) != CONST_DECL)
603 /* Continue the line if necessary,
604 but not before the first field. */
605 if (tem != TYPE_FIELDS (type))
606 CONTIN;
608 if (use_gnu_debug_info_extensions
609 && flag_minimal_debug
610 && TREE_CODE (tem) == FIELD_DECL
611 && DECL_VIRTUAL_P (tem)
612 && DECL_ASSEMBLER_NAME (tem))
614 have_used_extensions = 1;
615 CHARS (3 + IDENTIFIER_LENGTH (DECL_NAME (TYPE_NAME (DECL_FCONTEXT (tem)))));
616 fputs (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (tem)), asmfile);
617 dbxout_type (DECL_FCONTEXT (tem), 0, 0);
618 fprintf (asmfile, ":");
619 dbxout_type (TREE_TYPE (tem), 0, 0);
620 fprintf (asmfile, ",%d;",
621 TREE_INT_CST_LOW (DECL_FIELD_BITPOS (tem)));
622 continue;
625 if (DECL_NAME (tem))
627 fprintf (asmfile, "%s:", IDENTIFIER_POINTER (DECL_NAME (tem)));
628 CHARS (2 + IDENTIFIER_LENGTH (DECL_NAME (tem)));
630 else
632 fprintf (asmfile, ":");
633 CHARS (2);
636 if (use_gnu_debug_info_extensions
637 && (TREE_PRIVATE (tem) || TREE_PROTECTED (tem)
638 || TREE_CODE (tem) != FIELD_DECL))
640 have_used_extensions = 1;
641 putc ('/', asmfile);
642 putc ((TREE_PRIVATE (tem) ? '0'
643 : TREE_PROTECTED (tem) ? '1' : '2'),
644 asmfile);
645 CHARS (2);
648 dbxout_type ((TREE_CODE (tem) == FIELD_DECL
649 && DECL_BIT_FIELD_TYPE (tem))
650 ? DECL_BIT_FIELD_TYPE (tem)
651 : TREE_TYPE (tem), 0, 0);
653 if (TREE_CODE (tem) == VAR_DECL)
655 if (TREE_STATIC (tem) && use_gnu_debug_info_extensions)
657 char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (tem));
658 have_used_extensions = 1;
659 fprintf (asmfile, ":%s;", name);
660 CHARS (strlen (name));
662 else
664 /* If TEM is non-static, GDB won't understand it. */
665 fprintf (asmfile, ",0,0;");
668 else if (TREE_CODE (DECL_FIELD_BITPOS (tem)) == INTEGER_CST)
670 fprintf (asmfile, ",%d,%d;",
671 TREE_INT_CST_LOW (DECL_FIELD_BITPOS (tem)),
672 TREE_INT_CST_LOW (DECL_SIZE (tem)));
674 CHARS (23);
679 /* Subroutine of `dbxout_type_methods'. Output debug info about the
680 method described DECL. DEBUG_NAME is an encoding of the method's
681 type signature. ??? We may be able to do without DEBUG_NAME altogether
682 now. */
684 static void
685 dbxout_type_method_1 (decl, debug_name)
686 tree decl;
687 char *debug_name;
689 tree firstarg = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)));
690 char c1 = 'A', c2;
692 if (TREE_CODE (TREE_TYPE (decl)) == FUNCTION_TYPE)
693 c2 = '?';
694 else /* it's a METHOD_TYPE. */
696 /* A for normal functions.
697 B for `const' member functions.
698 C for `volatile' member functions.
699 D for `const volatile' member functions. */
700 if (TYPE_READONLY (TREE_TYPE (firstarg)))
701 c1 += 1;
702 if (TYPE_VOLATILE (TREE_TYPE (firstarg)))
703 c1 += 2;
705 if (DECL_VINDEX (decl))
706 c2 = '*';
707 else
708 c2 = '.';
711 fprintf (asmfile, ":%s;%c%c%c", debug_name,
712 TREE_PRIVATE (decl) ? '0' : TREE_PROTECTED (decl) ? '1' : '2', c1, c2);
713 CHARS (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (decl)) + 6
714 - (debug_name - IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
715 if (DECL_VINDEX (decl))
717 fprintf (asmfile, "%d;",
718 TREE_INT_CST_LOW (DECL_VINDEX (decl)));
719 dbxout_type (DECL_CONTEXT (decl), 0, 0);
720 fprintf (asmfile, ";");
721 CHARS (8);
725 /* Subroutine of `dbxout_type'. Output debug info about the methods defined
726 in TYPE. */
728 static void
729 dbxout_type_methods (type)
730 register tree type;
732 /* C++: put out the method names and their parameter lists */
733 tree methods = TYPE_METHODS (type);
734 tree type_encoding;
735 register tree fndecl;
736 register tree last;
737 char formatted_type_identifier_length[16];
738 register int type_identifier_length;
740 if (methods == NULL_TREE)
741 return;
743 type_encoding = DECL_NAME (TYPE_NAME (type));
745 /* C++: Template classes break some assumptions made by this code about
746 the class names, constructor names, and encodings for assembler
747 label names. For now, disable output of dbx info for them. */
749 char *ptr = IDENTIFIER_POINTER (type_encoding);
750 /* This should use index. (mrs) */
751 while (*ptr && *ptr != '<') ptr++;
752 if (*ptr != 0)
754 static int warned;
755 if (!warned)
757 warned = 1;
758 #ifdef HAVE_TEMPLATES
759 if (warn_template_debugging)
760 warning ("dbx info for template class methods not yet supported");
761 #endif
763 return;
767 type_identifier_length = IDENTIFIER_LENGTH (type_encoding);
769 sprintf(formatted_type_identifier_length, "%d", type_identifier_length);
771 if (TREE_CODE (methods) == FUNCTION_DECL)
772 fndecl = methods;
773 else if (TREE_VEC_ELT (methods, 0) != NULL_TREE)
774 fndecl = TREE_VEC_ELT (methods, 0);
775 else
776 fndecl = TREE_VEC_ELT (methods, 1);
778 while (fndecl)
780 tree name = DECL_NAME (fndecl);
781 int need_prefix = 1;
783 /* Group together all the methods for the same operation.
784 These differ in the types of the arguments. */
785 for (last = NULL_TREE;
786 fndecl && (last == NULL_TREE || DECL_NAME (fndecl) == DECL_NAME (last));
787 fndecl = TREE_CHAIN (fndecl))
788 /* Output the name of the field (after overloading), as
789 well as the name of the field before overloading, along
790 with its parameter list */
792 /* This is the "mangled" name of the method.
793 It encodes the argument types. */
794 char *debug_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl));
795 int destructor = 0;
797 CONTIN;
799 last = fndecl;
801 if (DECL_IGNORED_P (fndecl))
802 continue;
804 if (flag_minimal_debug)
806 /* Detect ordinary methods because their mangled names
807 start with the operation name. */
808 if (!strncmp (IDENTIFIER_POINTER (name), debug_name,
809 IDENTIFIER_LENGTH (name)))
811 debug_name += IDENTIFIER_LENGTH (name);
812 if (debug_name[0] == '_' && debug_name[1] == '_')
814 char *method_name = debug_name + 2;
815 char *length_ptr = formatted_type_identifier_length;
816 /* Get past const and volatile qualifiers. */
817 while (*method_name == 'C' || *method_name == 'V')
818 method_name++;
819 /* Skip digits for length of type_encoding. */
820 while (*method_name == *length_ptr && *length_ptr)
821 length_ptr++, method_name++;
822 if (! strncmp (method_name,
823 IDENTIFIER_POINTER (type_encoding),
824 type_identifier_length))
825 method_name += type_identifier_length;
826 debug_name = method_name;
829 /* Detect constructors by their style of name mangling. */
830 else if (debug_name[0] == '_' && debug_name[1] == '_')
832 char *ctor_name = debug_name + 2;
833 char *length_ptr = formatted_type_identifier_length;
834 while (*ctor_name == 'C' || *ctor_name == 'V')
835 ctor_name++;
836 /* Skip digits for length of type_encoding. */
837 while (*ctor_name == *length_ptr && *length_ptr)
838 length_ptr++, ctor_name++;
839 if (!strncmp (IDENTIFIER_POINTER (type_encoding), ctor_name,
840 type_identifier_length))
841 debug_name = ctor_name + type_identifier_length;
843 /* The other alternative is a destructor. */
844 else
845 destructor = 1;
847 /* Output the operation name just once, for the first method
848 that we output. */
849 if (need_prefix)
851 fprintf (asmfile, "%s::", IDENTIFIER_POINTER (name));
852 CHARS (IDENTIFIER_LENGTH (name) + 2);
853 need_prefix = 0;
857 dbxout_type (TREE_TYPE (fndecl), 0, destructor);
859 dbxout_type_method_1 (fndecl, debug_name);
861 if (!need_prefix)
863 putc (';', asmfile);
864 CHARS (1);
869 /* Emit a "range" type specification, which has the form:
870 "r<index type>;<lower bound>;<upper bound>;".
871 TYPE is an INTEGER_TYPE. */
873 static void
874 dbxout_range_type (type)
875 tree type;
877 fprintf (asmfile, "r");
878 if (TREE_TYPE (type))
879 dbxout_type (TREE_TYPE (type), 0, 0);
880 else if (TREE_CODE (type) != INTEGER_TYPE)
881 dbxout_type (type, 0, 0); /* E.g. Pascal's ARRAY [BOOLEAN] of INTEGER */
882 else
884 /* This used to say `r1' and we used to take care
885 to make sure that `int' was type number 1. */
886 fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (integer_type_node));
888 if (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST)
889 fprintf (asmfile, ";%d",
890 TREE_INT_CST_LOW (TYPE_MIN_VALUE (type)));
891 else
892 fprintf (asmfile, ";0");
893 if (TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST)
894 fprintf (asmfile, ";%d;",
895 TREE_INT_CST_LOW (TYPE_MAX_VALUE (type)));
896 else
897 fprintf (asmfile, ";-1;");
900 /* Output a reference to a type. If the type has not yet been
901 described in the dbx output, output its definition now.
902 For a type already defined, just refer to its definition
903 using the type number.
905 If FULL is nonzero, and the type has been described only with
906 a forward-reference, output the definition now.
907 If FULL is zero in this case, just refer to the forward-reference
908 using the number previously allocated.
910 If SHOW_ARG_TYPES is nonzero, we output a description of the argument
911 types for a METHOD_TYPE. */
913 static void
914 dbxout_type (type, full, show_arg_types)
915 tree type;
916 int full;
917 int show_arg_types;
919 register tree tem;
920 static int anonymous_type_number = 0;
922 /* If there was an input error and we don't really have a type,
923 avoid crashing and write something that is at least valid
924 by assuming `int'. */
925 if (type == error_mark_node)
926 type = integer_type_node;
927 else
929 type = TYPE_MAIN_VARIANT (type);
930 if (TYPE_NAME (type)
931 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
932 && TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (type)))
933 full = 0;
936 if (TYPE_SYMTAB_ADDRESS (type) == 0)
938 /* Type has no dbx number assigned. Assign next available number. */
939 TYPE_SYMTAB_ADDRESS (type) = next_type_number++;
941 /* Make sure type vector is long enough to record about this type. */
943 if (next_type_number == typevec_len)
945 typevec =
946 (enum typestatus *) xrealloc (typevec,
947 typevec_len * 2 * sizeof typevec[0]);
948 bzero ((char *) (typevec + typevec_len),
949 typevec_len * sizeof typevec[0]);
950 typevec_len *= 2;
954 /* Output the number of this type, to refer to it. */
955 fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (type));
956 CHARS (3);
958 #ifdef DBX_TYPE_DEFINED
959 if (DBX_TYPE_DEFINED (type))
960 return;
961 #endif
963 /* If this type's definition has been output or is now being output,
964 that is all. */
966 switch (typevec[TYPE_SYMTAB_ADDRESS (type)])
968 case TYPE_UNSEEN:
969 break;
970 case TYPE_XREF:
971 /* If we have already had a cross reference,
972 and either that's all we want or that's the best we could do,
973 don't repeat the cross reference.
974 Sun dbx crashes if we do. */
975 if (! full || TYPE_SIZE (type) == 0
976 /* No way in DBX fmt to describe a variable size. */
977 || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
978 return;
979 break;
980 case TYPE_DEFINED:
981 return;
984 #ifdef DBX_NO_XREFS
985 /* For systems where dbx output does not allow the `=xsNAME:' syntax,
986 leave the type-number completely undefined rather than output
987 a cross-reference. If we have already used GNU debug info extensions,
988 then it is OK to output a cross reference. This is necessary to get
989 proper C++ debug output. */
990 if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
991 || TREE_CODE (type) == QUAL_UNION_TYPE
992 || TREE_CODE (type) == ENUMERAL_TYPE)
993 && ! use_gnu_debug_info_extensions)
994 /* We must use the same test here as we use twice below when deciding
995 whether to emit a cross-reference. */
996 if ((TYPE_NAME (type) != 0
997 && ! (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
998 && DECL_IGNORED_P (TYPE_NAME (type)))
999 && !full)
1000 || TYPE_SIZE (type) == 0
1001 /* No way in DBX fmt to describe a variable size. */
1002 || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
1004 typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_XREF;
1005 return;
1007 #endif
1009 /* Output a definition now. */
1011 fprintf (asmfile, "=");
1012 CHARS (1);
1014 /* Mark it as defined, so that if it is self-referent
1015 we will not get into an infinite recursion of definitions. */
1017 typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_DEFINED;
1019 switch (TREE_CODE (type))
1021 case VOID_TYPE:
1022 case LANG_TYPE:
1023 /* For a void type, just define it as itself; ie, "5=5".
1024 This makes us consider it defined
1025 without saying what it is. The debugger will make it
1026 a void type when the reference is seen, and nothing will
1027 ever override that default. */
1028 fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (type));
1029 CHARS (3);
1030 break;
1032 case INTEGER_TYPE:
1033 if (type == char_type_node && ! TREE_UNSIGNED (type))
1034 /* Output the type `char' as a subrange of itself!
1035 I don't understand this definition, just copied it
1036 from the output of pcc.
1037 This used to use `r2' explicitly and we used to
1038 take care to make sure that `char' was type number 2. */
1039 fprintf (asmfile, "r%d;0;127;", TYPE_SYMTAB_ADDRESS (type));
1040 else if (use_gnu_debug_info_extensions
1041 && (TYPE_PRECISION (type) > TYPE_PRECISION (integer_type_node)
1042 || TYPE_PRECISION (type) > HOST_BITS_PER_WIDE_INT))
1044 /* This used to say `r1' and we used to take care
1045 to make sure that `int' was type number 1. */
1046 fprintf (asmfile, "r%d;", TYPE_SYMTAB_ADDRESS (integer_type_node));
1047 print_int_cst_octal (TYPE_MIN_VALUE (type));
1048 fprintf (asmfile, ";");
1049 print_int_cst_octal (TYPE_MAX_VALUE (type));
1050 fprintf (asmfile, ";");
1052 else /* Output other integer types as subranges of `int'. */
1053 dbxout_range_type (type);
1054 CHARS (25);
1055 break;
1057 case REAL_TYPE:
1058 /* This used to say `r1' and we used to take care
1059 to make sure that `int' was type number 1. */
1060 fprintf (asmfile, "r%d;%d;0;", TYPE_SYMTAB_ADDRESS (integer_type_node),
1061 int_size_in_bytes (type));
1062 CHARS (16);
1063 break;
1065 case CHAR_TYPE:
1066 if (use_gnu_debug_info_extensions)
1067 fprintf (asmfile, "@s%d;-20;",
1068 BITS_PER_UNIT * int_size_in_bytes (type));
1069 else
1070 /* Output the type `char' as a subrange of itself.
1071 That is what pcc seems to do. */
1072 fprintf (asmfile, "r%d;0;%d;", TYPE_SYMTAB_ADDRESS (char_type_node),
1073 TREE_UNSIGNED (type) ? 255 : 127);
1074 CHARS (9);
1075 break;
1077 case BOOLEAN_TYPE:
1078 if (use_gnu_debug_info_extensions)
1079 fprintf (asmfile, "@s%d;-16;",
1080 BITS_PER_UNIT * int_size_in_bytes (type));
1081 else /* Define as enumeral type (False, True) */
1082 fprintf (asmfile, "eFalse:0,True:1,;");
1083 CHARS (17);
1084 break;
1086 case FILE_TYPE:
1087 putc ('d', asmfile);
1088 CHARS (1);
1089 dbxout_type (TREE_TYPE (type), 0, 0);
1090 break;
1092 case COMPLEX_TYPE:
1093 /* Differs from the REAL_TYPE by its new data type number */
1095 if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
1097 fprintf (asmfile, "r%d;%d;0;",
1098 TYPE_SYMTAB_ADDRESS (type),
1099 int_size_in_bytes (TREE_TYPE (type)));
1100 CHARS (15); /* The number is probably incorrect here. */
1102 else
1104 /* Output a complex integer type as a structure,
1105 pending some other way to do it. */
1106 fprintf (asmfile, "s%d", int_size_in_bytes (type));
1108 fprintf (asmfile, "real:");
1109 CHARS (10);
1110 dbxout_type (TREE_TYPE (type), 0, 0);
1111 fprintf (asmfile, ",%d,%d;",
1112 0, TYPE_PRECISION (TREE_TYPE (type)));
1113 CHARS (8);
1114 fprintf (asmfile, "imag:");
1115 CHARS (5);
1116 dbxout_type (TREE_TYPE (type), 0, 0);
1117 fprintf (asmfile, ",%d,%d;;",
1118 TYPE_PRECISION (TREE_TYPE (type)),
1119 TYPE_PRECISION (TREE_TYPE (type)));
1120 CHARS (9);
1122 break;
1124 case SET_TYPE:
1125 if (use_gnu_debug_info_extensions)
1127 have_used_extensions = 1;
1128 fprintf (asmfile, "@s%d;",
1129 BITS_PER_UNIT * int_size_in_bytes (type));
1130 /* Check if a bitstring type, which in Chill is
1131 different from a [power]set. */
1132 if (TYPE_STRING_FLAG (type))
1133 fprintf (asmfile, "@S;");
1135 putc ('S', asmfile);
1136 CHARS (1);
1137 dbxout_type (TYPE_DOMAIN (type), 0, 0);
1138 break;
1140 case ARRAY_TYPE:
1141 /* Output "a" followed by a range type definition
1142 for the index type of the array
1143 followed by a reference to the target-type.
1144 ar1;0;N;M for a C array of type M and size N+1. */
1145 /* Check if a character string type, which in Chill is
1146 different from an array of characters. */
1147 if (TYPE_STRING_FLAG (type) && use_gnu_debug_info_extensions)
1149 have_used_extensions = 1;
1150 fprintf (asmfile, "@S;");
1152 tem = TYPE_DOMAIN (type);
1153 if (tem == NULL)
1154 fprintf (asmfile, "ar%d;0;-1;",
1155 TYPE_SYMTAB_ADDRESS (integer_type_node));
1156 else
1158 fprintf (asmfile, "a");
1159 dbxout_range_type (tem);
1161 CHARS (17);
1162 dbxout_type (TREE_TYPE (type), 0, 0);
1163 break;
1165 case RECORD_TYPE:
1166 case UNION_TYPE:
1167 case QUAL_UNION_TYPE:
1169 int i, n_baseclasses = 0;
1171 if (TYPE_BINFO (type) != 0 && TYPE_BINFO_BASETYPES (type) != 0)
1172 n_baseclasses = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (type));
1174 /* Output a structure type. We must use the same test here as we
1175 use in the DBX_NO_XREFS case above. */
1176 if ((TYPE_NAME (type) != 0
1177 && ! (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1178 && DECL_IGNORED_P (TYPE_NAME (type)))
1179 && !full)
1180 || TYPE_SIZE (type) == 0
1181 /* No way in DBX fmt to describe a variable size. */
1182 || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
1184 /* If the type is just a cross reference, output one
1185 and mark the type as partially described.
1186 If it later becomes defined, we will output
1187 its real definition.
1188 If the type has a name, don't nest its definition within
1189 another type's definition; instead, output an xref
1190 and let the definition come when the name is defined. */
1191 fprintf (asmfile, (TREE_CODE (type) == RECORD_TYPE) ? "xs" : "xu");
1192 CHARS (3);
1193 #if 0 /* This assertion is legitimately false in C++. */
1194 /* We shouldn't be outputting a reference to a type before its
1195 definition unless the type has a tag name.
1196 A typedef name without a tag name should be impossible. */
1197 if (TREE_CODE (TYPE_NAME (type)) != IDENTIFIER_NODE)
1198 abort ();
1199 #endif
1200 if (TYPE_NAME (type) != 0)
1201 dbxout_type_name (type);
1202 else
1203 fprintf (asmfile, "$$%d", anonymous_type_number++);
1204 fprintf (asmfile, ":");
1205 typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_XREF;
1206 break;
1209 /* Identify record or union, and print its size. */
1210 fprintf (asmfile, (TREE_CODE (type) == RECORD_TYPE) ? "s%d" : "u%d",
1211 int_size_in_bytes (type));
1213 if (use_gnu_debug_info_extensions)
1215 if (n_baseclasses)
1217 have_used_extensions = 1;
1218 fprintf (asmfile, "!%d,", n_baseclasses);
1219 CHARS (8);
1222 for (i = 0; i < n_baseclasses; i++)
1224 tree child = TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (type)), i);
1225 if (use_gnu_debug_info_extensions)
1227 have_used_extensions = 1;
1228 putc (TREE_VIA_VIRTUAL (child) ? '1'
1229 : '0',
1230 asmfile);
1231 putc (TREE_VIA_PUBLIC (child) ? '2'
1232 : '0',
1233 asmfile);
1234 fprintf (asmfile, "%d,",
1235 TREE_INT_CST_LOW (BINFO_OFFSET (child)) * BITS_PER_UNIT);
1236 CHARS (15);
1237 dbxout_type (BINFO_TYPE (child), 0, 0);
1238 putc (';', asmfile);
1240 else
1242 /* Print out the base class information with fields
1243 which have the same names at the types they hold. */
1244 dbxout_type_name (BINFO_TYPE (child));
1245 putc (':', asmfile);
1246 dbxout_type (BINFO_TYPE (child), full, 0);
1247 fprintf (asmfile, ",%d,%d;",
1248 TREE_INT_CST_LOW (BINFO_OFFSET (child)) * BITS_PER_UNIT,
1249 TREE_INT_CST_LOW (DECL_SIZE (TYPE_NAME (BINFO_TYPE (child)))) * BITS_PER_UNIT);
1250 CHARS (20);
1255 CHARS (11);
1257 /* Write out the field declarations. */
1258 dbxout_type_fields (type);
1259 if (use_gnu_debug_info_extensions && TYPE_METHODS (type) != NULL_TREE)
1261 have_used_extensions = 1;
1262 dbxout_type_methods (type);
1264 putc (';', asmfile);
1266 if (use_gnu_debug_info_extensions && TREE_CODE (type) == RECORD_TYPE
1267 /* Avoid the ~ if we don't really need it--it confuses dbx. */
1268 && TYPE_VFIELD (type))
1270 have_used_extensions = 1;
1272 /* Tell GDB+ that it may keep reading. */
1273 putc ('~', asmfile);
1275 /* We need to write out info about what field this class
1276 uses as its "main" vtable pointer field, because if this
1277 field is inherited from a base class, GDB cannot necessarily
1278 figure out which field it's using in time. */
1279 if (TYPE_VFIELD (type))
1281 putc ('%', asmfile);
1282 dbxout_type (DECL_FCONTEXT (TYPE_VFIELD (type)), 0, 0);
1284 putc (';', asmfile);
1285 CHARS (3);
1287 break;
1289 case ENUMERAL_TYPE:
1290 /* We must use the same test here as we use in the DBX_NO_XREFS case
1291 above. We simplify it a bit since an enum will never have a variable
1292 size. */
1293 if ((TYPE_NAME (type) != 0
1294 && ! (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1295 && DECL_IGNORED_P (TYPE_NAME (type)))
1296 && !full)
1297 || TYPE_SIZE (type) == 0)
1299 fprintf (asmfile, "xe");
1300 CHARS (3);
1301 dbxout_type_name (type);
1302 typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_XREF;
1303 fprintf (asmfile, ":");
1304 return;
1306 #ifdef DBX_OUTPUT_ENUM
1307 DBX_OUTPUT_ENUM (asmfile, type);
1308 #else
1309 if (use_gnu_debug_info_extensions
1310 && TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node))
1311 fprintf (asmfile, "@s%d;", TYPE_PRECISION (type));
1312 putc ('e', asmfile);
1313 CHARS (1);
1314 for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem))
1316 fprintf (asmfile, "%s:", IDENTIFIER_POINTER (TREE_PURPOSE (tem)));
1317 if (TREE_INT_CST_HIGH (TREE_VALUE (tem)) == 0)
1318 fprintf (asmfile, "%lu",
1319 (unsigned long) TREE_INT_CST_LOW (TREE_VALUE (tem)));
1320 else if (TREE_INT_CST_HIGH (TREE_VALUE (tem)) == -1
1321 && TREE_INT_CST_LOW (TREE_VALUE (tem)) < 0)
1322 fprintf (asmfile, "%ld",
1323 (long) TREE_INT_CST_LOW (TREE_VALUE (tem)));
1324 else
1325 print_int_cst_octal (TREE_VALUE (tem));
1326 fprintf (asmfile, ",");
1327 CHARS (20 + IDENTIFIER_LENGTH (TREE_PURPOSE (tem)));
1328 if (TREE_CHAIN (tem) != 0)
1329 CONTIN;
1331 putc (';', asmfile);
1332 CHARS (1);
1333 #endif
1334 break;
1336 case POINTER_TYPE:
1337 putc ('*', asmfile);
1338 CHARS (1);
1339 dbxout_type (TREE_TYPE (type), 0, 0);
1340 break;
1342 case METHOD_TYPE:
1343 if (use_gnu_debug_info_extensions)
1345 have_used_extensions = 1;
1346 putc ('#', asmfile);
1347 CHARS (1);
1348 if (flag_minimal_debug && !show_arg_types)
1350 /* Normally, just output the return type.
1351 The argument types are encoded in the method name. */
1352 putc ('#', asmfile);
1353 dbxout_type (TREE_TYPE (type), 0, 0);
1354 putc (';', asmfile);
1355 CHARS (1);
1357 else
1359 /* When outputting destructors, we need to write
1360 the argument types out longhand. */
1361 dbxout_type (TYPE_METHOD_BASETYPE (type), 0, 0);
1362 putc (',', asmfile);
1363 CHARS (1);
1364 dbxout_type (TREE_TYPE (type), 0, 0);
1365 dbxout_args (TYPE_ARG_TYPES (type));
1366 putc (';', asmfile);
1367 CHARS (1);
1370 else
1372 /* Treat it as a function type. */
1373 dbxout_type (TREE_TYPE (type), 0, 0);
1375 break;
1377 case OFFSET_TYPE:
1378 if (use_gnu_debug_info_extensions)
1380 have_used_extensions = 1;
1381 putc ('@', asmfile);
1382 CHARS (1);
1383 dbxout_type (TYPE_OFFSET_BASETYPE (type), 0, 0);
1384 putc (',', asmfile);
1385 CHARS (1);
1386 dbxout_type (TREE_TYPE (type), 0, 0);
1388 else
1390 /* Should print as an int, because it is really
1391 just an offset. */
1392 dbxout_type (integer_type_node, 0, 0);
1394 break;
1396 case REFERENCE_TYPE:
1397 if (use_gnu_debug_info_extensions)
1398 have_used_extensions = 1;
1399 putc (use_gnu_debug_info_extensions ? '&' : '*', asmfile);
1400 CHARS (1);
1401 dbxout_type (TREE_TYPE (type), 0, 0);
1402 break;
1404 case FUNCTION_TYPE:
1405 putc ('f', asmfile);
1406 CHARS (1);
1407 dbxout_type (TREE_TYPE (type), 0, 0);
1408 break;
1410 default:
1411 abort ();
1415 /* Print the value of integer constant C, in octal,
1416 handling double precision. */
1418 static void
1419 print_int_cst_octal (c)
1420 tree c;
1422 unsigned HOST_WIDE_INT high = TREE_INT_CST_HIGH (c);
1423 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (c);
1424 int excess = (3 - (HOST_BITS_PER_WIDE_INT % 3));
1425 int width = TYPE_PRECISION (TREE_TYPE (c));
1427 /* GDB wants constants with no extra leading "1" bits, so
1428 we need to remove any sign-extension that might be
1429 present. */
1430 if (width == HOST_BITS_PER_WIDE_INT * 2)
1432 else if (width > HOST_BITS_PER_WIDE_INT)
1433 high &= (((HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT)) - 1);
1434 else if (width == HOST_BITS_PER_WIDE_INT)
1435 high = 0;
1436 else
1437 high = 0, low &= (((HOST_WIDE_INT) 1 << width) - 1);
1439 fprintf (asmfile, "0");
1441 if (excess == 3)
1443 print_octal (high, HOST_BITS_PER_WIDE_INT / 3);
1444 print_octal (low, HOST_BITS_PER_WIDE_INT / 3);
1446 else
1448 unsigned HOST_WIDE_INT beg = high >> excess;
1449 unsigned HOST_WIDE_INT middle
1450 = ((high & (((HOST_WIDE_INT) 1 << excess) - 1)) << (3 - excess)
1451 | (low >> (HOST_BITS_PER_WIDE_INT / 3 * 3)));
1452 unsigned HOST_WIDE_INT end
1453 = low & (((unsigned HOST_WIDE_INT) 1
1454 << (HOST_BITS_PER_WIDE_INT / 3 * 3))
1455 - 1);
1457 fprintf (asmfile, "%o%01o", beg, middle);
1458 print_octal (end, HOST_BITS_PER_WIDE_INT / 3);
1462 static void
1463 print_octal (value, digits)
1464 unsigned HOST_WIDE_INT value;
1465 int digits;
1467 int i;
1469 for (i = digits - 1; i >= 0; i--)
1470 fprintf (asmfile, "%01o", ((value >> (3 * i)) & 7));
1473 /* Output the name of type TYPE, with no punctuation.
1474 Such names can be set up either by typedef declarations
1475 or by struct, enum and union tags. */
1477 static void
1478 dbxout_type_name (type)
1479 register tree type;
1481 tree t;
1482 if (TYPE_NAME (type) == 0)
1483 abort ();
1484 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
1486 t = TYPE_NAME (type);
1488 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
1490 t = DECL_NAME (TYPE_NAME (type));
1492 else
1493 abort ();
1495 fprintf (asmfile, "%s", IDENTIFIER_POINTER (t));
1496 CHARS (IDENTIFIER_LENGTH (t));
1499 /* Output a .stabs for the symbol defined by DECL,
1500 which must be a ..._DECL node in the normal namespace.
1501 It may be a CONST_DECL, a FUNCTION_DECL, a PARM_DECL or a VAR_DECL.
1502 LOCAL is nonzero if the scope is less than the entire file. */
1504 void
1505 dbxout_symbol (decl, local)
1506 tree decl;
1507 int local;
1509 tree type = TREE_TYPE (decl);
1510 tree context = NULL_TREE;
1512 /* Cast avoids warning in old compilers. */
1513 current_sym_code = (STAB_CODE_TYPE) 0;
1514 current_sym_value = 0;
1515 current_sym_addr = 0;
1517 /* Ignore nameless syms, but don't ignore type tags. */
1519 if ((DECL_NAME (decl) == 0 && TREE_CODE (decl) != TYPE_DECL)
1520 || DECL_IGNORED_P (decl))
1521 return;
1523 dbxout_prepare_symbol (decl);
1525 /* The output will always start with the symbol name,
1526 so always count that in the length-output-so-far. */
1528 if (DECL_NAME (decl) != 0)
1529 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (decl));
1531 switch (TREE_CODE (decl))
1533 case CONST_DECL:
1534 /* Enum values are defined by defining the enum type. */
1535 break;
1537 case FUNCTION_DECL:
1538 if (DECL_RTL (decl) == 0)
1539 return;
1540 if (DECL_EXTERNAL (decl))
1541 break;
1542 /* Don't mention a nested function under its parent. */
1543 context = decl_function_context (decl);
1544 if (context == current_function_decl)
1545 break;
1546 if (GET_CODE (DECL_RTL (decl)) != MEM
1547 || GET_CODE (XEXP (DECL_RTL (decl), 0)) != SYMBOL_REF)
1548 break;
1549 FORCE_TEXT;
1551 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
1552 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
1553 TREE_PUBLIC (decl) ? 'F' : 'f');
1555 current_sym_code = N_FUN;
1556 current_sym_addr = XEXP (DECL_RTL (decl), 0);
1558 if (TREE_TYPE (type))
1559 dbxout_type (TREE_TYPE (type), 0, 0);
1560 else
1561 dbxout_type (void_type_node, 0, 0);
1563 /* For a nested function, when that function is compiled,
1564 mention the containing function name
1565 as well as (since dbx wants it) our own assembler-name. */
1566 if (context != 0)
1567 fprintf (asmfile, ",%s,%s",
1568 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
1569 IDENTIFIER_POINTER (DECL_NAME (context)));
1571 dbxout_finish_symbol (decl);
1572 break;
1574 case TYPE_DECL:
1575 #if 0
1576 /* This seems all wrong. Outputting most kinds of types gives no name
1577 at all. A true definition gives no name; a cross-ref for a
1578 structure can give the tag name, but not a type name.
1579 It seems that no typedef name is defined by outputting a type. */
1581 /* If this typedef name was defined by outputting the type,
1582 don't duplicate it. */
1583 if (typevec[TYPE_SYMTAB_ADDRESS (type)] == TYPE_DEFINED
1584 && TYPE_NAME (TREE_TYPE (decl)) == decl)
1585 return;
1586 #endif
1587 /* Don't output the same typedef twice.
1588 And don't output what language-specific stuff doesn't want output. */
1589 if (TREE_ASM_WRITTEN (decl) || TYPE_DECL_SUPPRESS_DEBUG (decl))
1590 return;
1592 FORCE_TEXT;
1595 int tag_needed = 1;
1596 int did_output = 0;
1598 if (DECL_NAME (decl))
1600 /* Nonzero means we must output a tag as well as a typedef. */
1601 tag_needed = 0;
1603 /* Handle the case of a C++ structure or union
1604 where the TYPE_NAME is a TYPE_DECL
1605 which gives both a typedef name and a tag. */
1606 /* dbx requires the tag first and the typedef second. */
1607 if ((TREE_CODE (type) == RECORD_TYPE
1608 || TREE_CODE (type) == UNION_TYPE
1609 || TREE_CODE (type) == QUAL_UNION_TYPE)
1610 && TYPE_NAME (type) == decl
1611 && !(use_gnu_debug_info_extensions && have_used_extensions)
1612 && !TREE_ASM_WRITTEN (TYPE_NAME (type))
1613 /* Distinguish the implicit typedefs of C++
1614 from explicit ones that might be found in C. */
1615 && (!strcmp (lang_identify (), "cplusplus")
1616 /* The following line maybe unnecessary;
1617 in 2.6, try removing it. */
1618 || DECL_SOURCE_LINE (decl) == 0))
1620 tree name = TYPE_NAME (type);
1621 if (TREE_CODE (name) == TYPE_DECL)
1622 name = DECL_NAME (name);
1624 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1625 current_sym_value = 0;
1626 current_sym_addr = 0;
1627 current_sym_nchars = 2 + IDENTIFIER_LENGTH (name);
1629 fprintf (asmfile, "%s \"%s:T", ASM_STABS_OP,
1630 IDENTIFIER_POINTER (name));
1631 dbxout_type (type, 1, 0);
1632 dbxout_finish_symbol (NULL_TREE);
1635 /* Output typedef name. */
1636 fprintf (asmfile, "%s \"%s:", ASM_STABS_OP,
1637 IDENTIFIER_POINTER (DECL_NAME (decl)));
1639 /* Short cut way to output a tag also. */
1640 if ((TREE_CODE (type) == RECORD_TYPE
1641 || TREE_CODE (type) == UNION_TYPE
1642 || TREE_CODE (type) == QUAL_UNION_TYPE)
1643 && TYPE_NAME (type) == decl)
1645 if (use_gnu_debug_info_extensions && have_used_extensions)
1647 putc ('T', asmfile);
1648 TREE_ASM_WRITTEN (TYPE_NAME (type)) = 1;
1650 #if 0 /* Now we generate the tag for this case up above. */
1651 else
1652 tag_needed = 1;
1653 #endif
1656 putc ('t', asmfile);
1657 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1659 dbxout_type (type, 1, 0);
1660 dbxout_finish_symbol (decl);
1661 did_output = 1;
1664 /* Don't output a tag if this is an incomplete type (TYPE_SIZE is
1665 zero). This prevents the sun4 Sun OS 4.x dbx from crashing. */
1667 if (tag_needed && TYPE_NAME (type) != 0 && TYPE_SIZE (type) != 0
1668 && !TREE_ASM_WRITTEN (TYPE_NAME (type)))
1670 /* For a TYPE_DECL with no name, but the type has a name,
1671 output a tag.
1672 This is what represents `struct foo' with no typedef. */
1673 /* In C++, the name of a type is the corresponding typedef.
1674 In C, it is an IDENTIFIER_NODE. */
1675 tree name = TYPE_NAME (type);
1676 if (TREE_CODE (name) == TYPE_DECL)
1677 name = DECL_NAME (name);
1679 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1680 current_sym_value = 0;
1681 current_sym_addr = 0;
1682 current_sym_nchars = 2 + IDENTIFIER_LENGTH (name);
1684 fprintf (asmfile, "%s \"%s:T", ASM_STABS_OP,
1685 IDENTIFIER_POINTER (name));
1686 dbxout_type (type, 1, 0);
1687 dbxout_finish_symbol (NULL_TREE);
1688 did_output = 1;
1691 /* If an enum type has no name, it cannot be referred to,
1692 but we must output it anyway, since the enumeration constants
1693 can be referred to. */
1694 if (!did_output && TREE_CODE (type) == ENUMERAL_TYPE)
1696 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1697 current_sym_value = 0;
1698 current_sym_addr = 0;
1699 current_sym_nchars = 2;
1701 /* Some debuggers fail when given NULL names, so give this a
1702 harmless name of ` '. */
1703 fprintf (asmfile, "%s \" :T", ASM_STABS_OP);
1704 dbxout_type (type, 1, 0);
1705 dbxout_finish_symbol (NULL_TREE);
1708 /* Prevent duplicate output of a typedef. */
1709 TREE_ASM_WRITTEN (decl) = 1;
1710 break;
1713 case PARM_DECL:
1714 /* Parm decls go in their own separate chains
1715 and are output by dbxout_reg_parms and dbxout_parms. */
1716 abort ();
1718 case RESULT_DECL:
1719 /* Named return value, treat like a VAR_DECL. */
1720 case VAR_DECL:
1721 if (DECL_RTL (decl) == 0)
1722 return;
1723 /* Don't mention a variable that is external.
1724 Let the file that defines it describe it. */
1725 if (DECL_EXTERNAL (decl))
1726 break;
1728 /* If the variable is really a constant
1729 and not written in memory, inform the debugger. */
1730 if (TREE_STATIC (decl) && TREE_READONLY (decl)
1731 && DECL_INITIAL (decl) != 0
1732 && ! TREE_ASM_WRITTEN (decl)
1733 && (DECL_FIELD_CONTEXT (decl) == NULL_TREE
1734 || TREE_CODE (DECL_FIELD_CONTEXT (decl)) == BLOCK))
1736 if (TREE_PUBLIC (decl) == 0)
1738 /* The sun4 assembler does not grok this. */
1739 char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
1740 if (TREE_CODE (TREE_TYPE (decl)) == INTEGER_TYPE
1741 || TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE)
1743 HOST_WIDE_INT ival = TREE_INT_CST_LOW (DECL_INITIAL (decl));
1744 #ifdef DBX_OUTPUT_CONSTANT_SYMBOL
1745 DBX_OUTPUT_CONSTANT_SYMBOL (asmfile, name, ival);
1746 #else
1747 fprintf (asmfile, "%s \"%s:c=i%d\",0x%x,0,0,0\n",
1748 ASM_STABS_OP, name, ival, N_LSYM);
1749 #endif
1750 return;
1752 else if (TREE_CODE (TREE_TYPE (decl)) == REAL_TYPE)
1754 /* don't know how to do this yet. */
1756 break;
1758 /* else it is something we handle like a normal variable. */
1761 DECL_RTL (decl) = eliminate_regs (DECL_RTL (decl), 0, NULL_RTX);
1762 #ifdef LEAF_REG_REMAP
1763 if (leaf_function)
1764 leaf_renumber_regs_insn (DECL_RTL (decl));
1765 #endif
1767 dbxout_symbol_location (decl, type, 0, DECL_RTL (decl));
1771 /* Output the stab for DECL, a VAR_DECL, RESULT_DECL or PARM_DECL.
1772 Add SUFFIX to its name, if SUFFIX is not 0.
1773 Describe the variable as residing in HOME
1774 (usually HOME is DECL_RTL (DECL), but not always). */
1776 static void
1777 dbxout_symbol_location (decl, type, suffix, home)
1778 tree decl, type;
1779 char *suffix;
1780 rtx home;
1782 int letter = 0;
1783 int regno = -1;
1785 /* Don't mention a variable at all
1786 if it was completely optimized into nothingness.
1788 If the decl was from an inline function, then it's rtl
1789 is not identically the rtl that was used in this
1790 particular compilation. */
1791 if (GET_CODE (home) == REG)
1793 regno = REGNO (home);
1794 if (regno >= FIRST_PSEUDO_REGISTER)
1795 return;
1797 else if (GET_CODE (home) == SUBREG)
1799 rtx value = home;
1800 int offset = 0;
1801 while (GET_CODE (value) == SUBREG)
1803 offset += SUBREG_WORD (value);
1804 value = SUBREG_REG (value);
1806 if (GET_CODE (value) == REG)
1808 regno = REGNO (value);
1809 if (regno >= FIRST_PSEUDO_REGISTER)
1810 return;
1811 regno += offset;
1813 alter_subreg (home);
1816 /* The kind-of-variable letter depends on where
1817 the variable is and on the scope of its name:
1818 G and N_GSYM for static storage and global scope,
1819 S for static storage and file scope,
1820 V for static storage and local scope,
1821 for those two, use N_LCSYM if data is in bss segment,
1822 N_STSYM if in data segment, N_FUN otherwise.
1823 (We used N_FUN originally, then changed to N_STSYM
1824 to please GDB. However, it seems that confused ld.
1825 Now GDB has been fixed to like N_FUN, says Kingdon.)
1826 no letter at all, and N_LSYM, for auto variable,
1827 r and N_RSYM for register variable. */
1829 if (GET_CODE (home) == MEM
1830 && GET_CODE (XEXP (home, 0)) == SYMBOL_REF)
1832 if (TREE_PUBLIC (decl))
1834 letter = 'G';
1835 current_sym_code = N_GSYM;
1837 else
1839 current_sym_addr = XEXP (home, 0);
1841 letter = decl_function_context (decl) ? 'V' : 'S';
1843 if (!DECL_INITIAL (decl))
1844 current_sym_code = N_LCSYM;
1845 else if (DECL_IN_TEXT_SECTION (decl))
1846 /* This is not quite right, but it's the closest
1847 of all the codes that Unix defines. */
1848 current_sym_code = DBX_STATIC_CONST_VAR_CODE;
1849 else
1851 /* Ultrix `as' seems to need this. */
1852 #ifdef DBX_STATIC_STAB_DATA_SECTION
1853 data_section ();
1854 #endif
1855 current_sym_code = N_STSYM;
1859 else if (regno >= 0)
1861 letter = 'r';
1862 current_sym_code = N_RSYM;
1863 current_sym_value = DBX_REGISTER_NUMBER (regno);
1865 else if (GET_CODE (home) == MEM
1866 && (GET_CODE (XEXP (home, 0)) == MEM
1867 || (GET_CODE (XEXP (home, 0)) == REG
1868 && REGNO (XEXP (home, 0)) != HARD_FRAME_POINTER_REGNUM)))
1869 /* If the value is indirect by memory or by a register
1870 that isn't the frame pointer
1871 then it means the object is variable-sized and address through
1872 that register or stack slot. DBX has no way to represent this
1873 so all we can do is output the variable as a pointer.
1874 If it's not a parameter, ignore it.
1875 (VAR_DECLs like this can be made by integrate.c.) */
1877 if (GET_CODE (XEXP (home, 0)) == REG)
1879 letter = 'r';
1880 current_sym_code = N_RSYM;
1881 current_sym_value = DBX_REGISTER_NUMBER (REGNO (XEXP (home, 0)));
1883 else
1885 current_sym_code = N_LSYM;
1886 /* RTL looks like (MEM (MEM (PLUS (REG...) (CONST_INT...)))).
1887 We want the value of that CONST_INT. */
1888 current_sym_value
1889 = DEBUGGER_AUTO_OFFSET (XEXP (XEXP (home, 0), 0));
1892 /* Effectively do build_pointer_type, but don't cache this type,
1893 since it might be temporary whereas the type it points to
1894 might have been saved for inlining. */
1895 /* Don't use REFERENCE_TYPE because dbx can't handle that. */
1896 type = make_node (POINTER_TYPE);
1897 TREE_TYPE (type) = TREE_TYPE (decl);
1899 else if (GET_CODE (home) == MEM
1900 && GET_CODE (XEXP (home, 0)) == REG)
1902 current_sym_code = N_LSYM;
1903 current_sym_value = DEBUGGER_AUTO_OFFSET (XEXP (home, 0));
1905 else if (GET_CODE (home) == MEM
1906 && GET_CODE (XEXP (home, 0)) == PLUS
1907 && GET_CODE (XEXP (XEXP (home, 0), 1)) == CONST_INT)
1909 current_sym_code = N_LSYM;
1910 /* RTL looks like (MEM (PLUS (REG...) (CONST_INT...)))
1911 We want the value of that CONST_INT. */
1912 current_sym_value = DEBUGGER_AUTO_OFFSET (XEXP (home, 0));
1914 else if (GET_CODE (home) == MEM
1915 && GET_CODE (XEXP (home, 0)) == CONST)
1917 /* Handle an obscure case which can arise when optimizing and
1918 when there are few available registers. (This is *always*
1919 the case for i386/i486 targets). The RTL looks like
1920 (MEM (CONST ...)) even though this variable is a local `auto'
1921 or a local `register' variable. In effect, what has happened
1922 is that the reload pass has seen that all assignments and
1923 references for one such a local variable can be replaced by
1924 equivalent assignments and references to some static storage
1925 variable, thereby avoiding the need for a register. In such
1926 cases we're forced to lie to debuggers and tell them that
1927 this variable was itself `static'. */
1928 current_sym_code = N_LCSYM;
1929 letter = 'V';
1930 current_sym_addr = XEXP (XEXP (home, 0), 0);
1932 else if (GET_CODE (home) == CONCAT)
1934 tree subtype = TREE_TYPE (type);
1936 /* If the variable's storage is in two parts,
1937 output each as a separate stab with a modified name. */
1938 if (WORDS_BIG_ENDIAN)
1939 dbxout_symbol_location (decl, subtype, "$imag", XEXP (home, 0));
1940 else
1941 dbxout_symbol_location (decl, subtype, "$real", XEXP (home, 0));
1943 /* Cast avoids warning in old compilers. */
1944 current_sym_code = (STAB_CODE_TYPE) 0;
1945 current_sym_value = 0;
1946 current_sym_addr = 0;
1947 dbxout_prepare_symbol (decl);
1949 if (WORDS_BIG_ENDIAN)
1950 dbxout_symbol_location (decl, subtype, "$real", XEXP (home, 1));
1951 else
1952 dbxout_symbol_location (decl, subtype, "$imag", XEXP (home, 1));
1953 return;
1955 else
1956 /* Address might be a MEM, when DECL is a variable-sized object.
1957 Or it might be const0_rtx, meaning previous passes
1958 want us to ignore this variable. */
1959 return;
1961 /* Ok, start a symtab entry and output the variable name. */
1962 FORCE_TEXT;
1964 #ifdef DBX_STATIC_BLOCK_START
1965 DBX_STATIC_BLOCK_START (asmfile, current_sym_code);
1966 #endif
1968 dbxout_symbol_name (decl, suffix, letter);
1969 dbxout_type (type, 0, 0);
1970 dbxout_finish_symbol (decl);
1972 #ifdef DBX_STATIC_BLOCK_END
1973 DBX_STATIC_BLOCK_END (asmfile, current_sym_code);
1974 #endif
1977 /* Output the symbol name of DECL for a stabs, with suffix SUFFIX.
1978 Then output LETTER to indicate the kind of location the symbol has. */
1980 static void
1981 dbxout_symbol_name (decl, suffix, letter)
1982 tree decl;
1983 char *suffix;
1984 int letter;
1986 /* One slight hitch: if this is a VAR_DECL which is a static
1987 class member, we must put out the mangled name instead of the
1988 DECL_NAME. */
1990 char *name;
1991 /* Note also that static member (variable) names DO NOT begin
1992 with underscores in .stabs directives. */
1993 if (DECL_LANG_SPECIFIC (decl))
1994 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
1995 else
1996 name = IDENTIFIER_POINTER (DECL_NAME (decl));
1997 if (name == 0)
1998 name = "(anon)";
1999 fprintf (asmfile, "%s \"%s%s:", ASM_STABS_OP, name,
2000 (suffix ? suffix : ""));
2002 if (letter) putc (letter, asmfile);
2005 static void
2006 dbxout_prepare_symbol (decl)
2007 tree decl;
2009 #ifdef WINNING_GDB
2010 char *filename = DECL_SOURCE_FILE (decl);
2012 dbxout_source_file (asmfile, filename);
2013 #endif
2016 static void
2017 dbxout_finish_symbol (sym)
2018 tree sym;
2020 #ifdef DBX_FINISH_SYMBOL
2021 DBX_FINISH_SYMBOL (sym);
2022 #else
2023 int line = 0;
2024 if (use_gnu_debug_info_extensions && sym != 0)
2025 line = DECL_SOURCE_LINE (sym);
2027 fprintf (asmfile, "\",%d,0,%d,", current_sym_code, line);
2028 if (current_sym_addr)
2029 output_addr_const (asmfile, current_sym_addr);
2030 else
2031 fprintf (asmfile, "%d", current_sym_value);
2032 putc ('\n', asmfile);
2033 #endif
2036 /* Output definitions of all the decls in a chain. */
2038 void
2039 dbxout_syms (syms)
2040 tree syms;
2042 while (syms)
2044 dbxout_symbol (syms, 1);
2045 syms = TREE_CHAIN (syms);
2049 /* The following two functions output definitions of function parameters.
2050 Each parameter gets a definition locating it in the parameter list.
2051 Each parameter that is a register variable gets a second definition
2052 locating it in the register.
2054 Printing or argument lists in gdb uses the definitions that
2055 locate in the parameter list. But reference to the variable in
2056 expressions uses preferentially the definition as a register. */
2058 /* Output definitions, referring to storage in the parmlist,
2059 of all the parms in PARMS, which is a chain of PARM_DECL nodes. */
2061 void
2062 dbxout_parms (parms)
2063 tree parms;
2065 for (; parms; parms = TREE_CHAIN (parms))
2066 if (DECL_NAME (parms) && TREE_TYPE (parms) != error_mark_node)
2068 dbxout_prepare_symbol (parms);
2070 /* Perform any necessary register eliminations on the parameter's rtl,
2071 so that the debugging output will be accurate. */
2072 DECL_INCOMING_RTL (parms)
2073 = eliminate_regs (DECL_INCOMING_RTL (parms), 0, NULL_RTX);
2074 DECL_RTL (parms) = eliminate_regs (DECL_RTL (parms), 0, NULL_RTX);
2075 #ifdef LEAF_REG_REMAP
2076 if (leaf_function)
2078 leaf_renumber_regs_insn (DECL_INCOMING_RTL (parms));
2079 leaf_renumber_regs_insn (DECL_RTL (parms));
2081 #endif
2083 if (PARM_PASSED_IN_MEMORY (parms))
2085 rtx addr = XEXP (DECL_INCOMING_RTL (parms), 0);
2087 /* ??? Here we assume that the parm address is indexed
2088 off the frame pointer or arg pointer.
2089 If that is not true, we produce meaningless results,
2090 but do not crash. */
2091 if (GET_CODE (addr) == PLUS
2092 && GET_CODE (XEXP (addr, 1)) == CONST_INT)
2093 current_sym_value = INTVAL (XEXP (addr, 1));
2094 else
2095 current_sym_value = 0;
2097 current_sym_code = N_PSYM;
2098 current_sym_addr = 0;
2100 FORCE_TEXT;
2101 if (DECL_NAME (parms))
2103 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
2105 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
2106 IDENTIFIER_POINTER (DECL_NAME (parms)),
2107 DBX_MEMPARM_STABS_LETTER);
2109 else
2111 current_sym_nchars = 8;
2112 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
2113 DBX_MEMPARM_STABS_LETTER);
2116 if (GET_CODE (DECL_RTL (parms)) == REG
2117 && REGNO (DECL_RTL (parms)) >= 0
2118 && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
2119 dbxout_type (DECL_ARG_TYPE (parms), 0, 0);
2120 else
2122 int original_value = current_sym_value;
2124 /* This is the case where the parm is passed as an int or double
2125 and it is converted to a char, short or float and stored back
2126 in the parmlist. In this case, describe the parm
2127 with the variable's declared type, and adjust the address
2128 if the least significant bytes (which we are using) are not
2129 the first ones. */
2130 #if BYTES_BIG_ENDIAN
2131 if (TREE_TYPE (parms) != DECL_ARG_TYPE (parms))
2132 current_sym_value += (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms)))
2133 - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms))));
2134 #endif
2136 if (GET_CODE (DECL_RTL (parms)) == MEM
2137 && GET_CODE (XEXP (DECL_RTL (parms), 0)) == PLUS
2138 && GET_CODE (XEXP (XEXP (DECL_RTL (parms), 0), 1)) == CONST_INT
2139 && INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1)) == current_sym_value)
2140 dbxout_type (TREE_TYPE (parms), 0, 0);
2141 else
2143 current_sym_value = original_value;
2144 dbxout_type (DECL_ARG_TYPE (parms), 0, 0);
2147 current_sym_value = DEBUGGER_ARG_OFFSET (current_sym_value, addr);
2148 dbxout_finish_symbol (parms);
2150 else if (GET_CODE (DECL_RTL (parms)) == REG)
2152 rtx best_rtl;
2153 char regparm_letter;
2154 tree parm_type;
2155 /* Parm passed in registers and lives in registers or nowhere. */
2157 current_sym_code = DBX_REGPARM_STABS_CODE;
2158 regparm_letter = DBX_REGPARM_STABS_LETTER;
2159 current_sym_addr = 0;
2161 /* If parm lives in a register, use that register;
2162 pretend the parm was passed there. It would be more consistent
2163 to describe the register where the parm was passed,
2164 but in practice that register usually holds something else.
2166 If we use DECL_RTL, then we must use the declared type of
2167 the variable, not the type that it arrived in. */
2168 if (REGNO (DECL_RTL (parms)) >= 0
2169 && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
2171 best_rtl = DECL_RTL (parms);
2172 parm_type = TREE_TYPE (parms);
2174 /* If the parm lives nowhere, use the register where it was
2175 passed. It is also better to use the declared type here. */
2176 else
2178 best_rtl = DECL_INCOMING_RTL (parms);
2179 parm_type = TREE_TYPE (parms);
2181 current_sym_value = DBX_REGISTER_NUMBER (REGNO (best_rtl));
2183 FORCE_TEXT;
2184 if (DECL_NAME (parms))
2186 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
2187 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
2188 IDENTIFIER_POINTER (DECL_NAME (parms)),
2189 regparm_letter);
2191 else
2193 current_sym_nchars = 8;
2194 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
2195 regparm_letter);
2198 dbxout_type (parm_type, 0, 0);
2199 dbxout_finish_symbol (parms);
2201 else if (GET_CODE (DECL_RTL (parms)) == MEM
2202 && GET_CODE (XEXP (DECL_RTL (parms), 0)) == REG
2203 && REGNO (XEXP (DECL_RTL (parms), 0)) != HARD_FRAME_POINTER_REGNUM
2204 && REGNO (XEXP (DECL_RTL (parms), 0)) != STACK_POINTER_REGNUM
2205 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
2206 && REGNO (XEXP (DECL_RTL (parms), 0)) != ARG_POINTER_REGNUM
2207 #endif
2210 /* Parm was passed via invisible reference.
2211 That is, its address was passed in a register.
2212 Output it as if it lived in that register.
2213 The debugger will know from the type
2214 that it was actually passed by invisible reference. */
2216 char regparm_letter;
2217 /* Parm passed in registers and lives in registers or nowhere. */
2219 current_sym_code = DBX_REGPARM_STABS_CODE;
2220 regparm_letter = DBX_REGPARM_STABS_LETTER;
2222 /* DECL_RTL looks like (MEM (REG...). Get the register number.
2223 If it is an unallocated pseudo-reg, then use the register where
2224 it was passed instead. */
2225 if (REGNO (XEXP (DECL_RTL (parms), 0)) >= 0
2226 && REGNO (XEXP (DECL_RTL (parms), 0)) < FIRST_PSEUDO_REGISTER)
2227 current_sym_value = REGNO (XEXP (DECL_RTL (parms), 0));
2228 else
2229 current_sym_value = REGNO (DECL_INCOMING_RTL (parms));
2231 current_sym_addr = 0;
2233 FORCE_TEXT;
2234 if (DECL_NAME (parms))
2236 current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms)));
2238 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
2239 IDENTIFIER_POINTER (DECL_NAME (parms)),
2240 DBX_REGPARM_STABS_LETTER);
2242 else
2244 current_sym_nchars = 8;
2245 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
2246 DBX_REGPARM_STABS_LETTER);
2249 dbxout_type (TREE_TYPE (parms), 0, 0);
2250 dbxout_finish_symbol (parms);
2252 else if (GET_CODE (DECL_RTL (parms)) == MEM
2253 && XEXP (DECL_RTL (parms), 0) != const0_rtx
2254 /* ??? A constant address for a parm can happen
2255 when the reg it lives in is equiv to a constant in memory.
2256 Should make this not happen, after 2.4. */
2257 && ! CONSTANT_P (XEXP (DECL_RTL (parms), 0)))
2259 /* Parm was passed in registers but lives on the stack. */
2261 current_sym_code = N_PSYM;
2262 /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...))),
2263 in which case we want the value of that CONST_INT,
2264 or (MEM (REG ...)) or (MEM (MEM ...)),
2265 in which case we use a value of zero. */
2266 if (GET_CODE (XEXP (DECL_RTL (parms), 0)) == REG
2267 || GET_CODE (XEXP (DECL_RTL (parms), 0)) == MEM)
2268 current_sym_value = 0;
2269 else
2270 current_sym_value = INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1));
2271 current_sym_addr = 0;
2273 FORCE_TEXT;
2274 if (DECL_NAME (parms))
2276 current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms)));
2278 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
2279 IDENTIFIER_POINTER (DECL_NAME (parms)),
2280 DBX_MEMPARM_STABS_LETTER);
2282 else
2284 current_sym_nchars = 8;
2285 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
2286 DBX_MEMPARM_STABS_LETTER);
2289 current_sym_value
2290 = DEBUGGER_ARG_OFFSET (current_sym_value,
2291 XEXP (DECL_RTL (parms), 0));
2292 dbxout_type (TREE_TYPE (parms), 0, 0);
2293 dbxout_finish_symbol (parms);
2298 /* Output definitions for the places where parms live during the function,
2299 when different from where they were passed, when the parms were passed
2300 in memory.
2302 It is not useful to do this for parms passed in registers
2303 that live during the function in different registers, because it is
2304 impossible to look in the passed register for the passed value,
2305 so we use the within-the-function register to begin with.
2307 PARMS is a chain of PARM_DECL nodes. */
2309 void
2310 dbxout_reg_parms (parms)
2311 tree parms;
2313 for (; parms; parms = TREE_CHAIN (parms))
2314 if (DECL_NAME (parms))
2316 dbxout_prepare_symbol (parms);
2318 /* Report parms that live in registers during the function
2319 but were passed in memory. */
2320 if (GET_CODE (DECL_RTL (parms)) == REG
2321 && REGNO (DECL_RTL (parms)) >= 0
2322 && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER
2323 && PARM_PASSED_IN_MEMORY (parms))
2324 dbxout_symbol_location (parms, TREE_TYPE (parms),
2325 0, DECL_RTL (parms));
2326 else if (GET_CODE (DECL_RTL (parms)) == CONCAT
2327 && PARM_PASSED_IN_MEMORY (parms))
2328 dbxout_symbol_location (parms, TREE_TYPE (parms),
2329 0, DECL_RTL (parms));
2330 /* Report parms that live in memory but not where they were passed. */
2331 else if (GET_CODE (DECL_RTL (parms)) == MEM
2332 && GET_CODE (XEXP (DECL_RTL (parms), 0)) == PLUS
2333 && GET_CODE (XEXP (XEXP (DECL_RTL (parms), 0), 1)) == CONST_INT
2334 && PARM_PASSED_IN_MEMORY (parms)
2335 && ! rtx_equal_p (DECL_RTL (parms), DECL_INCOMING_RTL (parms)))
2337 #if 0 /* ??? It is not clear yet what should replace this. */
2338 int offset = DECL_OFFSET (parms) / BITS_PER_UNIT;
2339 /* A parm declared char is really passed as an int,
2340 so it occupies the least significant bytes.
2341 On a big-endian machine those are not the low-numbered ones. */
2342 #if BYTES_BIG_ENDIAN
2343 if (offset != -1 && TREE_TYPE (parms) != DECL_ARG_TYPE (parms))
2344 offset += (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms)))
2345 - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms))));
2346 #endif
2347 if (INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1)) != offset) {...}
2348 #endif
2349 dbxout_symbol_location (parms, TREE_TYPE (parms),
2350 0, DECL_RTL (parms));
2352 #if 0
2353 else if (GET_CODE (DECL_RTL (parms)) == MEM
2354 && GET_CODE (XEXP (DECL_RTL (parms), 0)) == REG)
2356 /* Parm was passed via invisible reference.
2357 That is, its address was passed in a register.
2358 Output it as if it lived in that register.
2359 The debugger will know from the type
2360 that it was actually passed by invisible reference. */
2362 current_sym_code = N_RSYM;
2364 /* DECL_RTL looks like (MEM (REG...). Get the register number. */
2365 current_sym_value = REGNO (XEXP (DECL_RTL (parms), 0));
2366 current_sym_addr = 0;
2368 FORCE_TEXT;
2369 if (DECL_NAME (parms))
2371 current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms)));
2373 fprintf (asmfile, "%s \"%s:r", ASM_STABS_OP,
2374 IDENTIFIER_POINTER (DECL_NAME (parms)));
2376 else
2378 current_sym_nchars = 8;
2379 fprintf (asmfile, "%s \"(anon):r", ASM_STABS_OP);
2382 dbxout_type (TREE_TYPE (parms), 0, 0);
2383 dbxout_finish_symbol (parms);
2385 #endif
2389 /* Given a chain of ..._TYPE nodes (as come in a parameter list),
2390 output definitions of those names, in raw form */
2392 void
2393 dbxout_args (args)
2394 tree args;
2396 while (args)
2398 putc (',', asmfile);
2399 dbxout_type (TREE_VALUE (args), 0, 0);
2400 CHARS (1);
2401 args = TREE_CHAIN (args);
2405 /* Given a chain of ..._TYPE nodes,
2406 find those which have typedef names and output those names.
2407 This is to ensure those types get output. */
2409 void
2410 dbxout_types (types)
2411 register tree types;
2413 while (types)
2415 if (TYPE_NAME (types)
2416 && TREE_CODE (TYPE_NAME (types)) == TYPE_DECL
2417 && ! TREE_ASM_WRITTEN (TYPE_NAME (types)))
2418 dbxout_symbol (TYPE_NAME (types), 1);
2419 types = TREE_CHAIN (types);
2423 /* Output everything about a symbol block (a BLOCK node
2424 that represents a scope level),
2425 including recursive output of contained blocks.
2427 BLOCK is the BLOCK node.
2428 DEPTH is its depth within containing symbol blocks.
2429 ARGS is usually zero; but for the outermost block of the
2430 body of a function, it is a chain of PARM_DECLs for the function parameters.
2431 We output definitions of all the register parms
2432 as if they were local variables of that block.
2434 If -g1 was used, we count blocks just the same, but output nothing
2435 except for the outermost block.
2437 Actually, BLOCK may be several blocks chained together.
2438 We handle them all in sequence. */
2440 static void
2441 dbxout_block (block, depth, args)
2442 register tree block;
2443 int depth;
2444 tree args;
2446 int blocknum;
2448 while (block)
2450 /* Ignore blocks never expanded or otherwise marked as real. */
2451 if (TREE_USED (block))
2453 #ifndef DBX_LBRAC_FIRST
2454 /* In dbx format, the syms of a block come before the N_LBRAC. */
2455 if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
2456 dbxout_syms (BLOCK_VARS (block));
2457 if (args)
2458 dbxout_reg_parms (args);
2459 #endif
2461 /* Now output an N_LBRAC symbol to represent the beginning of
2462 the block. Use the block's tree-walk order to generate
2463 the assembler symbols LBBn and LBEn
2464 that final will define around the code in this block. */
2465 if (depth > 0 && debug_info_level != DINFO_LEVEL_TERSE)
2467 char buf[20];
2468 blocknum = next_block_number++;
2469 ASM_GENERATE_INTERNAL_LABEL (buf, "LBB", blocknum);
2471 if (BLOCK_HANDLER_BLOCK (block))
2473 /* A catch block. Must precede N_LBRAC. */
2474 tree decl = BLOCK_VARS (block);
2475 while (decl)
2477 #ifdef DBX_OUTPUT_CATCH
2478 DBX_OUTPUT_CATCH (asmfile, decl, buf);
2479 #else
2480 fprintf (asmfile, "%s \"%s:C1\",%d,0,0,", ASM_STABS_OP,
2481 IDENTIFIER_POINTER (DECL_NAME (decl)), N_CATCH);
2482 assemble_name (asmfile, buf);
2483 fprintf (asmfile, "\n");
2484 #endif
2485 decl = TREE_CHAIN (decl);
2489 #ifdef DBX_OUTPUT_LBRAC
2490 DBX_OUTPUT_LBRAC (asmfile, buf);
2491 #else
2492 fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC);
2493 assemble_name (asmfile, buf);
2494 #if DBX_BLOCKS_FUNCTION_RELATIVE
2495 fputc ('-', asmfile);
2496 assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
2497 #endif
2498 fprintf (asmfile, "\n");
2499 #endif
2501 else if (depth > 0)
2502 /* Count blocks the same way regardless of debug_info_level. */
2503 next_block_number++;
2505 #ifdef DBX_LBRAC_FIRST
2506 /* On some weird machines, the syms of a block
2507 come after the N_LBRAC. */
2508 if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
2509 dbxout_syms (BLOCK_VARS (block));
2510 if (args)
2511 dbxout_reg_parms (args);
2512 #endif
2514 /* Output the subblocks. */
2515 dbxout_block (BLOCK_SUBBLOCKS (block), depth + 1, NULL_TREE);
2517 /* Refer to the marker for the end of the block. */
2518 if (depth > 0 && debug_info_level != DINFO_LEVEL_TERSE)
2520 char buf[20];
2521 ASM_GENERATE_INTERNAL_LABEL (buf, "LBE", blocknum);
2522 #ifdef DBX_OUTPUT_RBRAC
2523 DBX_OUTPUT_RBRAC (asmfile, buf);
2524 #else
2525 fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC);
2526 assemble_name (asmfile, buf);
2527 #if DBX_BLOCKS_FUNCTION_RELATIVE
2528 fputc ('-', asmfile);
2529 assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
2530 #endif
2531 fprintf (asmfile, "\n");
2532 #endif
2535 block = BLOCK_CHAIN (block);
2539 /* Output the information about a function and its arguments and result.
2540 Usually this follows the function's code,
2541 but on some systems, it comes before. */
2543 static void
2544 dbxout_really_begin_function (decl)
2545 tree decl;
2547 dbxout_symbol (decl, 0);
2548 dbxout_parms (DECL_ARGUMENTS (decl));
2549 if (DECL_NAME (DECL_RESULT (decl)) != 0)
2550 dbxout_symbol (DECL_RESULT (decl), 1);
2553 /* Called at beginning of output of function definition. */
2555 void
2556 dbxout_begin_function (decl)
2557 tree decl;
2559 #ifdef DBX_FUNCTION_FIRST
2560 dbxout_really_begin_function (decl);
2561 #endif
2564 /* Output dbx data for a function definition.
2565 This includes a definition of the function name itself (a symbol),
2566 definitions of the parameters (locating them in the parameter list)
2567 and then output the block that makes up the function's body
2568 (including all the auto variables of the function). */
2570 void
2571 dbxout_function (decl)
2572 tree decl;
2574 #ifndef DBX_FUNCTION_FIRST
2575 dbxout_really_begin_function (decl);
2576 #endif
2577 dbxout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl));
2578 #ifdef DBX_OUTPUT_FUNCTION_END
2579 DBX_OUTPUT_FUNCTION_END (asmfile, decl);
2580 #endif
2582 #endif /* DBX_DEBUGGING_INFO */