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