1 /* Output dbx-format symbol table information from GNU compiler.
2 Copyright (C) 1987, 1988, 1992 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21 /* Output 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
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.
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. */
71 #include <sys/param.h>
79 #include "insn-config.h"
87 #define ASM_STABS_OP ".stabs"
91 #define ASM_STABN_OP ".stabn"
94 /* Nonzero means if the type has methods, only output debugging
95 information if methods are actually written to the asm file. */
97 static int flag_minimal_debug
= 1;
99 /* Nonzero if we have actually used any of the GDB extensions
100 to the debugging format. The idea is that we use them for the
101 first time only if there's a strong reason, but once we have done that,
102 we use them whenever convenient. */
104 static int have_used_extensions
= 0;
106 /* Virtually every UN*X system now in common use (except for pre-4.3-tahoe
107 BSD systems) now provides getcwd as called for by POSIX. Allow for
108 the few exceptions to the general rule here. */
110 #if !(defined (USG) || defined (VMS))
111 extern char *getwd ();
112 #define getcwd(buf,len) getwd(buf)
113 #define GUESSPATHLEN (MAXPATHLEN + 1)
114 #else /* (defined (USG) || defined (VMS)) */
115 extern char *getcwd ();
116 /* We actually use this as a starting point, not a limit. */
117 #define GUESSPATHLEN 100
118 #endif /* (defined (USG) || defined (VMS)) */
120 /* Typical USG systems don't have stab.h, and they also have
121 no use for DBX-format debugging info. */
123 #ifdef DBX_DEBUGGING_INFO
125 #ifdef DEBUG_SYMS_TEXT
126 #define FORCE_TEXT text_section ();
132 #include "gstab.h" /* If doing DBX on sysV, use our own stab.h. */
134 #include <stab.h> /* On BSD, use the system's stab.h. */
136 /* This is a GNU extension we need to reference in this file. */
143 #define STAB_CODE_TYPE enum __stab_debug_code
145 #define STAB_CODE_TYPE int
148 /* 1 if PARM is passed to this function in memory. */
150 #define PARM_PASSED_IN_MEMORY(PARM) \
151 (GET_CODE (DECL_INCOMING_RTL (PARM)) == MEM)
153 /* A C expression for the integer offset value of an automatic variable
154 (N_LSYM) having address X (an RTX). */
155 #ifndef DEBUGGER_AUTO_OFFSET
156 #define DEBUGGER_AUTO_OFFSET(X) \
157 (GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0)
160 /* A C expression for the integer offset value of an argument (N_PSYM)
161 having address X (an RTX). The nominal offset is OFFSET. */
162 #ifndef DEBUGGER_ARG_OFFSET
163 #define DEBUGGER_ARG_OFFSET(OFFSET, X) (OFFSET)
166 /* Stream for writing to assembler file. */
168 static FILE *asmfile
;
170 /* Last source file name mentioned in a NOTE insn. */
172 static char *lastfile
;
174 /* Current working directory. */
177 static enum {not_gotten
, gotten
, error_getting
} cwd_status
= not_gotten
;
179 enum typestatus
{TYPE_UNSEEN
, TYPE_XREF
, TYPE_DEFINED
};
181 /* Vector recording the status of describing C data types.
182 When we first notice a data type (a tree node),
183 we assign it a number using next_type_number.
184 That is its index in this vector.
185 The vector element says whether we have yet output
186 the definition of the type. TYPE_XREF says we have
187 output it as a cross-reference only. */
189 enum typestatus
*typevec
;
191 /* Number of elements of space allocated in `typevec'. */
193 static int typevec_len
;
195 /* In dbx output, each type gets a unique number.
196 This is the number for the next type output.
197 The number, once assigned, is in the TYPE_SYMTAB_ADDRESS field. */
199 static int next_type_number
;
201 /* In dbx output, we must assign symbol-blocks id numbers
202 in the order in which their beginnings are encountered.
203 We output debugging info that refers to the beginning and
204 end of the ranges of code in each block
205 with assembler labels LBBn and LBEn, where n is the block number.
206 The labels are generated in final, which assigns numbers to the
207 blocks in the same way. */
209 static int next_block_number
;
211 /* These variables are for dbxout_symbol to communicate to
212 dbxout_finish_symbol.
213 current_sym_code is the symbol-type-code, a symbol N_... define in stab.h.
214 current_sym_value and current_sym_addr are two ways to address the
215 value to store in the symtab entry.
216 current_sym_addr if nonzero represents the value as an rtx.
217 If that is zero, current_sym_value is used. This is used
218 when the value is an offset (such as for auto variables,
219 register variables and parms). */
221 static STAB_CODE_TYPE current_sym_code
;
222 static int current_sym_value
;
223 static rtx current_sym_addr
;
225 /* Number of chars of symbol-description generated so far for the
226 current symbol. Used by CHARS and CONTIN. */
228 static int current_sym_nchars
;
230 /* Report having output N chars of the current symbol-description. */
232 #define CHARS(N) (current_sym_nchars += (N))
234 /* Break the current symbol-description, generating a continuation,
235 if it has become long. */
237 #ifndef DBX_CONTIN_LENGTH
238 #define DBX_CONTIN_LENGTH 80
241 #if DBX_CONTIN_LENGTH > 0
243 do {if (current_sym_nchars > DBX_CONTIN_LENGTH) dbxout_continue ();} while (0)
248 void dbxout_types ();
250 void dbxout_symbol ();
251 static void dbxout_type_name ();
252 static void dbxout_type ();
253 static void dbxout_typedefs ();
254 static void dbxout_prepare_symbol ();
255 static void dbxout_finish_symbol ();
256 static void dbxout_continue ();
257 static void print_int_cst_octal ();
258 static void print_octal ();
260 #if 0 /* Not clear we will actually need this. */
262 /* Return the absolutized filename for the given relative
263 filename. Note that if that filename is already absolute, it may
264 still be returned in a modified form because this routine also
265 eliminates redundant slashes and single dots and eliminates double
266 dots to get a shortest possible filename from the given input
267 filename. The absolutization of relative filenames is made by
268 assuming that the given filename is to be taken as relative to
269 the first argument (cwd) or to the current directory if cwd is
273 abspath (rel_filename
)
276 /* Setup the current working directory as needed. */
278 = (char *) alloca (strlen (cwd
) + strlen (rel_filename
) + 1);
279 char *endp
= abs_buffer
;
283 /* Copy the filename (possibly preceeded by the current working
284 directory name) into the absolutization buffer. */
289 if (rel_filename
[0] != '/')
292 while (*endp
++ = *src_p
++)
294 *(endp
-1) = '/'; /* overwrite null */
296 src_p
= rel_filename
;
297 while (*endp
++ = *src_p
++)
303 /* Now make a copy of abs_buffer into abs_buffer, shortening the
304 filename (by taking out slashes and dots) as we go. */
306 outp
= inp
= abs_buffer
;
307 *outp
++ = *inp
++; /* copy first slash */
312 else if (inp
[0] == '/' && outp
[-1] == '/')
317 else if (inp
[0] == '.' && outp
[-1] == '/')
321 else if (inp
[1] == '/')
326 else if ((inp
[1] == '.') && (inp
[2] == 0 || inp
[2] == '/'))
328 inp
+= (inp
[2] == '/') ? 3 : 2;
330 while (outp
>= abs_buffer
&& *outp
!= '/')
332 if (outp
< abs_buffer
)
334 /* Catch cases like /.. where we try to backup to a
335 point above the absolute root of the logical file
338 fprintf (stderr
, "%s: invalid file name: %s\n",
339 pname
, rel_filename
);
349 /* On exit, make sure that there is a trailing null, and make sure that
350 the last character of the returned string is *not* a slash. */
356 /* Make a copy (in the heap) of the stuff left in the absolutization
357 buffer and return a pointer to the copy. */
359 value
= (char *) oballoc (strlen (abs_buffer
) + 1);
360 strcpy (value
, abs_buffer
);
365 /* At the beginning of compilation, start writing the symbol table.
366 Initialize `typevec' and output the standard data types of C. */
369 dbxout_init (asm_file
, input_file_name
, syms
)
371 char *input_file_name
;
374 char ltext_label_name
[100];
379 typevec
= (enum typestatus
*) xmalloc (typevec_len
* sizeof typevec
[0]);
380 bzero (typevec
, typevec_len
* sizeof typevec
[0]);
382 /* Convert Ltext into the appropriate format for local labels in case
383 the system doesn't insert underscores in front of user generated
385 ASM_GENERATE_INTERNAL_LABEL (ltext_label_name
, "Ltext", 0);
387 /* Put the current working directory in an N_SO symbol. */
391 if (cwd_status
== not_gotten
)
395 /* Read the working directory, avoiding arbitrary limit. */
399 cwd
= (char *) xmalloc (size
);
400 value
= getcwd (cwd
, size
);
401 if (value
!= 0 || errno
!= ERANGE
)
410 cwd_status
= error_getting
;
413 if (cwd_status
== gotten
)
415 #ifdef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
416 DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (asmfile
, cwd
);
417 #else /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
418 fprintf (asmfile
, "%s \"%s/\",%d,0,0,%s\n", ASM_STABS_OP
,
419 cwd
, N_SO
, <ext_label_name
[1]);
420 #endif /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
424 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILENAME
425 /* This should NOT be DBX_OUTPUT_SOURCE_FILENAME. That
426 would give us an N_SOL, and we want an N_SO. */
427 DBX_OUTPUT_MAIN_SOURCE_FILENAME (asmfile
, input_file_name
);
428 #else /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
429 /* We include outputting `Ltext:' here,
430 because that gives you a way to override it. */
431 /* Used to put `Ltext:' before the reference, but that loses on sun 4. */
432 fprintf (asmfile
, "%s \"%s\",%d,0,0,%s\n", ASM_STABS_OP
, input_file_name
,
433 N_SO
, <ext_label_name
[1]);
435 ASM_OUTPUT_INTERNAL_LABEL (asmfile
, "Ltext", 0);
436 #endif /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
438 lastfile
= input_file_name
;
440 next_type_number
= 1;
441 next_block_number
= 2;
443 /* Make sure that types `int' and `char' have numbers 1 and 2.
444 Definitions of other integer types will refer to those numbers.
445 (Actually it should no longer matter what their numbers are.
446 Also, if any types with tags have been defined, dbxout_symbol
447 will output them first, so the numbers won't be 1 and 2. That
448 happens in C++. So it's a good thing it should no longer matter). */
450 #ifdef DBX_OUTPUT_STANDARD_TYPES
451 DBX_OUTPUT_STANDARD_TYPES (syms
);
453 dbxout_symbol (TYPE_NAME (integer_type_node
), 0);
454 dbxout_symbol (TYPE_NAME (char_type_node
), 0);
457 /* Get all permanent types that have typedef names,
458 and output them all, except for those already output. */
460 dbxout_typedefs (syms
);
463 /* Output any typedef names for types described by TYPE_DECLs in SYMS,
464 in the reverse order from that which is found in SYMS. */
467 dbxout_typedefs (syms
)
472 dbxout_typedefs (TREE_CHAIN (syms
));
473 if (TREE_CODE (syms
) == TYPE_DECL
)
475 tree type
= TREE_TYPE (syms
);
477 && TREE_CODE (TYPE_NAME (type
)) == TYPE_DECL
478 && ! TREE_ASM_WRITTEN (TYPE_NAME (type
)))
479 dbxout_symbol (TYPE_NAME (type
), 0);
484 /* Output debugging info to FILE to switch to sourcefile FILENAME. */
487 dbxout_source_file (file
, filename
)
491 char ltext_label_name
[100];
493 if (filename
&& (lastfile
== 0 || strcmp (filename
, lastfile
)))
495 #ifdef DBX_OUTPUT_SOURCE_FILENAME
496 DBX_OUTPUT_SOURCE_FILENAME (file
, filename
);
498 ASM_GENERATE_INTERNAL_LABEL (ltext_label_name
, "Ltext", 0);
499 fprintf (file
, "%s \"%s\",%d,0,0,%s\n", ASM_STABS_OP
,
500 filename
, N_SOL
, <ext_label_name
[1]);
506 /* At the end of compilation, finish writing the symbol table.
507 Unless you define DBX_OUTPUT_MAIN_SOURCE_FILE_END, the default is
511 dbxout_finish (file
, filename
)
515 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILE_END
516 DBX_OUTPUT_MAIN_SOURCE_FILE_END (file
, filename
);
517 #endif /* DBX_OUTPUT_MAIN_SOURCE_FILE_END */
520 /* Continue a symbol-description that gets too big.
521 End one symbol table entry with a double-backslash
522 and start a new one, eventually producing something like
523 .stabs "start......\\",code,0,value
524 .stabs "...rest",code,0,value */
529 #ifdef DBX_CONTIN_CHAR
530 fprintf (asmfile
, "%c", DBX_CONTIN_CHAR
);
532 fprintf (asmfile
, "\\\\");
534 dbxout_finish_symbol (0);
535 fprintf (asmfile
, "%s \"", ASM_STABS_OP
);
536 current_sym_nchars
= 0;
539 /* Subtroutine of `dbxout_type'. Output the type fields of TYPE.
540 This must be a separate function because anonymous unions require
544 dbxout_type_fields (type
)
548 for (tem
= TYPE_FIELDS (type
); tem
; tem
= TREE_CHAIN (tem
))
550 /* Output the name, type, position (in bits), size (in bits)
552 if (DECL_NAME (tem
) == NULL_TREE
553 && TREE_CODE (TREE_TYPE (tem
)) == UNION_TYPE
)
554 dbxout_type_fields (TREE_TYPE (tem
));
555 /* Omit here local type decls until we know how to support them. */
556 else if (TREE_CODE (tem
) == TYPE_DECL
)
558 /* Omit here the nameless fields that are used to skip bits. */
559 else if (DECL_NAME (tem
) != 0 && TREE_CODE (tem
) != CONST_DECL
)
561 /* Continue the line if necessary,
562 but not before the first field. */
563 if (tem
!= TYPE_FIELDS (type
))
566 if (use_gdb_dbx_extensions
567 && flag_minimal_debug
568 && TREE_CODE (tem
) == FIELD_DECL
569 && DECL_VIRTUAL_P (tem
)
570 && DECL_ASSEMBLER_NAME (tem
))
572 have_used_extensions
= 1;
573 CHARS (3 + IDENTIFIER_LENGTH (DECL_NAME (TYPE_NAME (DECL_FCONTEXT (tem
)))));
574 fputs (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (tem
)), asmfile
);
575 dbxout_type (DECL_FCONTEXT (tem
), 0);
576 fprintf (asmfile
, ":");
577 dbxout_type (TREE_TYPE (tem
), 0);
578 fprintf (asmfile
, ",%d;",
579 TREE_INT_CST_LOW (DECL_FIELD_BITPOS (tem
)));
583 fprintf (asmfile
, "%s:", IDENTIFIER_POINTER (DECL_NAME (tem
)));
584 CHARS (2 + IDENTIFIER_LENGTH (DECL_NAME (tem
)));
586 if (use_gdb_dbx_extensions
587 && (TREE_PRIVATE (tem
) || TREE_PROTECTED (tem
)
588 || TREE_CODE (tem
) != FIELD_DECL
))
590 have_used_extensions
= 1;
592 putc ((TREE_PRIVATE (tem
) ? '0'
593 : TREE_PROTECTED (tem
) ? '1' : '2'),
598 dbxout_type ((TREE_CODE (tem
) == FIELD_DECL
599 && DECL_BIT_FIELD_TYPE (tem
))
600 ? DECL_BIT_FIELD_TYPE (tem
)
601 : TREE_TYPE (tem
), 0);
603 if (TREE_CODE (tem
) == VAR_DECL
)
605 if (TREE_STATIC (tem
) && use_gdb_dbx_extensions
)
607 char *name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (tem
));
608 have_used_extensions
= 1;
610 #if 0 /* ??? Comment below makes it clear this is unacceptable. */
611 /* Adding 1 here only works on systems
612 which flush an initial underscore from
613 the .stabs entry. This loses for static names
614 which have an initial leading '_' on systems which
615 don't use leading underscores. */
620 fprintf (asmfile
, ":%s;", name
);
621 CHARS (strlen (name
));
625 /* If TEM is non-static, GDB won't understand it. */
626 fprintf (asmfile
, ",0,0;");
629 else if (TREE_CODE (DECL_FIELD_BITPOS (tem
)) == INTEGER_CST
)
631 fprintf (asmfile
, ",%d,%d;",
632 TREE_INT_CST_LOW (DECL_FIELD_BITPOS (tem
)),
633 TREE_INT_CST_LOW (DECL_SIZE (tem
)));
636 /* This has yet to be implemented. */
643 /* Subtroutine of `dbxout_type_methods'. Output debug info about the
644 method described DECL. DEBUG_NAME is an encoding of the method's
645 type signature. ??? We may be able to do without DEBUG_NAME altogether
649 dbxout_type_method_1 (decl
, debug_name
)
653 tree firstarg
= TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl
)));
656 if (TREE_CODE (TREE_TYPE (decl
)) == FUNCTION_TYPE
)
658 else /* it's a METHOD_TYPE. */
660 /* A for normal functions.
661 B for `const' member functions.
662 C for `volatile' member functions.
663 D for `const volatile' member functions. */
664 if (TYPE_READONLY (TREE_TYPE (firstarg
)))
666 if (TYPE_VOLATILE (TREE_TYPE (firstarg
)))
669 if (DECL_VINDEX (decl
))
675 fprintf (asmfile
, ":%s;%c%c%c", debug_name
,
676 TREE_PRIVATE (decl
) ? '0' : TREE_PROTECTED (decl
) ? '1' : '2', c1
, c2
);
677 CHARS (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (decl
)) + 6
678 - (debug_name
- IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl
))));
679 if (DECL_VINDEX (decl
))
681 fprintf (asmfile
, "%d;",
682 TREE_INT_CST_LOW (DECL_VINDEX (decl
)));
683 dbxout_type (DECL_CONTEXT (decl
), 0);
684 fprintf (asmfile
, ";");
689 /* Subroutine of `dbxout_type'. Output debug info about the methods defined
693 dbxout_type_methods (type
)
696 /* C++: put out the method names and their parameter lists */
698 tree methods
= TYPE_METHODS (type
);
699 register tree fndecl
;
701 register int type_identifier_length
;
703 if (methods
== NULL_TREE
)
706 ctor_name
= DECL_NAME (TYPE_NAME (type
));
707 type_identifier_length
= IDENTIFIER_LENGTH (ctor_name
);
708 if (TREE_CODE (methods
) == FUNCTION_DECL
)
710 else if (TREE_VEC_ELT (methods
, 0) != NULL_TREE
)
711 fndecl
= TREE_VEC_ELT (methods
, 0);
712 else fndecl
= TREE_VEC_ELT (methods
, 1);
714 if (TREE_CODE (type
) == RECORD_TYPE
&& DECL_NAME (fndecl
) == ctor_name
)
719 /* Destructors lie in a special place.
720 n.b. TYPE_HAS_DESTRUCTOR == TYPE_LANG_FLAG_2 */
721 if (TYPE_LANG_FLAG_2 (type
))
724 fndecl
= ctor
= TREE_CHAIN (dtor
);
737 /* Output the name of the field (after overloading), as
738 well as the name of the field before overloading, along
739 with its parameter list. */
740 char *debug_name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (ctor
));
741 int old_minimal_debug
= flag_minimal_debug
;
745 if (DECL_NAME (ctor
) == ctor_name
&& ! DECL_IGNORED_P (ctor
))
749 fprintf (asmfile
, "%s::", IDENTIFIER_POINTER (DECL_NAME (ctor
)));
750 CHARS (IDENTIFIER_LENGTH (DECL_NAME (ctor
)) + 3);
755 /* Always output destructors with full information. */
756 flag_minimal_debug
= 0;
758 dbxout_type (TREE_TYPE (ctor
), 0);
759 flag_minimal_debug
= old_minimal_debug
;
761 if (flag_minimal_debug
&& ctor
!= dtor
)
763 /* Cut down on debugging information by not outputting
764 the parts of the name we can just as easily
765 have the debugger figure out. */
769 /* Get past const and volatile qualifiers. */
770 while (*debug_name
== 'C' || *debug_name
== 'V')
772 /* Get past numeric type length prefix. */
773 while (*debug_name
>= '0' && *debug_name
<= '9')
775 /* Get past type of `this'. */
776 debug_name
+= type_identifier_length
;
778 dbxout_type_method_1 (ctor
, debug_name
);
784 ctor
= TREE_CHAIN (ctor
);
785 if (ctor
== NULL_TREE
|| DECL_NAME (ctor
) != ctor_name
)
798 tree name
= DECL_NAME (fndecl
);
799 fprintf (asmfile
, "%s::", IDENTIFIER_POINTER (name
));
800 CHARS (IDENTIFIER_LENGTH (name
) + 3);
802 for (last
= NULL_TREE
;
803 fndecl
&& (last
== NULL_TREE
|| DECL_NAME (fndecl
) == DECL_NAME (last
));
804 fndecl
= TREE_CHAIN (fndecl
))
805 /* Output the name of the field (after overloading), as
806 well as the name of the field before overloading, along
807 with its parameter list */
809 char *debug_name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl
));
814 dbxout_type (TREE_TYPE (fndecl
), 0);
815 if (flag_minimal_debug
)
817 debug_name
+= IDENTIFIER_LENGTH (DECL_NAME (fndecl
)) + 2;
818 /* Get past const and volatile qualifiers. */
819 while (*debug_name
== 'C' || *debug_name
== 'V')
821 while (*debug_name
>= '0' && *debug_name
<= '9')
823 debug_name
+= type_identifier_length
;
825 dbxout_type_method_1 (fndecl
, debug_name
);
832 /* Output a reference to a type. If the type has not yet been
833 described in the dbx output, output its definition now.
834 For a type already defined, just refer to its definition
835 using the type number.
837 If FULL is nonzero, and the type has been described only with
838 a forward-reference, output the definition now.
839 If FULL is zero in this case, just refer to the forward-reference
840 using the number previously allocated. */
843 dbxout_type (type
, full
)
849 /* If there was an input error and we don't really have a type,
850 avoid crashing and write something that is at least valid
851 by assuming `int'. */
852 if (type
== error_mark_node
)
853 type
= integer_type_node
;
856 type
= TYPE_MAIN_VARIANT (type
);
858 && TREE_CODE (TYPE_NAME (type
)) == TYPE_DECL
859 && DECL_IGNORED_P (TYPE_NAME (type
)))
863 if (TYPE_SYMTAB_ADDRESS (type
) == 0)
865 /* Type has no dbx number assigned. Assign next available number. */
866 TYPE_SYMTAB_ADDRESS (type
) = next_type_number
++;
868 /* Make sure type vector is long enough to record about this type. */
870 if (next_type_number
== typevec_len
)
872 typevec
= (enum typestatus
*) xrealloc (typevec
, typevec_len
* 2 * sizeof typevec
[0]);
873 bzero (typevec
+ typevec_len
, typevec_len
* sizeof typevec
[0]);
878 /* Output the number of this type, to refer to it. */
879 fprintf (asmfile
, "%d", TYPE_SYMTAB_ADDRESS (type
));
882 /* If this type's definition has been output or is now being output,
885 switch (typevec
[TYPE_SYMTAB_ADDRESS (type
)])
898 /* For systems where dbx output does not allow the `=xsNAME:' syntax,
899 leave the type-number completely undefined rather than output
900 a cross-reference. */
901 if (TREE_CODE (type
) == RECORD_TYPE
|| TREE_CODE (type
) == UNION_TYPE
902 || TREE_CODE (type
) == ENUMERAL_TYPE
)
904 if ((TYPE_NAME (type
) != 0 && !full
)
905 || TYPE_SIZE (type
) == 0)
907 typevec
[TYPE_SYMTAB_ADDRESS (type
)] = TYPE_XREF
;
912 /* Output a definition now. */
914 fprintf (asmfile
, "=");
917 /* Mark it as defined, so that if it is self-referent
918 we will not get into an infinite recursion of definitions. */
920 typevec
[TYPE_SYMTAB_ADDRESS (type
)] = TYPE_DEFINED
;
922 switch (TREE_CODE (type
))
926 /* For a void type, just define it as itself; ie, "5=5".
927 This makes us consider it defined
928 without saying what it is. The debugger will make it
929 a void type when the reference is seen, and nothing will
930 ever override that default. */
931 fprintf (asmfile
, "%d", TYPE_SYMTAB_ADDRESS (type
));
936 if (type
== char_type_node
&& ! TREE_UNSIGNED (type
))
937 /* Output the type `char' as a subrange of itself!
938 I don't understand this definition, just copied it
939 from the output of pcc.
940 This used to use `r2' explicitly and we used to
941 take care to make sure that `char' was type number 2. */
942 fprintf (asmfile
, "r%d;0;127;", TYPE_SYMTAB_ADDRESS (type
));
944 else if (TYPE_PRECISION (type
) > BITS_PER_WORD
)
946 /* This used to say `r1' and we used to take care
947 to make sure that `int' was type number 1. */
948 fprintf (asmfile
, "r%d;", TYPE_SYMTAB_ADDRESS (integer_type_node
));
949 print_int_cst_octal (TYPE_MIN_VALUE (type
));
950 fprintf (asmfile
, ";");
951 print_int_cst_octal (TYPE_MAX_VALUE (type
));
952 fprintf (asmfile
, ";");
956 /* Output other integer types as subranges of `int'. */
957 /* This used to say `r1' and we used to take care
958 to make sure that `int' was type number 1. */
959 fprintf (asmfile
, "r%d;%d;%d;",
960 TYPE_SYMTAB_ADDRESS (integer_type_node
),
961 TREE_INT_CST_LOW (TYPE_MIN_VALUE (type
)),
962 TREE_INT_CST_LOW (TYPE_MAX_VALUE (type
)));
967 /* This used to say `r1' and we used to take care
968 to make sure that `int' was type number 1. */
969 fprintf (asmfile
, "r%d;%d;0;", TYPE_SYMTAB_ADDRESS (integer_type_node
),
970 TREE_INT_CST_LOW (size_in_bytes (type
)));
975 /* Output "a" followed by a range type definition
976 for the index type of the array
977 followed by a reference to the target-type.
978 ar1;0;N;M for an array of type M and size N. */
979 /* This used to say `r1' and we used to take care
980 to make sure that `int' was type number 1. */
981 fprintf (asmfile
, "ar%d;0;%d;", TYPE_SYMTAB_ADDRESS (integer_type_node
),
984 ? TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type
)))
987 dbxout_type (TREE_TYPE (type
), 0);
993 int i
, n_baseclasses
= 0;
995 if (TYPE_BINFO (type
) != 0 && TYPE_BINFO_BASETYPES (type
) != 0)
996 n_baseclasses
= TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (type
));
998 /* Output a structure type. */
999 if ((TYPE_NAME (type
) != 0 && !full
)
1000 || TYPE_SIZE (type
) == 0)
1002 /* If the type is just a cross reference, output one
1003 and mark the type as partially described.
1004 If it later becomes defined, we will output
1005 its real definition.
1006 If the type has a name, don't nest its definition within
1007 another type's definition; instead, output an xref
1008 and let the definition come when the name is defined. */
1009 fprintf (asmfile
, (TREE_CODE (type
) == RECORD_TYPE
) ? "xs" : "xu");
1011 #if 0 /* This assertion is legitimately false in C++. */
1012 /* We shouldn't be outputting a reference to a type before its
1013 definition unless the type has a tag name.
1014 A typedef name without a tag name should be impossible. */
1015 if (TREE_CODE (TYPE_NAME (type
)) != IDENTIFIER_NODE
)
1018 dbxout_type_name (type
);
1019 fprintf (asmfile
, ":");
1020 typevec
[TYPE_SYMTAB_ADDRESS (type
)] = TYPE_XREF
;
1023 tem
= size_in_bytes (type
);
1025 /* The code below assumes the size is an integer constant. */
1026 if (TREE_CODE (tem
) != INTEGER_CST
)
1029 /* Identify record or union, and print its size. */
1030 fprintf (asmfile
, (TREE_CODE (type
) == RECORD_TYPE
) ? "s%d" : "u%d",
1031 TREE_INT_CST_LOW (tem
));
1033 if (use_gdb_dbx_extensions
)
1037 have_used_extensions
= 1;
1038 fprintf (asmfile
, "!%d,", n_baseclasses
);
1042 for (i
= 0; i
< n_baseclasses
; i
++)
1044 tree child
= TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (type
)), i
);
1045 if (use_gdb_dbx_extensions
)
1047 have_used_extensions
= 1;
1048 putc (TREE_VIA_VIRTUAL (child
) ? '1'
1051 putc (TREE_VIA_PUBLIC (child
) ? '2'
1054 fprintf (asmfile
, "%d,",
1055 TREE_INT_CST_LOW (BINFO_OFFSET (child
)) * BITS_PER_UNIT
);
1057 dbxout_type (BINFO_TYPE (child
), 0);
1058 putc (';', asmfile
);
1062 /* Print out the base class information with fields
1063 which have the same names at the types they hold. */
1064 dbxout_type_name (BINFO_TYPE (child
));
1065 putc (':', asmfile
);
1066 dbxout_type (BINFO_TYPE (child
), full
);
1067 fprintf (asmfile
, ",%d,%d;",
1068 TREE_INT_CST_LOW (BINFO_OFFSET (child
)) * BITS_PER_UNIT
,
1069 TREE_INT_CST_LOW (DECL_SIZE (TYPE_NAME (BINFO_TYPE (child
)))) * BITS_PER_UNIT
);
1077 /* Write out the field declarations. */
1078 dbxout_type_fields (type
);
1079 if (use_gdb_dbx_extensions
)
1081 have_used_extensions
= 1;
1082 dbxout_type_methods (type
);
1084 putc (';', asmfile
);
1086 if (use_gdb_dbx_extensions
&& TREE_CODE (type
) == RECORD_TYPE
1087 /* Avoid the ~ if we don't really need it--it confuses dbx. */
1088 && TYPE_VFIELD (type
))
1090 have_used_extensions
= 1;
1092 /* Tell GDB+ that it may keep reading. */
1093 putc ('~', asmfile
);
1095 /* We need to write out info about what field this class
1096 uses as its "main" vtable pointer field, because if this
1097 field is inherited from a base class, GDB cannot necessarily
1098 figure out which field it's using in time. */
1099 if (TYPE_VFIELD (type
))
1101 putc ('%', asmfile
);
1102 dbxout_type (DECL_FCONTEXT (TYPE_VFIELD (type
)), 0);
1104 putc (';', asmfile
);
1110 if ((TYPE_NAME (type
) != 0 && !full
1111 && (TREE_CODE (TYPE_NAME (type
)) == TYPE_DECL
1112 && ! DECL_IGNORED_P (TYPE_NAME (type
))))
1113 || TYPE_SIZE (type
) == 0)
1115 fprintf (asmfile
, "xe");
1117 dbxout_type_name (type
);
1118 typevec
[TYPE_SYMTAB_ADDRESS (type
)] = TYPE_XREF
;
1119 fprintf (asmfile
, ":");
1122 putc ('e', asmfile
);
1124 for (tem
= TYPE_VALUES (type
); tem
; tem
= TREE_CHAIN (tem
))
1126 fprintf (asmfile
, "%s:%d,", IDENTIFIER_POINTER (TREE_PURPOSE (tem
)),
1127 TREE_INT_CST_LOW (TREE_VALUE (tem
)));
1128 CHARS (11 + IDENTIFIER_LENGTH (TREE_PURPOSE (tem
)));
1129 if (TREE_CHAIN (tem
) != 0)
1132 putc (';', asmfile
);
1137 putc ('*', asmfile
);
1139 dbxout_type (TREE_TYPE (type
), 0);
1143 if (use_gdb_dbx_extensions
)
1145 have_used_extensions
= 1;
1146 putc ('#', asmfile
);
1148 if (flag_minimal_debug
)
1150 putc ('#', asmfile
);
1151 dbxout_type (TREE_TYPE (type
), 0);
1152 putc (';', asmfile
);
1157 dbxout_type (TYPE_METHOD_BASETYPE (type
), 0);
1158 putc (',', asmfile
);
1160 dbxout_type (TREE_TYPE (type
), 0);
1161 dbxout_args (TYPE_ARG_TYPES (type
));
1162 putc (';', asmfile
);
1168 /* Treat it as a function type. */
1169 dbxout_type (TREE_TYPE (type
), 0);
1174 if (use_gdb_dbx_extensions
)
1176 have_used_extensions
= 1;
1177 putc ('@', asmfile
);
1179 dbxout_type (TYPE_OFFSET_BASETYPE (type
), 0);
1180 putc (',', asmfile
);
1182 dbxout_type (TREE_TYPE (type
), 0);
1186 /* Should print as an int, because it is really
1188 dbxout_type (integer_type_node
, 0);
1192 case REFERENCE_TYPE
:
1193 if (use_gdb_dbx_extensions
)
1194 have_used_extensions
= 1;
1195 putc (use_gdb_dbx_extensions
? '&' : '*', asmfile
);
1197 dbxout_type (TREE_TYPE (type
), 0);
1201 putc ('f', asmfile
);
1203 dbxout_type (TREE_TYPE (type
), 0);
1211 /* Print the value of integer constant C, in octal,
1212 handling double precision. */
1215 print_int_cst_octal (c
)
1218 unsigned int high
= TREE_INT_CST_HIGH (c
);
1219 unsigned int low
= TREE_INT_CST_LOW (c
);
1220 int excess
= (3 - (HOST_BITS_PER_INT
% 3));
1222 fprintf (asmfile
, "0");
1226 print_octal (high
, HOST_BITS_PER_INT
/ 3);
1227 print_octal (low
, HOST_BITS_PER_INT
/ 3);
1231 unsigned int beg
= high
>> excess
;
1233 = ((high
& ((1 << excess
) - 1)) << (3 - excess
)
1234 | (low
>> (HOST_BITS_PER_INT
/ 3 * 3)));
1235 unsigned int end
= low
& ((1 << (HOST_BITS_PER_INT
/ 3 * 3)) - 1);
1236 fprintf (asmfile
, "%o%01o", beg
, middle
);
1237 print_octal (end
, HOST_BITS_PER_INT
/ 3);
1242 print_octal (value
, digits
)
1248 for (i
= digits
- 1; i
>= 0; i
--)
1249 fprintf (asmfile
, "%01o", ((value
>> (3 * i
)) & 7));
1252 /* Output the name of type TYPE, with no punctuation.
1253 Such names can be set up either by typedef declarations
1254 or by struct, enum and union tags. */
1257 dbxout_type_name (type
)
1261 if (TYPE_NAME (type
) == 0)
1263 if (TREE_CODE (TYPE_NAME (type
)) == IDENTIFIER_NODE
)
1265 t
= TYPE_NAME (type
);
1267 else if (TREE_CODE (TYPE_NAME (type
)) == TYPE_DECL
)
1269 t
= DECL_NAME (TYPE_NAME (type
));
1274 fprintf (asmfile
, "%s", IDENTIFIER_POINTER (t
));
1275 CHARS (IDENTIFIER_LENGTH (t
));
1278 /* Output a .stabs for the symbol defined by DECL,
1279 which must be a ..._DECL node in the normal namespace.
1280 It may be a CONST_DECL, a FUNCTION_DECL, a PARM_DECL or a VAR_DECL.
1281 LOCAL is nonzero if the scope is less than the entire file. */
1284 dbxout_symbol (decl
, local
)
1289 tree type
= TREE_TYPE (decl
);
1290 tree context
= NULL_TREE
;
1293 /* Cast avoids warning in old compilers. */
1294 current_sym_code
= (STAB_CODE_TYPE
) 0;
1295 current_sym_value
= 0;
1296 current_sym_addr
= 0;
1298 /* Ignore nameless syms, but don't ignore type tags. */
1300 if ((DECL_NAME (decl
) == 0 && TREE_CODE (decl
) != TYPE_DECL
)
1301 || DECL_IGNORED_P (decl
))
1304 dbxout_prepare_symbol (decl
);
1306 /* The output will always start with the symbol name,
1307 so always count that in the length-output-so-far. */
1309 if (DECL_NAME (decl
) != 0)
1310 current_sym_nchars
= 2 + IDENTIFIER_LENGTH (DECL_NAME (decl
));
1312 switch (TREE_CODE (decl
))
1315 /* Enum values are defined by defining the enum type. */
1319 if (DECL_RTL (decl
) == 0)
1321 if (TREE_EXTERNAL (decl
))
1323 /* Don't mention a nested function under its parent. */
1324 context
= decl_function_context (decl
);
1325 if (context
== current_function_decl
)
1327 if (GET_CODE (DECL_RTL (decl
)) != MEM
1328 || GET_CODE (XEXP (DECL_RTL (decl
), 0)) != SYMBOL_REF
)
1332 fprintf (asmfile
, "%s \"%s:%c", ASM_STABS_OP
,
1333 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl
)),
1334 TREE_PUBLIC (decl
) ? 'F' : 'f');
1336 current_sym_code
= N_FUN
;
1337 current_sym_addr
= XEXP (DECL_RTL (decl
), 0);
1339 if (TREE_TYPE (type
))
1340 dbxout_type (TREE_TYPE (type
), 0);
1342 dbxout_type (void_type_node
, 0);
1344 /* For a nested function, when that function is compiled,
1345 mention the containing function name
1346 as well as (since dbx wants it) our own assembler-name. */
1348 fprintf (asmfile
, ",%s,%s",
1349 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl
)),
1350 IDENTIFIER_POINTER (DECL_NAME (context
)));
1352 dbxout_finish_symbol (decl
);
1357 /* This seems all wrong. Outputting most kinds of types gives no name
1358 at all. A true definition gives no name; a cross-ref for a
1359 structure can give the tag name, but not a type name.
1360 It seems that no typedef name is defined by outputting a type. */
1362 /* If this typedef name was defined by outputting the type,
1363 don't duplicate it. */
1364 if (typevec
[TYPE_SYMTAB_ADDRESS (type
)] == TYPE_DEFINED
1365 && TYPE_NAME (TREE_TYPE (decl
)) == decl
)
1368 /* Don't output the same typedef twice.
1369 And don't output what language-specific stuff doesn't want output. */
1370 if (TREE_ASM_WRITTEN (decl
) || DECL_IGNORED_P (decl
))
1375 if (DECL_NAME (decl
))
1377 /* Output typedef name. */
1378 fprintf (asmfile
, "%s \"%s:", ASM_STABS_OP
,
1379 IDENTIFIER_POINTER (DECL_NAME (decl
)));
1381 /* If there is a typedecl for this type with the same name
1382 as the tag, output an abbreviated form for that typedecl. */
1383 if (use_gdb_dbx_extensions
&& have_used_extensions
1384 && (TREE_CODE (type
) == RECORD_TYPE
1385 || TREE_CODE (type
) == UNION_TYPE
)
1386 && (TYPE_NAME (type
) == decl
))
1388 putc ('T', asmfile
);
1389 TREE_ASM_WRITTEN (TYPE_NAME (type
)) = 1;
1391 putc ('t', asmfile
);
1392 current_sym_code
= N_LSYM
;
1394 dbxout_type (type
, 1);
1395 dbxout_finish_symbol (decl
);
1397 else if (TYPE_NAME (type
) != 0 && !TREE_ASM_WRITTEN (TYPE_NAME (type
)))
1399 /* Output a tag (a TYPE_DECL with no name, but the type has a name).
1400 This is what represents `struct foo' with no typedef. */
1401 /* In C++, the name of a type is the corresponding typedef.
1402 In C, it is an IDENTIFIER_NODE. */
1403 tree name
= TYPE_NAME (type
);
1404 if (TREE_CODE (name
) == TYPE_DECL
)
1405 name
= DECL_NAME (name
);
1407 current_sym_code
= N_LSYM
;
1408 current_sym_value
= 0;
1409 current_sym_addr
= 0;
1410 current_sym_nchars
= 2 + IDENTIFIER_LENGTH (name
);
1412 fprintf (asmfile
, "%s \"%s:T", ASM_STABS_OP
,
1413 IDENTIFIER_POINTER (name
));
1414 dbxout_type (type
, 1);
1415 dbxout_finish_symbol (0);
1418 /* Prevent duplicate output of a typedef. */
1419 TREE_ASM_WRITTEN (decl
) = 1;
1423 /* Parm decls go in their own separate chains
1424 and are output by dbxout_reg_parms and dbxout_parms. */
1428 /* Named return value, treat like a VAR_DECL. */
1430 if (DECL_RTL (decl
) == 0)
1432 /* Don't mention a variable that is external.
1433 Let the file that defines it describe it. */
1434 if (TREE_EXTERNAL (decl
))
1437 /* If the variable is really a constant
1438 and not written in memory, inform the debugger. */
1439 if (TREE_STATIC (decl
) && TREE_READONLY (decl
)
1440 && DECL_INITIAL (decl
) != 0
1441 && ! TREE_ASM_WRITTEN (decl
)
1442 && (DECL_FIELD_CONTEXT (decl
) == NULL_TREE
1443 || TREE_CODE (DECL_FIELD_CONTEXT (decl
)) == BLOCK
))
1445 if (TREE_PUBLIC (decl
) == 0)
1447 /* The sun4 assembler does not grok this. */
1448 char *name
= IDENTIFIER_POINTER (DECL_NAME (decl
));
1449 if (TREE_CODE (TREE_TYPE (decl
)) == INTEGER_TYPE
1450 || TREE_CODE (TREE_TYPE (decl
)) == ENUMERAL_TYPE
)
1452 int ival
= TREE_INT_CST_LOW (DECL_INITIAL (decl
));
1453 #ifdef DBX_OUTPUT_CONSTANT_SYMBOL
1454 DBX_OUTPUT_CONSTANT_SYMBOL (asmfile
, name
, ival
);
1456 fprintf (asmfile
, "%s \"%s:c=i%d\",0x%x,0,0,0\n",
1457 ASM_STABS_OP
, name
, ival
, N_LSYM
);
1461 else if (TREE_CODE (TREE_TYPE (decl
)) == REAL_TYPE
)
1463 /* don't know how to do this yet. */
1467 /* else it is something we handle like a normal variable. */
1470 DECL_RTL (decl
) = eliminate_regs (DECL_RTL (decl
));
1471 #ifdef LEAF_REG_REMAP
1473 leaf_renumber_regs_insn (DECL_RTL (decl
));
1476 /* Don't mention a variable at all
1477 if it was completely optimized into nothingness.
1479 If DECL was from an inline function, then it's rtl
1480 is not identically the rtl that was used in this
1481 particular compilation. */
1482 if (GET_CODE (DECL_RTL (decl
)) == REG
)
1484 regno
= REGNO (DECL_RTL (decl
));
1485 if (regno
>= FIRST_PSEUDO_REGISTER
)
1486 regno
= reg_renumber
[REGNO (DECL_RTL (decl
))];
1490 else if (GET_CODE (DECL_RTL (decl
)) == SUBREG
)
1492 rtx value
= DECL_RTL (decl
);
1494 while (GET_CODE (value
) == SUBREG
)
1496 offset
+= SUBREG_WORD (value
);
1497 value
= SUBREG_REG (value
);
1499 if (GET_CODE (value
) == REG
)
1501 regno
= REGNO (value
);
1502 if (regno
>= FIRST_PSEUDO_REGISTER
)
1503 regno
= reg_renumber
[REGNO (value
)];
1509 /* The kind-of-variable letter depends on where
1510 the variable is and on the scope of its name:
1511 G and N_GSYM for static storage and global scope,
1512 S for static storage and file scope,
1513 V for static storage and local scope,
1514 for those two, use N_LCSYM if data is in bss segment,
1515 N_STSYM if in data segment, N_FUN otherwise.
1516 (We used N_FUN originally, then changed to N_STSYM
1517 to please GDB. However, it seems that confused ld.
1518 Now GDB has been fixed to like N_FUN, says Kingdon.)
1519 no letter at all, and N_LSYM, for auto variable,
1520 r and N_RSYM for register variable. */
1522 if (GET_CODE (DECL_RTL (decl
)) == MEM
1523 && GET_CODE (XEXP (DECL_RTL (decl
), 0)) == SYMBOL_REF
)
1525 if (TREE_PUBLIC (decl
))
1528 current_sym_code
= N_GSYM
;
1532 current_sym_addr
= XEXP (DECL_RTL (decl
), 0);
1534 letter
= TREE_PERMANENT (decl
) ? 'S' : 'V';
1536 if (!DECL_INITIAL (decl
))
1537 current_sym_code
= N_LCSYM
;
1538 else if (TREE_READONLY (decl
) && ! TREE_THIS_VOLATILE (decl
))
1539 /* This is not quite right, but it's the closest
1540 of all the codes that Unix defines. */
1541 current_sym_code
= N_FUN
;
1544 /* Ultrix `as' seems to need this. */
1545 #ifdef DBX_STATIC_STAB_DATA_SECTION
1548 current_sym_code
= N_STSYM
;
1552 else if (regno
>= 0)
1555 current_sym_code
= N_RSYM
;
1556 current_sym_value
= DBX_REGISTER_NUMBER (regno
);
1558 else if (GET_CODE (DECL_RTL (decl
)) == SUBREG
)
1560 rtx value
= DECL_RTL (decl
);
1562 while (GET_CODE (value
) == SUBREG
)
1564 offset
+= SUBREG_WORD (value
);
1565 value
= SUBREG_REG (value
);
1568 current_sym_code
= N_RSYM
;
1569 current_sym_value
= DBX_REGISTER_NUMBER (REGNO (value
) + offset
);
1571 else if (GET_CODE (DECL_RTL (decl
)) == MEM
1572 && (GET_CODE (XEXP (DECL_RTL (decl
), 0)) == MEM
1573 || (GET_CODE (XEXP (DECL_RTL (decl
), 0)) == REG
1574 && REGNO (XEXP (DECL_RTL (decl
), 0)) != FRAME_POINTER_REGNUM
)))
1575 /* If the value is indirect by memory or by a register
1576 that isn't the frame pointer
1577 then it means the object is variable-sized and address through
1578 that register or stack slot. DBX has no way to represent this
1579 so all we can do is output the variable as a pointer.
1580 If it's not a parameter, ignore it.
1581 (VAR_DECLs like this can be made by integrate.c.) */
1583 if (GET_CODE (XEXP (DECL_RTL (decl
), 0)) == REG
)
1586 current_sym_code
= N_RSYM
;
1587 current_sym_value
= DBX_REGISTER_NUMBER (REGNO (XEXP (DECL_RTL (decl
), 0)));
1591 current_sym_code
= N_LSYM
;
1592 /* DECL_RTL looks like (MEM (MEM (PLUS (REG...) (CONST_INT...)))).
1593 We want the value of that CONST_INT. */
1595 = DEBUGGER_AUTO_OFFSET (XEXP (XEXP (DECL_RTL (decl
), 0), 0));
1598 /* Effectively do build_pointer_type, but don't cache this type,
1599 since it might be temporary whereas the type it points to
1600 might have been saved for inlining. */
1601 type
= make_node (REFERENCE_TYPE
);
1602 TREE_TYPE (type
) = TREE_TYPE (decl
);
1604 else if (GET_CODE (DECL_RTL (decl
)) == MEM
1605 && GET_CODE (XEXP (DECL_RTL (decl
), 0)) == REG
)
1607 current_sym_code
= N_LSYM
;
1608 current_sym_value
= DEBUGGER_AUTO_OFFSET (XEXP (DECL_RTL (decl
), 0));
1610 else if (GET_CODE (DECL_RTL (decl
)) == MEM
1611 && GET_CODE (XEXP (DECL_RTL (decl
), 0)) == PLUS
1612 && GET_CODE (XEXP (XEXP (DECL_RTL (decl
), 0), 1)) == CONST_INT
)
1614 current_sym_code
= N_LSYM
;
1615 /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...)))
1616 We want the value of that CONST_INT. */
1617 current_sym_value
= DEBUGGER_AUTO_OFFSET (XEXP (DECL_RTL (decl
), 0));
1620 /* Address might be a MEM, when DECL is a variable-sized object.
1621 Or it might be const0_rtx, meaning previous passes
1622 want us to ignore this variable. */
1625 /* Ok, start a symtab entry and output the variable name. */
1627 /* One slight hitch: if this is a VAR_DECL which is a static
1628 class member, we must put out the mangled name instead of the
1632 /* Note also that static member (variable) names DO NOT begin
1633 with underscores in .stabs directives. */
1634 if (DECL_LANG_SPECIFIC (decl
))
1636 name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl
));
1638 /* Adding 1 here only works on systems
1639 which flush an initial underscore. */
1644 name
= IDENTIFIER_POINTER (DECL_NAME (decl
));
1645 fprintf (asmfile
, "%s \"%s:", ASM_STABS_OP
, name
);
1647 if (letter
) putc (letter
, asmfile
);
1648 dbxout_type (type
, 0);
1649 dbxout_finish_symbol (decl
);
1655 dbxout_prepare_symbol (decl
)
1659 char *filename
= DECL_SOURCE_FILE (decl
);
1661 dbxout_source_file (asmfile
, filename
);
1666 dbxout_finish_symbol (sym
)
1672 line
= DECL_SOURCE_LINE (sym
);
1674 fprintf (asmfile
, "\",%d,0,%d,", current_sym_code
, line
);
1675 if (current_sym_addr
)
1676 output_addr_const (asmfile
, current_sym_addr
);
1678 fprintf (asmfile
, "%d", current_sym_value
);
1679 putc ('\n', asmfile
);
1682 /* Output definitions of all the decls in a chain. */
1690 dbxout_symbol (syms
, 1);
1691 syms
= TREE_CHAIN (syms
);
1695 /* The following two functions output definitions of function parameters.
1696 Each parameter gets a definition locating it in the parameter list.
1697 Each parameter that is a register variable gets a second definition
1698 locating it in the register.
1700 Printing or argument lists in gdb uses the definitions that
1701 locate in the parameter list. But reference to the variable in
1702 expressions uses preferentially the definition as a register. */
1704 /* Output definitions, referring to storage in the parmlist,
1705 of all the parms in PARMS, which is a chain of PARM_DECL nodes. */
1708 dbxout_parms (parms
)
1711 for (; parms
; parms
= TREE_CHAIN (parms
))
1712 if (DECL_NAME (parms
) && TREE_TYPE (parms
) != error_mark_node
)
1714 dbxout_prepare_symbol (parms
);
1716 /* Perform any necessary register eliminations on the parameter's rtl,
1717 so that the debugging output will be accurate. */
1718 DECL_INCOMING_RTL (parms
)
1719 = eliminate_regs (DECL_INCOMING_RTL (parms
), 0, 0);
1720 DECL_RTL (parms
) = eliminate_regs (DECL_RTL (parms
), 0, 0);
1721 #ifdef LEAF_REG_REMAP
1724 leaf_renumber_regs_insn (DECL_INCOMING_RTL (parms
));
1725 leaf_renumber_regs_insn (DECL_RTL (parms
));
1729 if (PARM_PASSED_IN_MEMORY (parms
))
1731 rtx addr
= XEXP (DECL_INCOMING_RTL (parms
), 0);
1733 /* ??? Here we assume that the parm address is indexed
1734 off the frame pointer or arg pointer.
1735 If that is not true, we produce meaningless results,
1736 but do not crash. */
1737 if (GET_CODE (addr
) == PLUS
1738 && GET_CODE (XEXP (addr
, 1)) == CONST_INT
)
1739 current_sym_value
= INTVAL (XEXP (addr
, 1));
1741 current_sym_value
= 0;
1743 current_sym_code
= N_PSYM
;
1744 current_sym_addr
= 0;
1747 if (DECL_NAME (parms
))
1749 current_sym_nchars
= 2 + IDENTIFIER_LENGTH (DECL_NAME (parms
));
1751 fprintf (asmfile
, "%s \"%s:p", ASM_STABS_OP
,
1752 IDENTIFIER_POINTER (DECL_NAME (parms
)));
1756 current_sym_nchars
= 8;
1757 fprintf (asmfile
, "%s \"(anon):p", ASM_STABS_OP
);
1760 if (GET_CODE (DECL_RTL (parms
)) == REG
1761 && REGNO (DECL_RTL (parms
)) >= 0
1762 && REGNO (DECL_RTL (parms
)) < FIRST_PSEUDO_REGISTER
)
1763 dbxout_type (DECL_ARG_TYPE (parms
), 0);
1766 int original_value
= current_sym_value
;
1768 /* This is the case where the parm is passed as an int or double
1769 and it is converted to a char, short or float and stored back
1770 in the parmlist. In this case, describe the parm
1771 with the variable's declared type, and adjust the address
1772 if the least significant bytes (which we are using) are not
1774 #if BYTES_BIG_ENDIAN
1775 if (TREE_TYPE (parms
) != DECL_ARG_TYPE (parms
))
1776 current_sym_value
+= (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms
)))
1777 - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms
))));
1780 if (GET_CODE (DECL_RTL (parms
)) == MEM
1781 && GET_CODE (XEXP (DECL_RTL (parms
), 0)) == PLUS
1782 && GET_CODE (XEXP (XEXP (DECL_RTL (parms
), 0), 1)) == CONST_INT
1783 && INTVAL (XEXP (XEXP (DECL_RTL (parms
), 0), 1)) == current_sym_value
)
1784 dbxout_type (TREE_TYPE (parms
), 0);
1787 current_sym_value
= original_value
;
1788 dbxout_type (DECL_ARG_TYPE (parms
), 0);
1791 current_sym_value
= DEBUGGER_ARG_OFFSET (current_sym_value
, addr
);
1792 dbxout_finish_symbol (parms
);
1794 else if (GET_CODE (DECL_RTL (parms
)) == REG
)
1797 /* Parm passed in registers and lives in registers or nowhere. */
1799 current_sym_code
= N_RSYM
;
1800 current_sym_addr
= 0;
1802 /* If parm lives in a register, use that register;
1803 pretend the parm was passed there. It would be more consistent
1804 to describe the register where the parm was passed,
1805 but in practice that register usually holds something else. */
1806 if (REGNO (DECL_RTL (parms
)) >= 0
1807 && REGNO (DECL_RTL (parms
)) < FIRST_PSEUDO_REGISTER
)
1808 best_rtl
= DECL_RTL (parms
);
1809 /* If the parm lives nowhere,
1810 use the register where it was passed. */
1812 best_rtl
= DECL_INCOMING_RTL (parms
);
1813 current_sym_value
= DBX_REGISTER_NUMBER (REGNO (best_rtl
));
1816 if (DECL_NAME (parms
))
1818 current_sym_nchars
= 2 + IDENTIFIER_LENGTH (DECL_NAME (parms
));
1819 fprintf (asmfile
, "%s \"%s:P", ASM_STABS_OP
,
1820 IDENTIFIER_POINTER (DECL_NAME (parms
)));
1824 current_sym_nchars
= 8;
1825 fprintf (asmfile
, "%s \"(anon):P", ASM_STABS_OP
);
1828 dbxout_type (DECL_ARG_TYPE (parms
), 0);
1829 dbxout_finish_symbol (parms
);
1831 else if (GET_CODE (DECL_RTL (parms
)) == MEM
1832 && XEXP (DECL_RTL (parms
), 0) != const0_rtx
)
1834 /* Parm was passed in registers but lives on the stack. */
1836 current_sym_code
= N_PSYM
;
1837 /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...))),
1838 in which case we want the value of that CONST_INT,
1839 or (MEM (REG ...)) or (MEM (MEM ...)),
1840 in which case we use a value of zero. */
1841 if (GET_CODE (XEXP (DECL_RTL (parms
), 0)) == REG
1842 || GET_CODE (XEXP (DECL_RTL (parms
), 0)) == MEM
)
1843 current_sym_value
= 0;
1845 current_sym_value
= INTVAL (XEXP (XEXP (DECL_RTL (parms
), 0), 1));
1846 current_sym_addr
= 0;
1849 if (DECL_NAME (parms
))
1851 current_sym_nchars
= 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms
)));
1853 fprintf (asmfile
, "%s \"%s:p", ASM_STABS_OP
,
1854 IDENTIFIER_POINTER (DECL_NAME (parms
)));
1858 current_sym_nchars
= 8;
1859 fprintf (asmfile
, "%s \"(anon):p", ASM_STABS_OP
);
1863 = DEBUGGER_ARG_OFFSET (current_sym_value
,
1864 XEXP (DECL_RTL (parms
), 0));
1865 dbxout_type (TREE_TYPE (parms
), 0);
1866 dbxout_finish_symbol (parms
);
1871 /* Output definitions for the places where parms live during the function,
1872 when different from where they were passed, when the parms were passed
1875 It is not useful to do this for parms passed in registers
1876 that live during the function in different registers, because it is
1877 impossible to look in the passed register for the passed value,
1878 so we use the within-the-function register to begin with.
1880 PARMS is a chain of PARM_DECL nodes. */
1883 dbxout_reg_parms (parms
)
1886 for (; parms
; parms
= TREE_CHAIN (parms
))
1887 if (DECL_NAME (parms
))
1889 dbxout_prepare_symbol (parms
);
1891 /* Report parms that live in registers during the function
1892 but were passed in memory. */
1893 if (GET_CODE (DECL_RTL (parms
)) == REG
1894 && REGNO (DECL_RTL (parms
)) >= 0
1895 && REGNO (DECL_RTL (parms
)) < FIRST_PSEUDO_REGISTER
1896 && PARM_PASSED_IN_MEMORY (parms
))
1898 current_sym_code
= N_RSYM
;
1899 current_sym_value
= DBX_REGISTER_NUMBER (REGNO (DECL_RTL (parms
)));
1900 current_sym_addr
= 0;
1903 if (DECL_NAME (parms
))
1905 current_sym_nchars
= 2 + IDENTIFIER_LENGTH (DECL_NAME (parms
));
1906 fprintf (asmfile
, "%s \"%s:r", ASM_STABS_OP
,
1907 IDENTIFIER_POINTER (DECL_NAME (parms
)));
1911 current_sym_nchars
= 8;
1912 fprintf (asmfile
, "%s \"(anon):r", ASM_STABS_OP
);
1914 dbxout_type (TREE_TYPE (parms
), 0);
1915 dbxout_finish_symbol (parms
);
1917 /* Report parms that live in memory but not where they were passed. */
1918 else if (GET_CODE (DECL_RTL (parms
)) == MEM
1919 && GET_CODE (XEXP (DECL_RTL (parms
), 0)) == PLUS
1920 && GET_CODE (XEXP (XEXP (DECL_RTL (parms
), 0), 1)) == CONST_INT
1921 && PARM_PASSED_IN_MEMORY (parms
)
1922 && ! rtx_equal_p (DECL_RTL (parms
), DECL_INCOMING_RTL (parms
)))
1924 #if 0 /* ??? It is not clear yet what should replace this. */
1925 int offset
= DECL_OFFSET (parms
) / BITS_PER_UNIT
;
1926 /* A parm declared char is really passed as an int,
1927 so it occupies the least significant bytes.
1928 On a big-endian machine those are not the low-numbered ones. */
1929 #if BYTES_BIG_ENDIAN
1930 if (offset
!= -1 && TREE_TYPE (parms
) != DECL_ARG_TYPE (parms
))
1931 offset
+= (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms
)))
1932 - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms
))));
1934 if (INTVAL (XEXP (XEXP (DECL_RTL (parms
), 0), 1)) != offset
) {...}
1936 current_sym_code
= N_LSYM
;
1937 current_sym_value
= DEBUGGER_AUTO_OFFSET (XEXP (DECL_RTL (parms
), 0));
1938 current_sym_addr
= 0;
1940 if (DECL_NAME (parms
))
1942 current_sym_nchars
= 2 + IDENTIFIER_LENGTH (DECL_NAME (parms
));
1943 fprintf (asmfile
, "%s \"%s:", ASM_STABS_OP
,
1944 IDENTIFIER_POINTER (DECL_NAME (parms
)));
1948 current_sym_nchars
= 8;
1949 fprintf (asmfile
, "%s \"(anon):", ASM_STABS_OP
);
1951 dbxout_type (TREE_TYPE (parms
), 0);
1952 dbxout_finish_symbol (parms
);
1957 /* Given a chain of ..._TYPE nodes (as come in a parameter list),
1958 output definitions of those names, in raw form */
1966 putc (',', asmfile
);
1967 dbxout_type (TREE_VALUE (args
), 0);
1969 args
= TREE_CHAIN (args
);
1973 /* Given a chain of ..._TYPE nodes,
1974 find those which have typedef names and output those names.
1975 This is to ensure those types get output. */
1978 dbxout_types (types
)
1979 register tree types
;
1983 if (TYPE_NAME (types
)
1984 && TREE_CODE (TYPE_NAME (types
)) == TYPE_DECL
1985 && ! TREE_ASM_WRITTEN (TYPE_NAME (types
)))
1986 dbxout_symbol (TYPE_NAME (types
), 1);
1987 types
= TREE_CHAIN (types
);
1991 /* Output everything about a symbol block (a BLOCK node
1992 that represents a scope level),
1993 including recursive output of contained blocks.
1995 BLOCK is the BLOCK node.
1996 DEPTH is its depth within containing symbol blocks.
1997 ARGS is usually zero; but for the outermost block of the
1998 body of a function, it is a chain of PARM_DECLs for the function parameters.
1999 We output definitions of all the register parms
2000 as if they were local variables of that block.
2002 If -g1 was used, we count blocks just the same, but output nothing
2003 except for the outermost block.
2005 Actually, BLOCK may be several blocks chained together.
2006 We handle them all in sequence. */
2009 dbxout_block (block
, depth
, args
)
2010 register tree block
;
2018 /* Ignore blocks never expanded or otherwise marked as real. */
2019 if (TREE_USED (block
))
2021 #ifndef DBX_LBRAC_FIRST
2022 /* In dbx format, the syms of a block come before the N_LBRAC. */
2023 if (debug_info_level
!= DINFO_LEVEL_TERSE
|| depth
== 0)
2024 dbxout_syms (BLOCK_VARS (block
));
2026 dbxout_reg_parms (args
);
2029 /* Now output an N_LBRAC symbol to represent the beginning of
2030 the block. Use the block's tree-walk order to generate
2031 the assembler symbols LBBn and LBEn
2032 that final will define around the code in this block. */
2033 if (depth
> 0 && debug_info_level
!= DINFO_LEVEL_TERSE
)
2036 blocknum
= next_block_number
++;
2037 ASM_GENERATE_INTERNAL_LABEL (buf
, "LBB", blocknum
);
2039 if (BLOCK_HANDLER_BLOCK (block
))
2041 /* A catch block. Must precede N_LBRAC. */
2042 tree decl
= BLOCK_VARS (block
);
2045 #ifdef DBX_OUTPUT_CATCH
2046 DBX_OUTPUT_CATCH (asmfile
, decl
, buf
);
2048 fprintf (asmfile
, "%s \"%s:C1\",%d,0,0,",
2050 IDENTIFIER_POINTER (DECL_NAME (decl
)), N_CATCH
);
2051 assemble_name (asmfile
, buf
);
2052 fprintf (asmfile
, "\n");
2054 decl
= TREE_CHAIN (decl
);
2058 fprintf (asmfile
, "%s %d,0,0,", ASM_STABN_OP
, N_LBRAC
);
2059 assemble_name (asmfile
, buf
);
2060 fprintf (asmfile
, "\n");
2063 /* Count blocks the same way regardless of debug_info_level. */
2064 next_block_number
++;
2066 #ifdef DBX_LBRAC_FIRST
2067 /* On some weird machines, the syms of a block
2068 come after the N_LBRAC. */
2069 if (debug_info_level
!= DINFO_LEVEL_TERSE
|| depth
== 0)
2070 dbxout_syms (BLOCK_VARS (block
));
2072 dbxout_reg_parms (args
);
2075 /* Output the subblocks. */
2076 dbxout_block (BLOCK_SUBBLOCKS (block
), depth
+ 1, 0);
2078 /* Refer to the marker for the end of the block. */
2079 if (depth
> 0 && debug_info_level
!= DINFO_LEVEL_TERSE
)
2082 ASM_GENERATE_INTERNAL_LABEL (buf
, "LBE", blocknum
);
2083 fprintf (asmfile
, "%s %d,0,0,", ASM_STABN_OP
, N_RBRAC
);
2084 assemble_name (asmfile
, buf
);
2085 fprintf (asmfile
, "\n");
2088 block
= BLOCK_CHAIN (block
);
2092 /* Output the information about a function and its arguments and result.
2093 Usually this follows the function's code,
2094 but on some systems, it comes before. */
2097 dbxout_really_begin_function (decl
)
2100 dbxout_symbol (decl
, 0);
2101 dbxout_parms (DECL_ARGUMENTS (decl
));
2102 if (DECL_NAME (DECL_RESULT (decl
)) != 0)
2103 dbxout_symbol (DECL_RESULT (decl
), 1);
2106 /* Called at beginning of output of function definition. */
2109 dbxout_begin_function (decl
)
2112 #ifdef DBX_FUNCTION_FIRST
2113 dbxout_really_begin_function (decl
);
2117 /* Output dbx data for a function definition.
2118 This includes a definition of the function name itself (a symbol),
2119 definitions of the parameters (locating them in the parameter list)
2120 and then output the block that makes up the function's body
2121 (including all the auto variables of the function). */
2124 dbxout_function (decl
)
2127 #ifndef DBX_FUNCTION_FIRST
2128 dbxout_really_begin_function (decl
);
2130 dbxout_block (DECL_INITIAL (decl
), 0, DECL_ARGUMENTS (decl
));
2131 #ifdef DBX_OUTPUT_FUNCTION_END
2132 DBX_OUTPUT_FUNCTION_END (asmfile
, decl
);
2136 #else /* not DBX_DEBUGGING_INFO */
2139 dbxout_init (asm_file
, input_file_name
)
2141 char *input_file_name
;
2145 dbxout_symbol (decl
, local
)
2151 dbxout_types (types
)
2152 register tree types
;
2156 dbxout_function (decl
)
2160 #endif /* DBX_DEBUGGING_INFO */