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. */
78 #include "insn-config.h"
86 #ifdef XCOFF_DEBUGGING_INFO
91 #define ASM_STABS_OP ".stabs"
95 #define ASM_STABN_OP ".stabn"
98 #ifndef DBX_TYPE_DECL_STABS_CODE
99 #define DBX_TYPE_DECL_STABS_CODE N_LSYM
102 #ifndef DBX_STATIC_CONST_VAR_CODE
103 #define DBX_STATIC_CONST_VAR_CODE N_FUN
106 #ifndef DBX_REGPARM_STABS_CODE
107 #define DBX_REGPARM_STABS_CODE N_RSYM
110 #ifndef DBX_REGPARM_STABS_LETTER
111 #define DBX_REGPARM_STABS_LETTER 'P'
114 #ifndef DBX_MEMPARM_STABS_LETTER
115 #define DBX_MEMPARM_STABS_LETTER 'p'
118 /* Nonzero means if the type has methods, only output debugging
119 information if methods are actually written to the asm file. */
121 static int flag_minimal_debug = 1;
123 /* Nonzero if we have actually used any of the GDB extensions
124 to the debugging format. The idea is that we use them for the
125 first time only if there's a strong reason, but once we have done that,
126 we use them whenever convenient. */
128 static int have_used_extensions = 0;
132 /* Typical USG systems don't have stab.h, and they also have
133 no use for DBX-format debugging info. */
135 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
137 #ifdef DEBUG_SYMS_TEXT
138 #define FORCE_TEXT text_section ();
143 #if defined (USG) || defined (NO_STAB_H)
144 #include "gstab.h" /* If doing DBX on sysV, use our own stab.h. */
146 #include <stab.h> /* On BSD, use the system's stab.h. */
148 /* This is a GNU extension we need to reference in this file. */
155 #define STAB_CODE_TYPE enum __stab_debug_code
157 #define STAB_CODE_TYPE int
160 /* 1 if PARM is passed to this function in memory. */
162 #define PARM_PASSED_IN_MEMORY(PARM) \
163 (GET_CODE (DECL_INCOMING_RTL (PARM)) == MEM)
165 /* A C expression for the integer offset value of an automatic variable
166 (N_LSYM) having address X (an RTX). */
167 #ifndef DEBUGGER_AUTO_OFFSET
168 #define DEBUGGER_AUTO_OFFSET(X) \
169 (GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0)
172 /* A C expression for the integer offset value of an argument (N_PSYM)
173 having address X (an RTX). The nominal offset is OFFSET. */
174 #ifndef DEBUGGER_ARG_OFFSET
175 #define DEBUGGER_ARG_OFFSET(OFFSET, X) (OFFSET)
178 /* Stream for writing to assembler file. */
180 static FILE *asmfile;
182 /* Last source file name mentioned in a NOTE insn. */
184 static char *lastfile;
186 /* Current working directory. */
190 enum typestatus {TYPE_UNSEEN, TYPE_XREF, TYPE_DEFINED};
192 /* Vector recording the status of describing C data types.
193 When we first notice a data type (a tree node),
194 we assign it a number using next_type_number.
195 That is its index in this vector.
196 The vector element says whether we have yet output
197 the definition of the type. TYPE_XREF says we have
198 output it as a cross-reference only. */
200 enum typestatus *typevec;
202 /* Number of elements of space allocated in `typevec'. */
204 static int typevec_len;
206 /* In dbx output, each type gets a unique number.
207 This is the number for the next type output.
208 The number, once assigned, is in the TYPE_SYMTAB_ADDRESS field. */
210 static int next_type_number;
212 /* In dbx output, we must assign symbol-blocks id numbers
213 in the order in which their beginnings are encountered.
214 We output debugging info that refers to the beginning and
215 end of the ranges of code in each block
216 with assembler labels LBBn and LBEn, where n is the block number.
217 The labels are generated in final, which assigns numbers to the
218 blocks in the same way. */
220 static int next_block_number;
222 /* These variables are for dbxout_symbol to communicate to
223 dbxout_finish_symbol.
224 current_sym_code is the symbol-type-code, a symbol N_... define in stab.h.
225 current_sym_value and current_sym_addr are two ways to address the
226 value to store in the symtab entry.
227 current_sym_addr if nonzero represents the value as an rtx.
228 If that is zero, current_sym_value is used. This is used
229 when the value is an offset (such as for auto variables,
230 register variables and parms). */
232 static STAB_CODE_TYPE current_sym_code;
233 static int current_sym_value;
234 static rtx current_sym_addr;
236 /* Number of chars of symbol-description generated so far for the
237 current symbol. Used by CHARS and CONTIN. */
239 static int current_sym_nchars;
241 /* Report having output N chars of the current symbol-description. */
243 #define CHARS(N) (current_sym_nchars += (N))
245 /* Break the current symbol-description, generating a continuation,
246 if it has become long. */
248 #ifndef DBX_CONTIN_LENGTH
249 #define DBX_CONTIN_LENGTH 80
252 #if DBX_CONTIN_LENGTH > 0
254 do {if (current_sym_nchars > DBX_CONTIN_LENGTH) dbxout_continue ();} while (0)
259 void dbxout_types ();
261 void dbxout_symbol ();
262 static void dbxout_type_name ();
263 static void dbxout_type ();
264 static void dbxout_typedefs ();
265 static void dbxout_prepare_symbol ();
266 static void dbxout_finish_symbol ();
267 static void dbxout_continue ();
268 static void print_int_cst_octal ();
269 static void print_octal ();
271 #if 0 /* Not clear we will actually need this. */
273 /* Return the absolutized filename for the given relative
274 filename. Note that if that filename is already absolute, it may
275 still be returned in a modified form because this routine also
276 eliminates redundant slashes and single dots and eliminates double
277 dots to get a shortest possible filename from the given input
278 filename. The absolutization of relative filenames is made by
279 assuming that the given filename is to be taken as relative to
280 the first argument (cwd) or to the current directory if cwd is
284 abspath (rel_filename)
287 /* Setup the current working directory as needed. */
289 = (char *) alloca (strlen (cwd) + strlen (rel_filename) + 1);
290 char *endp = abs_buffer;
294 /* Copy the filename (possibly preceded by the current working
295 directory name) into the absolutization buffer. */
300 if (rel_filename[0] != '/')
303 while (*endp++ = *src_p++)
305 *(endp-1) = '/'; /* overwrite null */
307 src_p = rel_filename;
308 while (*endp++ = *src_p++)
313 /* Now make a copy of abs_buffer into abs_buffer, shortening the
314 filename (by taking out slashes and dots) as we go. */
316 outp = inp = abs_buffer;
317 *outp++ = *inp++; /* copy first slash */
322 else if (inp[0] == '/' && outp[-1] == '/')
327 else if (inp[0] == '.' && outp[-1] == '/')
331 else if (inp[1] == '/')
336 else if ((inp[1] == '.') && (inp[2] == 0 || inp[2] == '/'))
338 inp += (inp[2] == '/') ? 3 : 2;
340 while (outp >= abs_buffer && *outp != '/')
342 if (outp < abs_buffer)
344 /* Catch cases like /.. where we try to backup to a
345 point above the absolute root of the logical file
348 fprintf (stderr, "%s: invalid file name: %s\n",
349 pname, rel_filename);
359 /* On exit, make sure that there is a trailing null, and make sure that
360 the last character of the returned string is *not* a slash. */
366 /* Make a copy (in the heap) of the stuff left in the absolutization
367 buffer and return a pointer to the copy. */
369 value = (char *) oballoc (strlen (abs_buffer) + 1);
370 strcpy (value, abs_buffer);
375 /* At the beginning of compilation, start writing the symbol table.
376 Initialize `typevec' and output the standard data types of C. */
379 dbxout_init (asm_file, input_file_name, syms)
381 char *input_file_name;
384 char ltext_label_name[100];
389 typevec = (enum typestatus *) xmalloc (typevec_len * sizeof typevec[0]);
390 bzero (typevec, typevec_len * sizeof typevec[0]);
392 /* Convert Ltext into the appropriate format for local labels in case
393 the system doesn't insert underscores in front of user generated
395 ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext", 0);
397 /* Put the current working directory in an N_SO symbol. */
398 #ifndef DBX_WORKING_DIRECTORY /* Only some versions of DBX want this,
399 but GDB always does. */
400 if (use_gnu_debug_info_extensions)
403 if (cwd || (cwd = getpwd ()))
405 #ifdef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
406 DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (asmfile, cwd);
407 #else /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
408 fprintf (asmfile, "%s \"%s/\",%d,0,0,%s\n", ASM_STABS_OP,
409 cwd, N_SO, <ext_label_name[1]);
410 #endif /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
414 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILENAME
415 /* This should NOT be DBX_OUTPUT_SOURCE_FILENAME. That
416 would give us an N_SOL, and we want an N_SO. */
417 DBX_OUTPUT_MAIN_SOURCE_FILENAME (asmfile, input_file_name);
418 #else /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
419 /* We include outputting `Ltext:' here,
420 because that gives you a way to override it. */
421 /* Used to put `Ltext:' before the reference, but that loses on sun 4. */
422 fprintf (asmfile, "%s \"%s\",%d,0,0,%s\n", ASM_STABS_OP, input_file_name,
423 N_SO, <ext_label_name[1]);
425 ASM_OUTPUT_INTERNAL_LABEL (asmfile, "Ltext", 0);
426 #endif /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
428 /* Possibly output something to inform GDB that this compilation was by
429 GCC. It's easier for GDB to parse it when after the N_SO's. This
430 is used in Solaris 2. */
431 #ifdef ASM_IDENTIFY_GCC_AFTER_SOURCE
432 ASM_IDENTIFY_GCC_AFTER_SOURCE (asmfile);
435 lastfile = input_file_name;
437 next_type_number = 1;
438 next_block_number = 2;
440 /* Make sure that types `int' and `char' have numbers 1 and 2.
441 Definitions of other integer types will refer to those numbers.
442 (Actually it should no longer matter what their numbers are.
443 Also, if any types with tags have been defined, dbxout_symbol
444 will output them first, so the numbers won't be 1 and 2. That
445 happens in C++. So it's a good thing it should no longer matter). */
447 #ifdef DBX_OUTPUT_STANDARD_TYPES
448 DBX_OUTPUT_STANDARD_TYPES (syms);
450 dbxout_symbol (TYPE_NAME (integer_type_node), 0);
451 dbxout_symbol (TYPE_NAME (char_type_node), 0);
454 /* Get all permanent types that have typedef names,
455 and output them all, except for those already output. */
457 dbxout_typedefs (syms);
460 /* Output any typedef names for types described by TYPE_DECLs in SYMS,
461 in the reverse order from that which is found in SYMS. */
464 dbxout_typedefs (syms)
469 dbxout_typedefs (TREE_CHAIN (syms));
470 if (TREE_CODE (syms) == TYPE_DECL)
472 tree type = TREE_TYPE (syms);
474 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
475 && ! TREE_ASM_WRITTEN (TYPE_NAME (type)))
476 dbxout_symbol (TYPE_NAME (type), 0);
481 /* Output debugging info to FILE to switch to sourcefile FILENAME. */
484 dbxout_source_file (file, filename)
488 char ltext_label_name[100];
490 if (filename && (lastfile == 0 || strcmp (filename, lastfile)))
492 #ifdef DBX_OUTPUT_SOURCE_FILENAME
493 DBX_OUTPUT_SOURCE_FILENAME (file, filename);
495 ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext", 0);
496 fprintf (file, "%s \"%s\",%d,0,0,%s\n", ASM_STABS_OP,
497 filename, N_SOL, <ext_label_name[1]);
503 /* Output a line number symbol entry into output stream FILE,
504 for source file FILENAME and line number LINENO. */
507 dbxout_source_line (file, filename, lineno)
512 dbxout_source_file (file, filename);
514 #ifdef ASM_OUTPUT_SOURCE_LINE
515 ASM_OUTPUT_SOURCE_LINE (file, lineno);
517 fprintf (file, "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno);
521 /* At the end of compilation, finish writing the symbol table.
522 Unless you define DBX_OUTPUT_MAIN_SOURCE_FILE_END, the default is
526 dbxout_finish (file, filename)
530 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILE_END
531 DBX_OUTPUT_MAIN_SOURCE_FILE_END (file, filename);
532 #endif /* DBX_OUTPUT_MAIN_SOURCE_FILE_END */
535 /* Continue a symbol-description that gets too big.
536 End one symbol table entry with a double-backslash
537 and start a new one, eventually producing something like
538 .stabs "start......\\",code,0,value
539 .stabs "...rest",code,0,value */
544 #ifdef DBX_CONTIN_CHAR
545 fprintf (asmfile, "%c", DBX_CONTIN_CHAR);
547 fprintf (asmfile, "\\\\");
549 dbxout_finish_symbol (NULL_TREE);
550 fprintf (asmfile, "%s \"", ASM_STABS_OP);
551 current_sym_nchars = 0;
554 /* Subroutine of `dbxout_type'. Output the type fields of TYPE.
555 This must be a separate function because anonymous unions require
559 dbxout_type_fields (type)
563 for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
565 /* Output the name, type, position (in bits), size (in bits)
567 if (DECL_NAME (tem) == NULL_TREE
568 && TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE)
569 dbxout_type_fields (TREE_TYPE (tem));
570 /* Omit here local type decls until we know how to support them. */
571 else if (TREE_CODE (tem) == TYPE_DECL)
573 /* Omit here the nameless fields that are used to skip bits. */
574 else if (DECL_NAME (tem) != 0 && TREE_CODE (tem) != CONST_DECL)
576 /* Continue the line if necessary,
577 but not before the first field. */
578 if (tem != TYPE_FIELDS (type))
581 if (use_gnu_debug_info_extensions
582 && flag_minimal_debug
583 && TREE_CODE (tem) == FIELD_DECL
584 && DECL_VIRTUAL_P (tem)
585 && DECL_ASSEMBLER_NAME (tem))
587 have_used_extensions = 1;
588 CHARS (3 + IDENTIFIER_LENGTH (DECL_NAME (TYPE_NAME (DECL_FCONTEXT (tem)))));
589 fputs (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (tem)), asmfile);
590 dbxout_type (DECL_FCONTEXT (tem), 0, 0);
591 fprintf (asmfile, ":");
592 dbxout_type (TREE_TYPE (tem), 0, 0);
593 fprintf (asmfile, ",%d;",
594 TREE_INT_CST_LOW (DECL_FIELD_BITPOS (tem)));
598 fprintf (asmfile, "%s:", IDENTIFIER_POINTER (DECL_NAME (tem)));
599 CHARS (2 + IDENTIFIER_LENGTH (DECL_NAME (tem)));
601 if (use_gnu_debug_info_extensions
602 && (TREE_PRIVATE (tem) || TREE_PROTECTED (tem)
603 || TREE_CODE (tem) != FIELD_DECL))
605 have_used_extensions = 1;
607 putc ((TREE_PRIVATE (tem) ? '0'
608 : TREE_PROTECTED (tem) ? '1' : '2'),
613 dbxout_type ((TREE_CODE (tem) == FIELD_DECL
614 && DECL_BIT_FIELD_TYPE (tem))
615 ? DECL_BIT_FIELD_TYPE (tem)
616 : TREE_TYPE (tem), 0, 0);
618 if (TREE_CODE (tem) == VAR_DECL)
620 if (TREE_STATIC (tem) && use_gnu_debug_info_extensions)
622 char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (tem));
623 have_used_extensions = 1;
624 fprintf (asmfile, ":%s;", name);
625 CHARS (strlen (name));
629 /* If TEM is non-static, GDB won't understand it. */
630 fprintf (asmfile, ",0,0;");
633 else if (TREE_CODE (DECL_FIELD_BITPOS (tem)) == INTEGER_CST)
635 fprintf (asmfile, ",%d,%d;",
636 TREE_INT_CST_LOW (DECL_FIELD_BITPOS (tem)),
637 TREE_INT_CST_LOW (DECL_SIZE (tem)));
640 /* This has yet to be implemented. */
647 /* Subroutine of `dbxout_type_methods'. Output debug info about the
648 method described DECL. DEBUG_NAME is an encoding of the method's
649 type signature. ??? We may be able to do without DEBUG_NAME altogether
653 dbxout_type_method_1 (decl, debug_name)
657 tree firstarg = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)));
660 if (TREE_CODE (TREE_TYPE (decl)) == FUNCTION_TYPE)
662 else /* it's a METHOD_TYPE. */
664 /* A for normal functions.
665 B for `const' member functions.
666 C for `volatile' member functions.
667 D for `const volatile' member functions. */
668 if (TYPE_READONLY (TREE_TYPE (firstarg)))
670 if (TYPE_VOLATILE (TREE_TYPE (firstarg)))
673 if (DECL_VINDEX (decl))
679 fprintf (asmfile, ":%s;%c%c%c", debug_name,
680 TREE_PRIVATE (decl) ? '0' : TREE_PROTECTED (decl) ? '1' : '2', c1, c2);
681 CHARS (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (decl)) + 6
682 - (debug_name - IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
683 if (DECL_VINDEX (decl))
685 fprintf (asmfile, "%d;",
686 TREE_INT_CST_LOW (DECL_VINDEX (decl)));
687 dbxout_type (DECL_CONTEXT (decl), 0, 0);
688 fprintf (asmfile, ";");
693 /* Subroutine of `dbxout_type'. Output debug info about the methods defined
697 dbxout_type_methods (type)
700 /* C++: put out the method names and their parameter lists */
701 tree methods = TYPE_METHODS (type);
703 register tree fndecl;
705 char formatted_type_identifier_length[16];
706 register int type_identifier_length;
708 if (methods == NULL_TREE)
711 type_encoding = DECL_NAME (TYPE_NAME (type));
713 /* C++: Template classes break some assumptions made by this code about
714 the class names, constructor names, and encodings for assembler
715 label names. For now, disable output of dbx info for them. */
717 char *ptr = IDENTIFIER_POINTER (type_encoding);
718 /* This should use index. (mrs) */
719 while (*ptr && *ptr != '<') ptr++;
726 warning ("dbx info for template class methods not yet supported");
732 type_identifier_length = IDENTIFIER_LENGTH (type_encoding);
734 sprintf(formatted_type_identifier_length, "%d", type_identifier_length);
736 if (TREE_CODE (methods) == FUNCTION_DECL)
738 else if (TREE_VEC_ELT (methods, 0) != NULL_TREE)
739 fndecl = TREE_VEC_ELT (methods, 0);
741 fndecl = TREE_VEC_ELT (methods, 1);
745 tree name = DECL_NAME (fndecl);
748 /* Group together all the methods for the same operation.
749 These differ in the types of the arguments. */
750 for (last = NULL_TREE;
751 fndecl && (last == NULL_TREE || DECL_NAME (fndecl) == DECL_NAME (last));
752 fndecl = TREE_CHAIN (fndecl))
753 /* Output the name of the field (after overloading), as
754 well as the name of the field before overloading, along
755 with its parameter list */
757 /* This is the "mangled" name of the method.
758 It encodes the argument types. */
759 char *debug_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl));
766 if (DECL_IGNORED_P (fndecl))
769 if (flag_minimal_debug)
771 /* Detect ordinary methods because their mangled names
772 start with the operation name. */
773 if (!strncmp (IDENTIFIER_POINTER (name), debug_name,
774 IDENTIFIER_LENGTH (name)))
776 debug_name += IDENTIFIER_LENGTH (name);
777 if (debug_name[0] == '_' && debug_name[1] == '_')
779 char *method_name = debug_name + 2;
780 char *length_ptr = formatted_type_identifier_length;
781 /* Get past const and volatile qualifiers. */
782 while (*method_name == 'C' || *method_name == 'V')
784 /* Skip digits for length of type_encoding. */
785 while (*method_name == *length_ptr && *length_ptr)
786 length_ptr++, method_name++;
787 if (! strncmp (method_name,
788 IDENTIFIER_POINTER (type_encoding),
789 type_identifier_length))
790 method_name += type_identifier_length;
791 debug_name = method_name;
794 /* Detect constructors by their style of name mangling. */
795 else if (debug_name[0] == '_' && debug_name[1] == '_')
797 char *ctor_name = debug_name + 2;
798 char *length_ptr = formatted_type_identifier_length;
799 while (*ctor_name == 'C' || *ctor_name == 'V')
801 /* Skip digits for length of type_encoding. */
802 while (*ctor_name == *length_ptr && *length_ptr)
803 length_ptr++, ctor_name++;
804 if (!strncmp (IDENTIFIER_POINTER (type_encoding), ctor_name,
805 type_identifier_length))
806 debug_name = ctor_name + type_identifier_length;
808 /* The other alternative is a destructor. */
812 /* Output the operation name just once, for the first method
816 fprintf (asmfile, "%s::", IDENTIFIER_POINTER (name));
817 CHARS (IDENTIFIER_LENGTH (name) + 2);
822 dbxout_type (TREE_TYPE (fndecl), 0, destructor);
824 dbxout_type_method_1 (fndecl, debug_name);
834 /* Output a reference to a type. If the type has not yet been
835 described in the dbx output, output its definition now.
836 For a type already defined, just refer to its definition
837 using the type number.
839 If FULL is nonzero, and the type has been described only with
840 a forward-reference, output the definition now.
841 If FULL is zero in this case, just refer to the forward-reference
842 using the number previously allocated.
844 If SHOW_ARG_TYPES is nonzero, we output a description of the argument
845 types for a METHOD_TYPE. */
848 dbxout_type (type, full, show_arg_types)
855 /* If there was an input error and we don't really have a type,
856 avoid crashing and write something that is at least valid
857 by assuming `int'. */
858 if (type == error_mark_node)
859 type = integer_type_node;
862 type = TYPE_MAIN_VARIANT (type);
864 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
865 && DECL_IGNORED_P (TYPE_NAME (type)))
869 if (TYPE_SYMTAB_ADDRESS (type) == 0)
871 /* Type has no dbx number assigned. Assign next available number. */
872 TYPE_SYMTAB_ADDRESS (type) = next_type_number++;
874 /* Make sure type vector is long enough to record about this type. */
876 if (next_type_number == typevec_len)
878 typevec = (enum typestatus *) xrealloc (typevec, typevec_len * 2 * sizeof typevec[0]);
879 bzero (typevec + typevec_len, typevec_len * sizeof typevec[0]);
884 /* Output the number of this type, to refer to it. */
885 fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (type));
888 #ifdef DBX_TYPE_DEFINED
889 if (DBX_TYPE_DEFINED (type))
893 /* If this type's definition has been output or is now being output,
896 switch (typevec[TYPE_SYMTAB_ADDRESS (type)])
901 /* If we have already had a cross reference,
902 and either that's all we want or that's the best we could do,
903 don't repeat the cross reference.
904 Sun dbx crashes if we do. */
905 if (! full || TYPE_SIZE (type) == 0
906 /* No way in DBX fmt to describe a variable size. */
907 || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
915 /* For systems where dbx output does not allow the `=xsNAME:' syntax,
916 leave the type-number completely undefined rather than output
917 a cross-reference. */
918 if (TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
919 || TREE_CODE (type) == ENUMERAL_TYPE)
921 if ((TYPE_NAME (type) != 0 && !full)
922 || TYPE_SIZE (type) == 0)
924 typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_XREF;
929 /* Output a definition now. */
931 fprintf (asmfile, "=");
934 /* Mark it as defined, so that if it is self-referent
935 we will not get into an infinite recursion of definitions. */
937 typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_DEFINED;
939 switch (TREE_CODE (type))
943 /* For a void type, just define it as itself; ie, "5=5".
944 This makes us consider it defined
945 without saying what it is. The debugger will make it
946 a void type when the reference is seen, and nothing will
947 ever override that default. */
948 fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (type));
953 if (type == char_type_node && ! TREE_UNSIGNED (type))
954 /* Output the type `char' as a subrange of itself!
955 I don't understand this definition, just copied it
956 from the output of pcc.
957 This used to use `r2' explicitly and we used to
958 take care to make sure that `char' was type number 2. */
959 fprintf (asmfile, "r%d;0;127;", TYPE_SYMTAB_ADDRESS (type));
961 else if (TYPE_PRECISION (type) > BITS_PER_WORD)
963 /* This used to say `r1' and we used to take care
964 to make sure that `int' was type number 1. */
965 fprintf (asmfile, "r%d;", TYPE_SYMTAB_ADDRESS (integer_type_node));
966 print_int_cst_octal (TYPE_MIN_VALUE (type));
967 fprintf (asmfile, ";");
968 print_int_cst_octal (TYPE_MAX_VALUE (type));
969 fprintf (asmfile, ";");
973 /* Output other integer types as subranges of `int'. */
974 /* This used to say `r1' and we used to take care
975 to make sure that `int' was type number 1. */
976 fprintf (asmfile, "r%d;%d;%d;",
977 TYPE_SYMTAB_ADDRESS (integer_type_node),
978 TREE_INT_CST_LOW (TYPE_MIN_VALUE (type)),
979 TREE_INT_CST_LOW (TYPE_MAX_VALUE (type)));
984 /* This used to say `r1' and we used to take care
985 to make sure that `int' was type number 1. */
986 fprintf (asmfile, "r%d;%d;0;", TYPE_SYMTAB_ADDRESS (integer_type_node),
987 TREE_INT_CST_LOW (size_in_bytes (type)));
992 /* Output "a" followed by a range type definition
993 for the index type of the array
994 followed by a reference to the target-type.
995 ar1;0;N;M for an array of type M and size N. */
996 /* This used to say `r1' and we used to take care
997 to make sure that `int' was type number 1. */
998 fprintf (asmfile, "ar%d;0;%d;", TYPE_SYMTAB_ADDRESS (integer_type_node),
1001 ? TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type)))
1004 dbxout_type (TREE_TYPE (type), 0, 0);
1010 int i, n_baseclasses = 0;
1012 if (TYPE_BINFO (type) != 0 && TYPE_BINFO_BASETYPES (type) != 0)
1013 n_baseclasses = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (type));
1015 /* Output a structure type. */
1016 if ((TYPE_NAME (type) != 0
1017 #if 0 /* Tiemann says this creates output tha "confuses GDB".
1018 Too bad the info is so vague. Hope this doesn't lose. */
1019 && ! (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1020 && DECL_IGNORED_P (TYPE_NAME (type)))
1023 || TYPE_SIZE (type) == 0
1024 /* No way in DBX fmt to describe a variable size. */
1025 || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
1027 /* If the type is just a cross reference, output one
1028 and mark the type as partially described.
1029 If it later becomes defined, we will output
1030 its real definition.
1031 If the type has a name, don't nest its definition within
1032 another type's definition; instead, output an xref
1033 and let the definition come when the name is defined. */
1034 fprintf (asmfile, (TREE_CODE (type) == RECORD_TYPE) ? "xs" : "xu");
1036 #if 0 /* This assertion is legitimately false in C++. */
1037 /* We shouldn't be outputting a reference to a type before its
1038 definition unless the type has a tag name.
1039 A typedef name without a tag name should be impossible. */
1040 if (TREE_CODE (TYPE_NAME (type)) != IDENTIFIER_NODE)
1043 dbxout_type_name (type);
1044 fprintf (asmfile, ":");
1045 typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_XREF;
1048 tem = size_in_bytes (type);
1050 /* Identify record or union, and print its size. */
1051 fprintf (asmfile, (TREE_CODE (type) == RECORD_TYPE) ? "s%d" : "u%d",
1052 TREE_INT_CST_LOW (tem));
1054 if (use_gnu_debug_info_extensions)
1058 have_used_extensions = 1;
1059 fprintf (asmfile, "!%d,", n_baseclasses);
1063 for (i = 0; i < n_baseclasses; i++)
1065 tree child = TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (type)), i);
1066 if (use_gnu_debug_info_extensions)
1068 have_used_extensions = 1;
1069 putc (TREE_VIA_VIRTUAL (child) ? '1'
1072 putc (TREE_VIA_PUBLIC (child) ? '2'
1075 fprintf (asmfile, "%d,",
1076 TREE_INT_CST_LOW (BINFO_OFFSET (child)) * BITS_PER_UNIT);
1078 dbxout_type (BINFO_TYPE (child), 0, 0);
1079 putc (';', asmfile);
1083 /* Print out the base class information with fields
1084 which have the same names at the types they hold. */
1085 dbxout_type_name (BINFO_TYPE (child));
1086 putc (':', asmfile);
1087 dbxout_type (BINFO_TYPE (child), full, 0);
1088 fprintf (asmfile, ",%d,%d;",
1089 TREE_INT_CST_LOW (BINFO_OFFSET (child)) * BITS_PER_UNIT,
1090 TREE_INT_CST_LOW (DECL_SIZE (TYPE_NAME (BINFO_TYPE (child)))) * BITS_PER_UNIT);
1098 /* Write out the field declarations. */
1099 dbxout_type_fields (type);
1100 if (use_gnu_debug_info_extensions && TYPE_METHODS (type) != NULL_TREE)
1102 have_used_extensions = 1;
1103 dbxout_type_methods (type);
1105 putc (';', asmfile);
1107 if (use_gnu_debug_info_extensions && TREE_CODE (type) == RECORD_TYPE
1108 /* Avoid the ~ if we don't really need it--it confuses dbx. */
1109 && TYPE_VFIELD (type))
1111 have_used_extensions = 1;
1113 /* Tell GDB+ that it may keep reading. */
1114 putc ('~', asmfile);
1116 /* We need to write out info about what field this class
1117 uses as its "main" vtable pointer field, because if this
1118 field is inherited from a base class, GDB cannot necessarily
1119 figure out which field it's using in time. */
1120 if (TYPE_VFIELD (type))
1122 putc ('%', asmfile);
1123 dbxout_type (DECL_FCONTEXT (TYPE_VFIELD (type)), 0, 0);
1125 putc (';', asmfile);
1131 if ((TYPE_NAME (type) != 0 && !full
1132 && (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1133 && ! DECL_IGNORED_P (TYPE_NAME (type))))
1134 || TYPE_SIZE (type) == 0)
1136 fprintf (asmfile, "xe");
1138 dbxout_type_name (type);
1139 typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_XREF;
1140 fprintf (asmfile, ":");
1143 #ifdef DBX_OUTPUT_ENUM
1144 DBX_OUTPUT_ENUM (asmfile, type);
1146 putc ('e', asmfile);
1148 for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem))
1150 fprintf (asmfile, "%s:%d,", IDENTIFIER_POINTER (TREE_PURPOSE (tem)),
1151 TREE_INT_CST_LOW (TREE_VALUE (tem)));
1152 CHARS (11 + IDENTIFIER_LENGTH (TREE_PURPOSE (tem)));
1153 if (TREE_CHAIN (tem) != 0)
1156 putc (';', asmfile);
1162 putc ('*', asmfile);
1164 dbxout_type (TREE_TYPE (type), 0, 0);
1168 if (use_gnu_debug_info_extensions)
1170 have_used_extensions = 1;
1171 putc ('#', asmfile);
1173 if (flag_minimal_debug && !show_arg_types)
1175 /* Normally, just output the return type.
1176 The argument types are encoded in the method name. */
1177 putc ('#', asmfile);
1178 dbxout_type (TREE_TYPE (type), 0, 0);
1179 putc (';', asmfile);
1184 /* When outputting destructors, we need to write
1185 the argument types out longhand. */
1186 dbxout_type (TYPE_METHOD_BASETYPE (type), 0, 0);
1187 putc (',', asmfile);
1189 dbxout_type (TREE_TYPE (type), 0, 0);
1190 dbxout_args (TYPE_ARG_TYPES (type));
1191 putc (';', asmfile);
1197 /* Treat it as a function type. */
1198 dbxout_type (TREE_TYPE (type), 0, 0);
1203 if (use_gnu_debug_info_extensions)
1205 have_used_extensions = 1;
1206 putc ('@', asmfile);
1208 dbxout_type (TYPE_OFFSET_BASETYPE (type), 0, 0);
1209 putc (',', asmfile);
1211 dbxout_type (TREE_TYPE (type), 0, 0);
1215 /* Should print as an int, because it is really
1217 dbxout_type (integer_type_node, 0, 0);
1221 case REFERENCE_TYPE:
1222 if (use_gnu_debug_info_extensions)
1223 have_used_extensions = 1;
1224 putc (use_gnu_debug_info_extensions ? '&' : '*', asmfile);
1226 dbxout_type (TREE_TYPE (type), 0, 0);
1230 putc ('f', asmfile);
1232 dbxout_type (TREE_TYPE (type), 0, 0);
1240 /* Print the value of integer constant C, in octal,
1241 handling double precision. */
1244 print_int_cst_octal (c)
1247 unsigned HOST_WIDE_INT high = TREE_INT_CST_HIGH (c);
1248 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (c);
1249 int excess = (3 - (HOST_BITS_PER_WIDE_INT % 3));
1251 fprintf (asmfile, "0");
1255 print_octal (high, HOST_BITS_PER_WIDE_INT / 3);
1256 print_octal (low, HOST_BITS_PER_WIDE_INT / 3);
1260 unsigned HOST_WIDE_INT beg = high >> excess;
1261 unsigned HOST_WIDE_INT middle
1262 = ((high & (((HOST_WIDE_INT) 1 << excess) - 1)) << (3 - excess)
1263 | (low >> (HOST_BITS_PER_WIDE_INT / 3 * 3)));
1264 unsigned HOST_WIDE_INT end
1265 = low & (((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 3 * 3)) - 1);
1266 fprintf (asmfile, "%o%01o", beg, middle);
1267 print_octal (end, HOST_BITS_PER_WIDE_INT / 3);
1272 print_octal (value, digits)
1273 unsigned HOST_WIDE_INT value;
1278 for (i = digits - 1; i >= 0; i--)
1279 fprintf (asmfile, "%01o", ((value >> (3 * i)) & 7));
1282 /* Output the name of type TYPE, with no punctuation.
1283 Such names can be set up either by typedef declarations
1284 or by struct, enum and union tags. */
1287 dbxout_type_name (type)
1291 if (TYPE_NAME (type) == 0)
1293 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
1295 t = TYPE_NAME (type);
1297 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
1299 t = DECL_NAME (TYPE_NAME (type));
1304 fprintf (asmfile, "%s", IDENTIFIER_POINTER (t));
1305 CHARS (IDENTIFIER_LENGTH (t));
1308 /* Output a .stabs for the symbol defined by DECL,
1309 which must be a ..._DECL node in the normal namespace.
1310 It may be a CONST_DECL, a FUNCTION_DECL, a PARM_DECL or a VAR_DECL.
1311 LOCAL is nonzero if the scope is less than the entire file. */
1314 dbxout_symbol (decl, local)
1319 tree type = TREE_TYPE (decl);
1320 tree context = NULL_TREE;
1323 /* Cast avoids warning in old compilers. */
1324 current_sym_code = (STAB_CODE_TYPE) 0;
1325 current_sym_value = 0;
1326 current_sym_addr = 0;
1328 /* Ignore nameless syms, but don't ignore type tags. */
1330 if ((DECL_NAME (decl) == 0 && TREE_CODE (decl) != TYPE_DECL)
1331 || DECL_IGNORED_P (decl))
1334 dbxout_prepare_symbol (decl);
1336 /* The output will always start with the symbol name,
1337 so always count that in the length-output-so-far. */
1339 if (DECL_NAME (decl) != 0)
1340 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (decl));
1342 switch (TREE_CODE (decl))
1345 /* Enum values are defined by defining the enum type. */
1349 if (DECL_RTL (decl) == 0)
1351 if (DECL_EXTERNAL (decl))
1353 /* Don't mention a nested function under its parent. */
1354 context = decl_function_context (decl);
1355 if (context == current_function_decl)
1357 if (GET_CODE (DECL_RTL (decl)) != MEM
1358 || GET_CODE (XEXP (DECL_RTL (decl), 0)) != SYMBOL_REF)
1362 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
1363 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
1364 TREE_PUBLIC (decl) ? 'F' : 'f');
1366 current_sym_code = N_FUN;
1367 current_sym_addr = XEXP (DECL_RTL (decl), 0);
1369 if (TREE_TYPE (type))
1370 dbxout_type (TREE_TYPE (type), 0, 0);
1372 dbxout_type (void_type_node, 0, 0);
1374 /* For a nested function, when that function is compiled,
1375 mention the containing function name
1376 as well as (since dbx wants it) our own assembler-name. */
1378 fprintf (asmfile, ",%s,%s",
1379 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
1380 IDENTIFIER_POINTER (DECL_NAME (context)));
1382 dbxout_finish_symbol (decl);
1387 /* This seems all wrong. Outputting most kinds of types gives no name
1388 at all. A true definition gives no name; a cross-ref for a
1389 structure can give the tag name, but not a type name.
1390 It seems that no typedef name is defined by outputting a type. */
1392 /* If this typedef name was defined by outputting the type,
1393 don't duplicate it. */
1394 if (typevec[TYPE_SYMTAB_ADDRESS (type)] == TYPE_DEFINED
1395 && TYPE_NAME (TREE_TYPE (decl)) == decl)
1398 /* Don't output the same typedef twice.
1399 And don't output what language-specific stuff doesn't want output. */
1400 if (TREE_ASM_WRITTEN (decl) || DECL_IGNORED_P (decl))
1408 if (DECL_NAME (decl))
1410 /* Nonzero means we must output a tag as well as a typedef. */
1413 /* Handle the case of a C++ structure or union
1414 where the TYPE_NAME is a TYPE_DECL
1415 which gives both a typedef name and a tag. */
1416 /* dbx requires the tag first and the typedef second. */
1417 if ((TREE_CODE (type) == RECORD_TYPE
1418 || TREE_CODE (type) == UNION_TYPE)
1419 && TYPE_NAME (type) == decl
1420 && !(use_gnu_debug_info_extensions && have_used_extensions)
1421 && !TREE_ASM_WRITTEN (TYPE_NAME (type))
1422 /* Distinguish the implicit typedefs of C++
1423 from explicit ones that might be found in C. */
1424 && DECL_SOURCE_LINE (decl) == 0)
1426 tree name = TYPE_NAME (type);
1427 if (TREE_CODE (name) == TYPE_DECL)
1428 name = DECL_NAME (name);
1430 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1431 current_sym_value = 0;
1432 current_sym_addr = 0;
1433 current_sym_nchars = 2 + IDENTIFIER_LENGTH (name);
1435 fprintf (asmfile, "%s \"%s:T", ASM_STABS_OP,
1436 IDENTIFIER_POINTER (name));
1437 dbxout_type (type, 1, 0);
1438 dbxout_finish_symbol (NULL_TREE);
1441 /* Output typedef name. */
1442 fprintf (asmfile, "%s \"%s:", ASM_STABS_OP,
1443 IDENTIFIER_POINTER (DECL_NAME (decl)));
1445 /* Short cut way to output a tag also. */
1446 if ((TREE_CODE (type) == RECORD_TYPE
1447 || TREE_CODE (type) == UNION_TYPE)
1448 && TYPE_NAME (type) == decl)
1450 if (use_gnu_debug_info_extensions && have_used_extensions)
1452 putc ('T', asmfile);
1453 TREE_ASM_WRITTEN (TYPE_NAME (type)) = 1;
1455 #if 0 /* Now we generate the tag for this case up above. */
1461 putc ('t', asmfile);
1462 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1464 dbxout_type (type, 1, 0);
1465 dbxout_finish_symbol (decl);
1468 if (tag_needed && TYPE_NAME (type) != 0
1469 && !TREE_ASM_WRITTEN (TYPE_NAME (type)))
1471 /* For a TYPE_DECL with no name, but the type has a name,
1473 This is what represents `struct foo' with no typedef. */
1474 /* In C++, the name of a type is the corresponding typedef.
1475 In C, it is an IDENTIFIER_NODE. */
1476 tree name = TYPE_NAME (type);
1477 if (TREE_CODE (name) == TYPE_DECL)
1478 name = DECL_NAME (name);
1480 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1481 current_sym_value = 0;
1482 current_sym_addr = 0;
1483 current_sym_nchars = 2 + IDENTIFIER_LENGTH (name);
1485 fprintf (asmfile, "%s \"%s:T", ASM_STABS_OP,
1486 IDENTIFIER_POINTER (name));
1487 dbxout_type (type, 1, 0);
1488 dbxout_finish_symbol (NULL_TREE);
1491 /* Prevent duplicate output of a typedef. */
1492 TREE_ASM_WRITTEN (decl) = 1;
1497 /* Parm decls go in their own separate chains
1498 and are output by dbxout_reg_parms and dbxout_parms. */
1502 /* Named return value, treat like a VAR_DECL. */
1504 if (DECL_RTL (decl) == 0)
1506 /* Don't mention a variable that is external.
1507 Let the file that defines it describe it. */
1508 if (DECL_EXTERNAL (decl))
1511 /* If the variable is really a constant
1512 and not written in memory, inform the debugger. */
1513 if (TREE_STATIC (decl) && TREE_READONLY (decl)
1514 && DECL_INITIAL (decl) != 0
1515 && ! TREE_ASM_WRITTEN (decl)
1516 && (DECL_FIELD_CONTEXT (decl) == NULL_TREE
1517 || TREE_CODE (DECL_FIELD_CONTEXT (decl)) == BLOCK))
1519 if (TREE_PUBLIC (decl) == 0)
1521 /* The sun4 assembler does not grok this. */
1522 char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
1523 if (TREE_CODE (TREE_TYPE (decl)) == INTEGER_TYPE
1524 || TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE)
1526 HOST_WIDE_INT ival = TREE_INT_CST_LOW (DECL_INITIAL (decl));
1527 #ifdef DBX_OUTPUT_CONSTANT_SYMBOL
1528 DBX_OUTPUT_CONSTANT_SYMBOL (asmfile, name, ival);
1530 fprintf (asmfile, "%s \"%s:c=i%d\",0x%x,0,0,0\n",
1531 ASM_STABS_OP, name, ival, N_LSYM);
1535 else if (TREE_CODE (TREE_TYPE (decl)) == REAL_TYPE)
1537 /* don't know how to do this yet. */
1541 /* else it is something we handle like a normal variable. */
1544 DECL_RTL (decl) = eliminate_regs (DECL_RTL (decl), 0, 0);
1545 #ifdef LEAF_REG_REMAP
1547 leaf_renumber_regs_insn (DECL_RTL (decl));
1550 /* Don't mention a variable at all
1551 if it was completely optimized into nothingness.
1553 If DECL was from an inline function, then it's rtl
1554 is not identically the rtl that was used in this
1555 particular compilation. */
1556 if (GET_CODE (DECL_RTL (decl)) == REG)
1558 regno = REGNO (DECL_RTL (decl));
1559 if (regno >= FIRST_PSEUDO_REGISTER)
1562 else if (GET_CODE (DECL_RTL (decl)) == SUBREG)
1564 rtx value = DECL_RTL (decl);
1566 while (GET_CODE (value) == SUBREG)
1568 offset += SUBREG_WORD (value);
1569 value = SUBREG_REG (value);
1571 if (GET_CODE (value) == REG)
1573 regno = REGNO (value);
1574 if (regno >= FIRST_PSEUDO_REGISTER)
1578 alter_subreg (DECL_RTL (decl));
1581 /* The kind-of-variable letter depends on where
1582 the variable is and on the scope of its name:
1583 G and N_GSYM for static storage and global scope,
1584 S for static storage and file scope,
1585 V for static storage and local scope,
1586 for those two, use N_LCSYM if data is in bss segment,
1587 N_STSYM if in data segment, N_FUN otherwise.
1588 (We used N_FUN originally, then changed to N_STSYM
1589 to please GDB. However, it seems that confused ld.
1590 Now GDB has been fixed to like N_FUN, says Kingdon.)
1591 no letter at all, and N_LSYM, for auto variable,
1592 r and N_RSYM for register variable. */
1594 if (GET_CODE (DECL_RTL (decl)) == MEM
1595 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
1597 if (TREE_PUBLIC (decl))
1600 current_sym_code = N_GSYM;
1604 current_sym_addr = XEXP (DECL_RTL (decl), 0);
1606 letter = decl_function_context (decl) ? 'V' : 'S';
1608 if (!DECL_INITIAL (decl))
1609 current_sym_code = N_LCSYM;
1610 else if (TREE_READONLY (decl) && ! TREE_THIS_VOLATILE (decl))
1611 /* This is not quite right, but it's the closest
1612 of all the codes that Unix defines. */
1613 current_sym_code = DBX_STATIC_CONST_VAR_CODE;
1616 /* Ultrix `as' seems to need this. */
1617 #ifdef DBX_STATIC_STAB_DATA_SECTION
1620 current_sym_code = N_STSYM;
1624 else if (regno >= 0)
1627 current_sym_code = N_RSYM;
1628 current_sym_value = DBX_REGISTER_NUMBER (regno);
1630 else if (GET_CODE (DECL_RTL (decl)) == MEM
1631 && (GET_CODE (XEXP (DECL_RTL (decl), 0)) == MEM
1632 || (GET_CODE (XEXP (DECL_RTL (decl), 0)) == REG
1633 && REGNO (XEXP (DECL_RTL (decl), 0)) != FRAME_POINTER_REGNUM)))
1634 /* If the value is indirect by memory or by a register
1635 that isn't the frame pointer
1636 then it means the object is variable-sized and address through
1637 that register or stack slot. DBX has no way to represent this
1638 so all we can do is output the variable as a pointer.
1639 If it's not a parameter, ignore it.
1640 (VAR_DECLs like this can be made by integrate.c.) */
1642 if (GET_CODE (XEXP (DECL_RTL (decl), 0)) == REG)
1645 current_sym_code = N_RSYM;
1646 current_sym_value = DBX_REGISTER_NUMBER (REGNO (XEXP (DECL_RTL (decl), 0)));
1650 current_sym_code = N_LSYM;
1651 /* DECL_RTL looks like (MEM (MEM (PLUS (REG...) (CONST_INT...)))).
1652 We want the value of that CONST_INT. */
1654 = DEBUGGER_AUTO_OFFSET (XEXP (XEXP (DECL_RTL (decl), 0), 0));
1657 /* Effectively do build_pointer_type, but don't cache this type,
1658 since it might be temporary whereas the type it points to
1659 might have been saved for inlining. */
1660 /* Don't use REFERENCE_TYPE because dbx can't handle that. */
1661 type = make_node (POINTER_TYPE);
1662 TREE_TYPE (type) = TREE_TYPE (decl);
1664 else if (GET_CODE (DECL_RTL (decl)) == MEM
1665 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == REG)
1667 current_sym_code = N_LSYM;
1668 current_sym_value = DEBUGGER_AUTO_OFFSET (XEXP (DECL_RTL (decl), 0));
1670 else if (GET_CODE (DECL_RTL (decl)) == MEM
1671 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == PLUS
1672 && GET_CODE (XEXP (XEXP (DECL_RTL (decl), 0), 1)) == CONST_INT)
1674 current_sym_code = N_LSYM;
1675 /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...)))
1676 We want the value of that CONST_INT. */
1677 current_sym_value = DEBUGGER_AUTO_OFFSET (XEXP (DECL_RTL (decl), 0));
1679 else if (GET_CODE (DECL_RTL (decl)) == MEM
1680 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == CONST)
1682 /* Handle an obscure case which can arise when optimizing and
1683 when there are few available registers. (This is *always*
1684 the case for i386/i486 targets). The DECL_RTL looks like
1685 (MEM (CONST ...)) even though this variable is a local `auto'
1686 or a local `register' variable. In effect, what has happened
1687 is that the reload pass has seen that all assignments and
1688 references for one such a local variable can be replaced by
1689 equivalent assignments and references to some static storage
1690 variable, thereby avoiding the need for a register. In such
1691 cases we're forced to lie to debuggers and tell them that
1692 this variable was itself `static'. */
1693 current_sym_code = N_LCSYM;
1695 current_sym_addr = XEXP (XEXP (DECL_RTL (decl), 0), 0);
1698 /* Address might be a MEM, when DECL is a variable-sized object.
1699 Or it might be const0_rtx, meaning previous passes
1700 want us to ignore this variable. */
1703 /* Ok, start a symtab entry and output the variable name. */
1706 #ifdef DBX_STATIC_BLOCK_START
1707 DBX_STATIC_BLOCK_START (asmfile, current_sym_code);
1710 /* One slight hitch: if this is a VAR_DECL which is a static
1711 class member, we must put out the mangled name instead of the
1715 /* Note also that static member (variable) names DO NOT begin
1716 with underscores in .stabs directives. */
1717 if (DECL_LANG_SPECIFIC (decl))
1718 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
1720 name = IDENTIFIER_POINTER (DECL_NAME (decl));
1721 fprintf (asmfile, "%s \"%s:", ASM_STABS_OP, name);
1723 if (letter) putc (letter, asmfile);
1724 dbxout_type (type, 0, 0);
1725 dbxout_finish_symbol (decl);
1727 #ifdef DBX_STATIC_BLOCK_END
1728 DBX_STATIC_BLOCK_END (asmfile, current_sym_code);
1735 dbxout_prepare_symbol (decl)
1739 char *filename = DECL_SOURCE_FILE (decl);
1741 dbxout_source_file (asmfile, filename);
1746 dbxout_finish_symbol (sym)
1749 #ifdef DBX_FINISH_SYMBOL
1750 DBX_FINISH_SYMBOL (sym);
1755 line = DECL_SOURCE_LINE (sym);
1758 fprintf (asmfile, "\",%d,0,%d,", current_sym_code, line);
1759 if (current_sym_addr)
1760 output_addr_const (asmfile, current_sym_addr);
1762 fprintf (asmfile, "%d", current_sym_value);
1763 putc ('\n', asmfile);
1767 /* Output definitions of all the decls in a chain. */
1775 dbxout_symbol (syms, 1);
1776 syms = TREE_CHAIN (syms);
1780 /* The following two functions output definitions of function parameters.
1781 Each parameter gets a definition locating it in the parameter list.
1782 Each parameter that is a register variable gets a second definition
1783 locating it in the register.
1785 Printing or argument lists in gdb uses the definitions that
1786 locate in the parameter list. But reference to the variable in
1787 expressions uses preferentially the definition as a register. */
1789 /* Output definitions, referring to storage in the parmlist,
1790 of all the parms in PARMS, which is a chain of PARM_DECL nodes. */
1793 dbxout_parms (parms)
1796 for (; parms; parms = TREE_CHAIN (parms))
1797 if (DECL_NAME (parms) && TREE_TYPE (parms) != error_mark_node)
1799 dbxout_prepare_symbol (parms);
1801 /* Perform any necessary register eliminations on the parameter's rtl,
1802 so that the debugging output will be accurate. */
1803 DECL_INCOMING_RTL (parms)
1804 = eliminate_regs (DECL_INCOMING_RTL (parms), 0, NULL_RTX);
1805 DECL_RTL (parms) = eliminate_regs (DECL_RTL (parms), 0, NULL_RTX);
1806 #ifdef LEAF_REG_REMAP
1809 leaf_renumber_regs_insn (DECL_INCOMING_RTL (parms));
1810 leaf_renumber_regs_insn (DECL_RTL (parms));
1814 if (PARM_PASSED_IN_MEMORY (parms))
1816 rtx addr = XEXP (DECL_INCOMING_RTL (parms), 0);
1818 /* ??? Here we assume that the parm address is indexed
1819 off the frame pointer or arg pointer.
1820 If that is not true, we produce meaningless results,
1821 but do not crash. */
1822 if (GET_CODE (addr) == PLUS
1823 && GET_CODE (XEXP (addr, 1)) == CONST_INT)
1824 current_sym_value = INTVAL (XEXP (addr, 1));
1826 current_sym_value = 0;
1828 current_sym_code = N_PSYM;
1829 current_sym_addr = 0;
1832 if (DECL_NAME (parms))
1834 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
1836 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
1837 IDENTIFIER_POINTER (DECL_NAME (parms)),
1838 DBX_MEMPARM_STABS_LETTER);
1842 current_sym_nchars = 8;
1843 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
1844 DBX_MEMPARM_STABS_LETTER);
1847 if (GET_CODE (DECL_RTL (parms)) == REG
1848 && REGNO (DECL_RTL (parms)) >= 0
1849 && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
1850 dbxout_type (DECL_ARG_TYPE (parms), 0, 0);
1853 int original_value = current_sym_value;
1855 /* This is the case where the parm is passed as an int or double
1856 and it is converted to a char, short or float and stored back
1857 in the parmlist. In this case, describe the parm
1858 with the variable's declared type, and adjust the address
1859 if the least significant bytes (which we are using) are not
1861 #if BYTES_BIG_ENDIAN
1862 if (TREE_TYPE (parms) != DECL_ARG_TYPE (parms))
1863 current_sym_value += (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms)))
1864 - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms))));
1867 if (GET_CODE (DECL_RTL (parms)) == MEM
1868 && GET_CODE (XEXP (DECL_RTL (parms), 0)) == PLUS
1869 && GET_CODE (XEXP (XEXP (DECL_RTL (parms), 0), 1)) == CONST_INT
1870 && INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1)) == current_sym_value)
1871 dbxout_type (TREE_TYPE (parms), 0, 0);
1874 current_sym_value = original_value;
1875 dbxout_type (DECL_ARG_TYPE (parms), 0, 0);
1878 current_sym_value = DEBUGGER_ARG_OFFSET (current_sym_value, addr);
1879 dbxout_finish_symbol (parms);
1881 else if (GET_CODE (DECL_RTL (parms)) == REG)
1884 char regparm_letter;
1885 /* Parm passed in registers and lives in registers or nowhere. */
1887 current_sym_code = DBX_REGPARM_STABS_CODE;
1888 regparm_letter = DBX_REGPARM_STABS_LETTER;
1889 current_sym_addr = 0;
1891 /* If parm lives in a register, use that register;
1892 pretend the parm was passed there. It would be more consistent
1893 to describe the register where the parm was passed,
1894 but in practice that register usually holds something else. */
1895 if (REGNO (DECL_RTL (parms)) >= 0
1896 && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
1897 best_rtl = DECL_RTL (parms);
1898 /* If the parm lives nowhere,
1899 use the register where it was passed. */
1901 best_rtl = DECL_INCOMING_RTL (parms);
1902 current_sym_value = DBX_REGISTER_NUMBER (REGNO (best_rtl));
1905 if (DECL_NAME (parms))
1907 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
1908 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
1909 IDENTIFIER_POINTER (DECL_NAME (parms)),
1914 current_sym_nchars = 8;
1915 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
1919 dbxout_type (DECL_ARG_TYPE (parms), 0, 0);
1920 dbxout_finish_symbol (parms);
1922 else if (GET_CODE (DECL_RTL (parms)) == MEM
1923 && GET_CODE (XEXP (DECL_RTL (parms), 0)) == REG
1924 && rtx_equal_p (XEXP (DECL_RTL (parms), 0),
1925 DECL_INCOMING_RTL (parms)))
1927 /* Parm was passed via invisible reference.
1928 That is, its address was passed in a register.
1929 Output it as if it lived in that register.
1930 The debugger will know from the type
1931 that it was actually passed by invisible reference. */
1933 char regparm_letter;
1934 /* Parm passed in registers and lives in registers or nowhere. */
1936 current_sym_code = DBX_REGPARM_STABS_CODE;
1937 regparm_letter = DBX_REGPARM_STABS_LETTER;
1939 /* DECL_RTL looks like (MEM (REG...). Get the register number. */
1940 current_sym_value = REGNO (XEXP (DECL_RTL (parms), 0));
1941 current_sym_addr = 0;
1944 if (DECL_NAME (parms))
1946 current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms)));
1948 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
1949 IDENTIFIER_POINTER (DECL_NAME (parms)),
1950 DBX_REGPARM_STABS_LETTER);
1954 current_sym_nchars = 8;
1955 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
1956 DBX_REGPARM_STABS_LETTER);
1959 dbxout_type (TREE_TYPE (parms), 0, 0);
1960 dbxout_finish_symbol (parms);
1962 else if (GET_CODE (DECL_RTL (parms)) == MEM
1963 && XEXP (DECL_RTL (parms), 0) != const0_rtx)
1965 /* Parm was passed in registers but lives on the stack. */
1967 current_sym_code = N_PSYM;
1968 /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...))),
1969 in which case we want the value of that CONST_INT,
1970 or (MEM (REG ...)) or (MEM (MEM ...)),
1971 in which case we use a value of zero. */
1972 if (GET_CODE (XEXP (DECL_RTL (parms), 0)) == REG
1973 || GET_CODE (XEXP (DECL_RTL (parms), 0)) == MEM)
1974 current_sym_value = 0;
1976 current_sym_value = INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1));
1977 current_sym_addr = 0;
1980 if (DECL_NAME (parms))
1982 current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms)));
1984 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
1985 IDENTIFIER_POINTER (DECL_NAME (parms)),
1986 DBX_MEMPARM_STABS_LETTER);
1990 current_sym_nchars = 8;
1991 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
1992 DBX_MEMPARM_STABS_LETTER);
1996 = DEBUGGER_ARG_OFFSET (current_sym_value,
1997 XEXP (DECL_RTL (parms), 0));
1998 dbxout_type (TREE_TYPE (parms), 0, 0);
1999 dbxout_finish_symbol (parms);
2004 /* Output definitions for the places where parms live during the function,
2005 when different from where they were passed, when the parms were passed
2008 It is not useful to do this for parms passed in registers
2009 that live during the function in different registers, because it is
2010 impossible to look in the passed register for the passed value,
2011 so we use the within-the-function register to begin with.
2013 PARMS is a chain of PARM_DECL nodes. */
2016 dbxout_reg_parms (parms)
2019 for (; parms; parms = TREE_CHAIN (parms))
2020 if (DECL_NAME (parms))
2022 dbxout_prepare_symbol (parms);
2024 /* Report parms that live in registers during the function
2025 but were passed in memory. */
2026 if (GET_CODE (DECL_RTL (parms)) == REG
2027 && REGNO (DECL_RTL (parms)) >= 0
2028 && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER
2029 && PARM_PASSED_IN_MEMORY (parms))
2031 current_sym_code = N_RSYM;
2032 current_sym_value = DBX_REGISTER_NUMBER (REGNO (DECL_RTL (parms)));
2033 current_sym_addr = 0;
2036 if (DECL_NAME (parms))
2038 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
2039 fprintf (asmfile, "%s \"%s:r", ASM_STABS_OP,
2040 IDENTIFIER_POINTER (DECL_NAME (parms)));
2044 current_sym_nchars = 8;
2045 fprintf (asmfile, "%s \"(anon):r", ASM_STABS_OP);
2047 dbxout_type (TREE_TYPE (parms), 0, 0);
2048 dbxout_finish_symbol (parms);
2050 /* Report parms that live in memory but not where they were passed. */
2051 else if (GET_CODE (DECL_RTL (parms)) == MEM
2052 && GET_CODE (XEXP (DECL_RTL (parms), 0)) == PLUS
2053 && GET_CODE (XEXP (XEXP (DECL_RTL (parms), 0), 1)) == CONST_INT
2054 && PARM_PASSED_IN_MEMORY (parms)
2055 && ! rtx_equal_p (DECL_RTL (parms), DECL_INCOMING_RTL (parms)))
2057 #if 0 /* ??? It is not clear yet what should replace this. */
2058 int offset = DECL_OFFSET (parms) / BITS_PER_UNIT;
2059 /* A parm declared char is really passed as an int,
2060 so it occupies the least significant bytes.
2061 On a big-endian machine those are not the low-numbered ones. */
2062 #if BYTES_BIG_ENDIAN
2063 if (offset != -1 && TREE_TYPE (parms) != DECL_ARG_TYPE (parms))
2064 offset += (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms)))
2065 - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms))));
2067 if (INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1)) != offset) {...}
2069 current_sym_code = N_LSYM;
2070 current_sym_value = DEBUGGER_AUTO_OFFSET (XEXP (DECL_RTL (parms), 0));
2071 current_sym_addr = 0;
2073 if (DECL_NAME (parms))
2075 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
2076 fprintf (asmfile, "%s \"%s:", ASM_STABS_OP,
2077 IDENTIFIER_POINTER (DECL_NAME (parms)));
2081 current_sym_nchars = 8;
2082 fprintf (asmfile, "%s \"(anon):", ASM_STABS_OP);
2084 dbxout_type (TREE_TYPE (parms), 0, 0);
2085 dbxout_finish_symbol (parms);
2090 /* Given a chain of ..._TYPE nodes (as come in a parameter list),
2091 output definitions of those names, in raw form */
2099 putc (',', asmfile);
2100 dbxout_type (TREE_VALUE (args), 0, 0);
2102 args = TREE_CHAIN (args);
2106 /* Given a chain of ..._TYPE nodes,
2107 find those which have typedef names and output those names.
2108 This is to ensure those types get output. */
2111 dbxout_types (types)
2112 register tree types;
2116 if (TYPE_NAME (types)
2117 && TREE_CODE (TYPE_NAME (types)) == TYPE_DECL
2118 && ! TREE_ASM_WRITTEN (TYPE_NAME (types)))
2119 dbxout_symbol (TYPE_NAME (types), 1);
2120 types = TREE_CHAIN (types);
2124 /* Output everything about a symbol block (a BLOCK node
2125 that represents a scope level),
2126 including recursive output of contained blocks.
2128 BLOCK is the BLOCK node.
2129 DEPTH is its depth within containing symbol blocks.
2130 ARGS is usually zero; but for the outermost block of the
2131 body of a function, it is a chain of PARM_DECLs for the function parameters.
2132 We output definitions of all the register parms
2133 as if they were local variables of that block.
2135 If -g1 was used, we count blocks just the same, but output nothing
2136 except for the outermost block.
2138 Actually, BLOCK may be several blocks chained together.
2139 We handle them all in sequence. */
2142 dbxout_block (block, depth, args)
2143 register tree block;
2151 /* Ignore blocks never expanded or otherwise marked as real. */
2152 if (TREE_USED (block))
2154 #ifndef DBX_LBRAC_FIRST
2155 /* In dbx format, the syms of a block come before the N_LBRAC. */
2156 if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
2157 dbxout_syms (BLOCK_VARS (block));
2159 dbxout_reg_parms (args);
2162 /* Now output an N_LBRAC symbol to represent the beginning of
2163 the block. Use the block's tree-walk order to generate
2164 the assembler symbols LBBn and LBEn
2165 that final will define around the code in this block. */
2166 if (depth > 0 && debug_info_level != DINFO_LEVEL_TERSE)
2169 blocknum = next_block_number++;
2170 ASM_GENERATE_INTERNAL_LABEL (buf, "LBB", blocknum);
2172 if (BLOCK_HANDLER_BLOCK (block))
2174 /* A catch block. Must precede N_LBRAC. */
2175 tree decl = BLOCK_VARS (block);
2178 #ifdef DBX_OUTPUT_CATCH
2179 DBX_OUTPUT_CATCH (asmfile, decl, buf);
2181 fprintf (asmfile, "%s \"%s:C1\",%d,0,0,", ASM_STABS_OP,
2182 IDENTIFIER_POINTER (DECL_NAME (decl)), N_CATCH);
2183 assemble_name (asmfile, buf);
2184 fprintf (asmfile, "\n");
2186 decl = TREE_CHAIN (decl);
2190 #ifdef DBX_OUTPUT_LBRAC
2191 DBX_OUTPUT_LBRAC (asmfile, buf);
2193 fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC);
2194 assemble_name (asmfile, buf);
2195 #if DBX_BLOCKS_FUNCTION_RELATIVE
2196 fputc ('-', asmfile);
2197 assemble_name (asmfile, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl)));
2199 fprintf (asmfile, "\n");
2203 /* Count blocks the same way regardless of debug_info_level. */
2204 next_block_number++;
2206 #ifdef DBX_LBRAC_FIRST
2207 /* On some weird machines, the syms of a block
2208 come after the N_LBRAC. */
2209 if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
2210 dbxout_syms (BLOCK_VARS (block));
2212 dbxout_reg_parms (args);
2215 /* Output the subblocks. */
2216 dbxout_block (BLOCK_SUBBLOCKS (block), depth + 1, NULL_TREE);
2218 /* Refer to the marker for the end of the block. */
2219 if (depth > 0 && debug_info_level != DINFO_LEVEL_TERSE)
2222 ASM_GENERATE_INTERNAL_LABEL (buf, "LBE", blocknum);
2223 #ifdef DBX_OUTPUT_RBRAC
2224 DBX_OUTPUT_RBRAC (asmfile, buf);
2226 fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC);
2227 assemble_name (asmfile, buf);
2228 #if DBX_BLOCKS_FUNCTION_RELATIVE
2229 fputc ('-', asmfile);
2230 assemble_name (asmfile, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl)));
2232 fprintf (asmfile, "\n");
2236 block = BLOCK_CHAIN (block);
2240 /* Output the information about a function and its arguments and result.
2241 Usually this follows the function's code,
2242 but on some systems, it comes before. */
2245 dbxout_really_begin_function (decl)
2248 dbxout_symbol (decl, 0);
2249 dbxout_parms (DECL_ARGUMENTS (decl));
2250 if (DECL_NAME (DECL_RESULT (decl)) != 0)
2251 dbxout_symbol (DECL_RESULT (decl), 1);
2254 /* Called at beginning of output of function definition. */
2257 dbxout_begin_function (decl)
2260 #ifdef DBX_FUNCTION_FIRST
2261 dbxout_really_begin_function (decl);
2265 /* Output dbx data for a function definition.
2266 This includes a definition of the function name itself (a symbol),
2267 definitions of the parameters (locating them in the parameter list)
2268 and then output the block that makes up the function's body
2269 (including all the auto variables of the function). */
2272 dbxout_function (decl)
2275 #ifndef DBX_FUNCTION_FIRST
2276 dbxout_really_begin_function (decl);
2278 dbxout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl));
2279 #ifdef DBX_OUTPUT_FUNCTION_END
2280 DBX_OUTPUT_FUNCTION_END (asmfile, decl);
2283 #endif /* DBX_DEBUGGING_INFO */