OSDN Git Service

2001-04-03 Jakub Jelinek <jakub@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / sdbout.c
1 /* Output sdb-format symbol table information from GNU compiler.
2    Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001  Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 /*  mike@tredysvr.Tredydev.Unisys.COM says:
23 I modified the struct.c example and have a nm of a .o resulting from the
24 AT&T C compiler.  From the example below I would conclude the following:
25
26 1. All .defs from structures are emitted as scanned.  The example below
27    clearly shows the symbol table entries for BoxRec2 are after the first
28    function.
29
30 2. All functions and their locals (including statics) are emitted as scanned.
31
32 3. All nested unnamed union and structure .defs must be emitted before
33    the structure in which they are nested.  The AT&T assembler is a
34    one pass beast as far as symbolics are concerned.
35
36 4. All structure .defs are emitted before the typedefs that refer to them.
37
38 5. All top level static and external variable definitions are moved to the
39    end of file with all top level statics occurring first before externs.
40
41 6. All undefined references are at the end of the file.
42 */
43
44 #include "config.h"
45
46 #ifdef SDB_DEBUGGING_INFO
47
48 #include "system.h"
49 #include "tree.h"
50 #include "rtl.h"
51 #include "regs.h"
52 #include "flags.h"
53 #include "insn-config.h"
54 #include "reload.h"
55 #include "output.h"
56 #include "toplev.h"
57 #include "ggc.h"
58 #include "tm_p.h"
59
60 /* Mips systems use the SDB functions to dump out symbols, but do not
61    supply usable syms.h include files.  Which syms.h file to use is a
62    target parameter so don't use the native one if we're cross compiling.  */
63
64 #if defined(USG) && !defined(MIPS) && !defined (hpux) && !defined(_WIN32) && !defined(__linux__) && !defined(__INTERIX) && !defined(CROSS_COMPILE)
65 #include <syms.h>
66 /* Use T_INT if we don't have T_VOID.  */
67 #ifndef T_VOID
68 #define T_VOID T_INT
69 #endif
70 #else
71 #include "gsyms.h"
72 #endif
73
74 /* #include <storclass.h>  used to be this instead of syms.h.  */
75
76 /* 1 if PARM is passed to this function in memory.  */
77
78 #define PARM_PASSED_IN_MEMORY(PARM) \
79  (GET_CODE (DECL_INCOMING_RTL (PARM)) == MEM)
80
81 /* A C expression for the integer offset value of an automatic variable
82    (C_AUTO) having address X (an RTX).  */
83 #ifndef DEBUGGER_AUTO_OFFSET
84 #define DEBUGGER_AUTO_OFFSET(X) \
85   (GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0)
86 #endif
87
88 /* A C expression for the integer offset value of an argument (C_ARG)
89    having address X (an RTX).  The nominal offset is OFFSET.  */
90 #ifndef DEBUGGER_ARG_OFFSET
91 #define DEBUGGER_ARG_OFFSET(OFFSET, X) (OFFSET)
92 #endif
93
94 /* Line number of beginning of current function, minus one.
95    Negative means not in a function or not using sdb.  */
96
97 int sdb_begin_function_line = -1;
98
99 /* Counter to generate unique "names" for nameless struct members.  */
100
101 static int unnamed_struct_number = 0;
102
103 extern FILE *asm_out_file;
104
105 extern tree current_function_decl;
106
107 #include "sdbout.h"
108
109 static char *gen_fake_label             PARAMS ((void));
110 static int plain_type                   PARAMS ((tree));
111 static int template_name_p              PARAMS ((tree));
112 static void sdbout_record_type_name     PARAMS ((tree));
113 static int plain_type_1                 PARAMS ((tree, int));
114 static void sdbout_block                PARAMS ((tree));
115 static void sdbout_syms                 PARAMS ((tree));
116 #ifdef SDB_ALLOW_FORWARD_REFERENCES
117 static void sdbout_queue_anonymous_type PARAMS ((tree));
118 static void sdbout_dequeue_anonymous_types PARAMS ((void));
119 #endif
120 static void sdbout_type                 PARAMS ((tree));
121 static void sdbout_field_types          PARAMS ((tree));
122 static void sdbout_one_type             PARAMS ((tree));
123 static void sdbout_parms                PARAMS ((tree));
124 static void sdbout_reg_parms            PARAMS ((tree));
125 \f
126 /* Random macros describing parts of SDB data.  */
127
128 /* Put something here if lines get too long */
129 #define CONTIN
130
131 /* Default value of delimiter is ";".  */
132 #ifndef SDB_DELIM
133 #define SDB_DELIM       ";"
134 #endif
135
136 /* Maximum number of dimensions the assembler will allow.  */
137 #ifndef SDB_MAX_DIM
138 #define SDB_MAX_DIM 4
139 #endif
140
141 #ifndef PUT_SDB_SCL
142 #define PUT_SDB_SCL(a) fprintf(asm_out_file, "\t.scl\t%d%s", (a), SDB_DELIM)
143 #endif
144
145 #ifndef PUT_SDB_INT_VAL
146 #define PUT_SDB_INT_VAL(a) \
147  do {                                                                   \
148    fputs ("\t.val\t", asm_out_file);                                    \
149    fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT)(a)); \
150    fprintf (asm_out_file, "%s", SDB_DELIM);                             \
151  } while (0)
152
153 #endif
154
155 #ifndef PUT_SDB_VAL
156 #define PUT_SDB_VAL(a)                          \
157 ( fputs ("\t.val\t", asm_out_file),             \
158   output_addr_const (asm_out_file, (a)),        \
159   fprintf (asm_out_file, SDB_DELIM))
160 #endif
161
162 #ifndef PUT_SDB_DEF
163 #define PUT_SDB_DEF(a)                          \
164 do { fprintf (asm_out_file, "\t.def\t");        \
165      assemble_name (asm_out_file, a);   \
166      fprintf (asm_out_file, SDB_DELIM); } while (0)
167 #endif
168
169 #ifndef PUT_SDB_PLAIN_DEF
170 #define PUT_SDB_PLAIN_DEF(a) fprintf(asm_out_file,"\t.def\t.%s%s",a, SDB_DELIM)
171 #endif
172
173 #ifndef PUT_SDB_ENDEF
174 #define PUT_SDB_ENDEF fputs("\t.endef\n", asm_out_file)
175 #endif
176
177 #ifndef PUT_SDB_TYPE
178 #define PUT_SDB_TYPE(a) fprintf(asm_out_file, "\t.type\t0%o%s", a, SDB_DELIM)
179 #endif
180
181 #ifndef PUT_SDB_SIZE
182 #define PUT_SDB_SIZE(a) \
183  do {                                                                   \
184    fputs ("\t.size\t", asm_out_file);                                   \
185    fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT)(a)); \
186    fprintf (asm_out_file, "%s", SDB_DELIM);                             \
187  } while(0)
188 #endif
189
190 #ifndef PUT_SDB_START_DIM
191 #define PUT_SDB_START_DIM fprintf(asm_out_file, "\t.dim\t")
192 #endif
193
194 #ifndef PUT_SDB_NEXT_DIM
195 #define PUT_SDB_NEXT_DIM(a) fprintf(asm_out_file, "%d,", a)
196 #endif
197
198 #ifndef PUT_SDB_LAST_DIM
199 #define PUT_SDB_LAST_DIM(a) fprintf(asm_out_file, "%d%s", a, SDB_DELIM)
200 #endif
201
202 #ifndef PUT_SDB_TAG
203 #define PUT_SDB_TAG(a)                          \
204 do { fprintf (asm_out_file, "\t.tag\t");        \
205      assemble_name (asm_out_file, a);   \
206      fprintf (asm_out_file, SDB_DELIM); } while (0)
207 #endif
208
209 #ifndef PUT_SDB_BLOCK_START
210 #define PUT_SDB_BLOCK_START(LINE)               \
211   fprintf (asm_out_file,                        \
212            "\t.def\t.bb%s\t.val\t.%s\t.scl\t100%s\t.line\t%d%s\t.endef\n", \
213            SDB_DELIM, SDB_DELIM, SDB_DELIM, (LINE), SDB_DELIM)
214 #endif
215
216 #ifndef PUT_SDB_BLOCK_END
217 #define PUT_SDB_BLOCK_END(LINE)                 \
218   fprintf (asm_out_file,                        \
219            "\t.def\t.eb%s\t.val\t.%s\t.scl\t100%s\t.line\t%d%s\t.endef\n",  \
220            SDB_DELIM, SDB_DELIM, SDB_DELIM, (LINE), SDB_DELIM)
221 #endif
222
223 #ifndef PUT_SDB_FUNCTION_START
224 #define PUT_SDB_FUNCTION_START(LINE)            \
225   fprintf (asm_out_file,                        \
226            "\t.def\t.bf%s\t.val\t.%s\t.scl\t101%s\t.line\t%d%s\t.endef\n", \
227            SDB_DELIM, SDB_DELIM, SDB_DELIM, (LINE), SDB_DELIM)
228 #endif
229
230 #ifndef PUT_SDB_FUNCTION_END
231 #define PUT_SDB_FUNCTION_END(LINE)              \
232   fprintf (asm_out_file,                        \
233            "\t.def\t.ef%s\t.val\t.%s\t.scl\t101%s\t.line\t%d%s\t.endef\n", \
234            SDB_DELIM, SDB_DELIM, SDB_DELIM, (LINE), SDB_DELIM)
235 #endif
236
237 #ifndef PUT_SDB_EPILOGUE_END
238 #define PUT_SDB_EPILOGUE_END(NAME)                      \
239 do { fprintf (asm_out_file, "\t.def\t");                \
240      assemble_name (asm_out_file, NAME);                \
241      fprintf (asm_out_file,                             \
242               "%s\t.val\t.%s\t.scl\t-1%s\t.endef\n",    \
243               SDB_DELIM, SDB_DELIM, SDB_DELIM); } while (0)
244 #endif
245
246 #ifndef SDB_GENERATE_FAKE
247 #define SDB_GENERATE_FAKE(BUFFER, NUMBER) \
248   sprintf ((BUFFER), ".%dfake", (NUMBER));
249 #endif
250
251 /* Return the sdb tag identifier string for TYPE
252    if TYPE has already been defined; otherwise return a null pointer.   */
253
254 #define KNOWN_TYPE_TAG(type)  TYPE_SYMTAB_POINTER (type)
255
256 /* Set the sdb tag identifier string for TYPE to NAME.  */
257
258 #define SET_KNOWN_TYPE_TAG(TYPE, NAME) \
259   TYPE_SYMTAB_POINTER (TYPE) = (NAME)
260
261 /* Return the name (a string) of the struct, union or enum tag
262    described by the TREE_LIST node LINK.  This is 0 for an anonymous one.  */
263
264 #define TAG_NAME(link) \
265   (((link) && TREE_PURPOSE ((link)) \
266     && IDENTIFIER_POINTER (TREE_PURPOSE ((link)))) \
267    ? IDENTIFIER_POINTER (TREE_PURPOSE ((link))) : (char *) 0)
268
269 /* Ensure we don't output a negative line number.  */
270 #define MAKE_LINE_SAFE(line)  \
271   if (line <= sdb_begin_function_line) line = sdb_begin_function_line + 1
272
273 /* Perform linker optimization of merging header file definitions together
274    for targets with MIPS_DEBUGGING_INFO defined.  This won't work without a
275    post 960826 version of GAS.  Nothing breaks with earlier versions of GAS,
276    the optimization just won't be done.  The native assembler already has the
277    necessary support.  */
278
279 #ifdef MIPS_DEBUGGING_INFO
280
281 #ifndef PUT_SDB_SRC_FILE
282 #define PUT_SDB_SRC_FILE(FILENAME) \
283 output_file_directive (asm_out_file, (FILENAME))
284 #endif
285
286 /* ECOFF linkers have an optimization that does the same kind of thing as
287    N_BINCL/E_INCL in stabs: eliminate duplicate debug information in the
288    executable.  To achieve this, GCC must output a .file for each file
289    name change.  */
290
291 /* This is a stack of input files.  */
292
293 struct sdb_file
294 {
295   struct sdb_file *next;
296   const char *name;
297 };
298
299 /* This is the top of the stack.  */
300
301 static struct sdb_file *current_file;
302
303 #endif /* MIPS_DEBUGGING_INFO */
304 \f
305
306 #if 0
307
308 /* return the tag identifier for type
309  */
310
311 char *
312 tag_of_ru_type (type,link)
313      tree type,link;
314 {
315   if (TYPE_SYMTAB_ADDRESS (type))
316     return TYPE_SYMTAB_ADDRESS (type);
317   if (link && TREE_PURPOSE (link)
318       && IDENTIFIER_POINTER (TREE_PURPOSE (link)))
319     TYPE_SYMTAB_ADDRESS (type) = IDENTIFIER_POINTER (TREE_PURPOSE (link));
320   else
321     return (char *) TYPE_SYMTAB_ADDRESS (type);
322 }
323 #endif
324
325 /* Return a unique string to name an anonymous type.  */
326
327 static char *
328 gen_fake_label ()
329 {
330   char label[10];
331   char *labelstr;
332   SDB_GENERATE_FAKE (label, unnamed_struct_number);
333   unnamed_struct_number++;
334   labelstr = (char *) permalloc (strlen (label) + 1);
335   strcpy (labelstr, label);
336   return labelstr;
337 }
338 \f
339 /* Return the number which describes TYPE for SDB.
340    For pointers, etc., this function is recursive.
341    Each record, union or enumeral type must already have had a
342    tag number output.  */
343
344 /* The number is given by d6d5d4d3d2d1bbbb
345    where bbbb is 4 bit basic type, and di indicate  one of notype,ptr,fn,array.
346    Thus, char *foo () has bbbb=T_CHAR
347                           d1=D_FCN
348                           d2=D_PTR
349  N_BTMASK=     017       1111     basic type field.
350  N_TSHIFT=       2                derived type shift
351  N_BTSHFT=       4                Basic type shift */
352
353 /* Produce the number that describes a pointer, function or array type.
354    PREV is the number describing the target, value or element type.
355    DT_type describes how to transform that type.  */
356 #define PUSH_DERIVED_LEVEL(DT_type,PREV)                \
357   ((((PREV) & ~(int)N_BTMASK) << (int)N_TSHIFT)         \
358    | ((int)DT_type << (int)N_BTSHFT)                    \
359    | ((PREV) & (int)N_BTMASK))
360
361 /* Number of elements used in sdb_dims.  */
362 static int sdb_n_dims = 0;
363
364 /* Table of array dimensions of current type.  */
365 static int sdb_dims[SDB_MAX_DIM];
366
367 /* Size of outermost array currently being processed.  */
368 static int sdb_type_size = -1;
369
370 static int
371 plain_type (type)
372      tree type;
373 {
374   int val = plain_type_1 (type, 0);
375
376   /* If we have already saved up some array dimensions, print them now.  */
377   if (sdb_n_dims > 0)
378     {
379       int i;
380       PUT_SDB_START_DIM;
381       for (i = sdb_n_dims - 1; i > 0; i--)
382         PUT_SDB_NEXT_DIM (sdb_dims[i]);
383       PUT_SDB_LAST_DIM (sdb_dims[0]);
384       sdb_n_dims = 0;
385
386       sdb_type_size = int_size_in_bytes (type);
387       /* Don't kill sdb if type is not laid out or has variable size.  */
388       if (sdb_type_size < 0)
389         sdb_type_size = 0;
390     }
391   /* If we have computed the size of an array containing this type,
392      print it now.  */
393   if (sdb_type_size >= 0)
394     {
395       PUT_SDB_SIZE (sdb_type_size);
396       sdb_type_size = -1;
397     }
398   return val;
399 }
400
401 static int
402 template_name_p (name)
403      tree name;
404 {
405   register const char *ptr = IDENTIFIER_POINTER (name);
406   while (*ptr && *ptr != '<')
407     ptr++;
408
409   return *ptr != '\0';
410 }
411
412 static void
413 sdbout_record_type_name (type)
414      tree type;
415 {
416   const char *name = 0;
417   int no_name;
418
419   if (KNOWN_TYPE_TAG (type))
420     return;
421
422   if (TYPE_NAME (type) != 0)
423     {
424       tree t = 0;
425       /* Find the IDENTIFIER_NODE for the type name.  */
426       if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
427         t = TYPE_NAME (type);
428       else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
429         {
430           t = DECL_NAME (TYPE_NAME (type));
431           /* The DECL_NAME for templates includes "<>", which breaks
432              most assemblers.  Use its assembler name instead, which
433              has been mangled into being safe.  */
434           if (t && template_name_p (t))
435             t = DECL_ASSEMBLER_NAME (TYPE_NAME (type));
436         }
437
438       /* Now get the name as a string, or invent one.  */
439       if (t != NULL_TREE)
440         name = IDENTIFIER_POINTER (t);
441     }
442
443   no_name = (name == 0 || *name == 0);
444   if (no_name)
445     name = gen_fake_label ();
446
447   SET_KNOWN_TYPE_TAG (type, name);
448 #ifdef SDB_ALLOW_FORWARD_REFERENCES
449   if (no_name)
450     sdbout_queue_anonymous_type (type);
451 #endif
452 }
453
454 /* Return the .type value for type TYPE.
455
456    LEVEL indicates how many levels deep we have recursed into the type.
457    The SDB debug format can only represent 6 derived levels of types.
458    After that, we must output inaccurate debug info.  We deliberately
459    stop before the 7th level, so that ADA recursive types will not give an
460    infinite loop.  */
461
462 static int
463 plain_type_1 (type, level)
464      tree type;
465      int level;
466 {
467   if (type == 0)
468     type = void_type_node;
469   else if (type == error_mark_node)
470     type = integer_type_node;
471   else
472     type = TYPE_MAIN_VARIANT (type);
473
474   switch (TREE_CODE (type))
475     {
476     case VOID_TYPE:
477       return T_VOID;
478     case BOOLEAN_TYPE:
479     case INTEGER_TYPE:
480       {
481         int size = int_size_in_bytes (type) * BITS_PER_UNIT;
482
483         /* Carefully distinguish all the standard types of C,
484            without messing up if the language is not C.
485            Note that we check only for the names that contain spaces;
486            other names might occur by coincidence in other languages.  */
487         if (TYPE_NAME (type) != 0
488             && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
489             && DECL_NAME (TYPE_NAME (type)) != 0
490             && TREE_CODE (DECL_NAME (TYPE_NAME (type))) == IDENTIFIER_NODE)
491           {
492             const char *name
493               = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
494
495             if (!strcmp (name, "char"))
496               return T_CHAR;
497             if (!strcmp (name, "unsigned char"))
498               return T_UCHAR;
499             if (!strcmp (name, "signed char"))
500               return T_CHAR;
501             if (!strcmp (name, "int"))
502               return T_INT;
503             if (!strcmp (name, "unsigned int"))
504               return T_UINT;
505             if (!strcmp (name, "short int"))
506               return T_SHORT;
507             if (!strcmp (name, "short unsigned int"))
508               return T_USHORT;
509             if (!strcmp (name, "long int"))
510               return T_LONG;
511             if (!strcmp (name, "long unsigned int"))
512               return T_ULONG;
513           }
514
515         if (size == INT_TYPE_SIZE)
516           return (TREE_UNSIGNED (type) ? T_UINT : T_INT);
517         if (size == CHAR_TYPE_SIZE)
518           return (TREE_UNSIGNED (type) ? T_UCHAR : T_CHAR);
519         if (size == SHORT_TYPE_SIZE)
520           return (TREE_UNSIGNED (type) ? T_USHORT : T_SHORT);
521         if (size == LONG_TYPE_SIZE)
522           return (TREE_UNSIGNED (type) ? T_ULONG : T_LONG);
523         if (size == LONG_LONG_TYPE_SIZE)        /* better than nothing */
524           return (TREE_UNSIGNED (type) ? T_ULONG : T_LONG);
525         return 0;
526       }
527
528     case REAL_TYPE:
529       {
530         int precision = TYPE_PRECISION (type);
531         if (precision == FLOAT_TYPE_SIZE)
532           return T_FLOAT;
533         if (precision == DOUBLE_TYPE_SIZE)
534           return T_DOUBLE;
535 #ifdef EXTENDED_SDB_BASIC_TYPES
536         if (precision == LONG_DOUBLE_TYPE_SIZE)
537           return T_LNGDBL;
538 #else
539         if (precision == LONG_DOUBLE_TYPE_SIZE)
540           return T_DOUBLE;      /* better than nothing */
541 #endif
542         return 0;
543       }
544
545     case ARRAY_TYPE:
546       {
547         int m;
548         if (level >= 6)
549           return T_VOID;
550         else
551           m = plain_type_1 (TREE_TYPE (type), level+1);
552         if (sdb_n_dims < SDB_MAX_DIM)
553           sdb_dims[sdb_n_dims++]
554             = (TYPE_DOMAIN (type)
555                && TYPE_MIN_VALUE (TYPE_DOMAIN (type)) != 0
556                && TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != 0
557                && host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (type)), 0)
558                && host_integerp (TYPE_MIN_VALUE (TYPE_DOMAIN (type)), 0)
559                ? (tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (type)), 0)
560                   - tree_low_cst (TYPE_MIN_VALUE (TYPE_DOMAIN (type)), 0) + 1)
561                : 0);
562
563         return PUSH_DERIVED_LEVEL (DT_ARY, m);
564       }
565
566     case RECORD_TYPE:
567     case UNION_TYPE:
568     case QUAL_UNION_TYPE:
569     case ENUMERAL_TYPE:
570       {
571         char *tag;
572 #ifdef SDB_ALLOW_FORWARD_REFERENCES
573         sdbout_record_type_name (type);
574 #endif
575 #ifndef SDB_ALLOW_UNKNOWN_REFERENCES
576         if ((TREE_ASM_WRITTEN (type) && KNOWN_TYPE_TAG (type) != 0)
577 #ifdef SDB_ALLOW_FORWARD_REFERENCES
578             || TYPE_MODE (type) != VOIDmode
579 #endif
580             )
581 #endif
582           {
583             /* Output the referenced structure tag name
584                only if the .def has already been finished.
585                At least on 386, the Unix assembler
586                cannot handle forward references to tags.  */
587             /* But the 88100, it requires them, sigh...  */
588             /* And the MIPS requires unknown refs as well...  */
589             tag = KNOWN_TYPE_TAG (type);
590             PUT_SDB_TAG (tag);
591             /* These 3 lines used to follow the close brace.
592                However, a size of 0 without a tag implies a tag of 0,
593                so if we don't know a tag, we can't mention the size.  */
594             sdb_type_size = int_size_in_bytes (type);
595             if (sdb_type_size < 0)
596               sdb_type_size = 0;
597           }
598         return ((TREE_CODE (type) == RECORD_TYPE) ? T_STRUCT
599                 : (TREE_CODE (type) == UNION_TYPE) ? T_UNION
600                 : (TREE_CODE (type) == QUAL_UNION_TYPE) ? T_UNION
601                 : T_ENUM);
602       }
603     case POINTER_TYPE:
604     case REFERENCE_TYPE:
605       {
606         int m;
607         if (level >= 6)
608           return T_VOID;
609         else
610           m = plain_type_1 (TREE_TYPE (type), level+1);
611         return PUSH_DERIVED_LEVEL (DT_PTR, m);
612       }
613     case FUNCTION_TYPE:
614     case METHOD_TYPE:
615       {
616         int m;
617         if (level >= 6)
618           return T_VOID;
619         else
620           m = plain_type_1 (TREE_TYPE (type), level+1);
621         return PUSH_DERIVED_LEVEL (DT_FCN, m);
622       }
623     default:
624       return 0;
625     }
626 }
627 \f
628 /* Output the symbols defined in block number DO_BLOCK.
629
630    This function works by walking the tree structure of blocks,
631    counting blocks until it finds the desired block.  */
632
633 static int do_block = 0;
634
635 static void
636 sdbout_block (block)
637      register tree block;
638 {
639   while (block)
640     {
641       /* Ignore blocks never expanded or otherwise marked as real.  */
642       if (TREE_USED (block))
643         {
644           /* When we reach the specified block, output its symbols.  */
645           if (BLOCK_NUMBER (block) == do_block)
646             sdbout_syms (BLOCK_VARS (block));
647
648           /* If we are past the specified block, stop the scan.  */
649           if (BLOCK_NUMBER (block) > do_block)
650             return;
651
652           /* Scan the blocks within this block.  */
653           sdbout_block (BLOCK_SUBBLOCKS (block));
654         }
655
656       block = BLOCK_CHAIN (block);
657     }
658 }
659 \f
660 /* Call sdbout_symbol on each decl in the chain SYMS.  */
661
662 static void
663 sdbout_syms (syms)
664      tree syms;
665 {
666   while (syms)
667     {
668       if (TREE_CODE (syms) != LABEL_DECL)
669         sdbout_symbol (syms, 1);
670       syms = TREE_CHAIN (syms);
671     }
672 }
673
674 /* Output SDB information for a symbol described by DECL.
675    LOCAL is nonzero if the symbol is not file-scope.  */
676
677 void
678 sdbout_symbol (decl, local)
679      tree decl;
680      int local;
681 {
682   tree type = TREE_TYPE (decl);
683   tree context = NULL_TREE;
684   rtx value;
685   int regno = -1;
686   const char *name;
687
688   sdbout_one_type (type);
689
690 #if 0 /* This loses when functions are marked to be ignored,
691          which happens in the C++ front end.  */
692   if (DECL_IGNORED_P (decl))
693     return;
694 #endif
695
696   switch (TREE_CODE (decl))
697     {
698     case CONST_DECL:
699       /* Enum values are defined by defining the enum type.  */
700       return;
701
702     case FUNCTION_DECL:
703       /* Don't mention a nested function under its parent.  */
704       context = decl_function_context (decl);
705       if (context == current_function_decl)
706         return;
707       /* Check DECL_INITIAL to distinguish declarations from definitions.
708          Don't output debug info here for declarations; they will have
709          a DECL_INITIAL value of 0.  */
710       if (! DECL_INITIAL (decl))
711         return;
712       if (GET_CODE (DECL_RTL (decl)) != MEM
713           || GET_CODE (XEXP (DECL_RTL (decl), 0)) != SYMBOL_REF)
714         return;
715       PUT_SDB_DEF (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
716       PUT_SDB_VAL (XEXP (DECL_RTL (decl), 0));
717       PUT_SDB_SCL (TREE_PUBLIC (decl) ? C_EXT : C_STAT);
718       break;
719
720     case TYPE_DECL:
721       /* Done with tagged types.  */
722       if (DECL_NAME (decl) == 0)
723         return;
724       if (DECL_IGNORED_P (decl))
725         return;
726
727       /* Output typedef name.  */
728       if (template_name_p (DECL_NAME (decl)))
729         PUT_SDB_DEF (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
730       else
731         PUT_SDB_DEF (IDENTIFIER_POINTER (DECL_NAME (decl)));
732       PUT_SDB_SCL (C_TPDEF);
733       break;
734
735     case PARM_DECL:
736       /* Parm decls go in their own separate chains
737          and are output by sdbout_reg_parms and sdbout_parms.  */
738       abort ();
739
740     case VAR_DECL:
741       /* Don't mention a variable that is external.
742          Let the file that defines it describe it.  */
743       if (DECL_EXTERNAL (decl))
744         return;
745
746       /* Ignore __FUNCTION__, etc.  */
747       if (DECL_IGNORED_P (decl))
748         return;
749
750       /* If there was an error in the declaration, don't dump core
751          if there is no RTL associated with the variable doesn't
752          exist.  */
753       if (!DECL_RTL_SET_P (decl))
754         return;
755
756       SET_DECL_RTL (decl, 
757                     eliminate_regs (DECL_RTL (decl), 0, NULL_RTX));
758 #ifdef LEAF_REG_REMAP
759       if (current_function_uses_only_leaf_regs)
760         leaf_renumber_regs_insn (DECL_RTL (decl));
761 #endif
762       value = DECL_RTL (decl);
763
764       /* Don't mention a variable at all
765          if it was completely optimized into nothingness.
766
767          If DECL was from an inline function, then its rtl
768          is not identically the rtl that was used in this
769          particular compilation.  */
770       if (GET_CODE (value) == REG)
771         {
772           regno = REGNO (DECL_RTL (decl));
773           if (regno >= FIRST_PSEUDO_REGISTER)
774             return;
775         }
776       else if (GET_CODE (value) == SUBREG)
777         {
778           int offset = 0;
779
780           while (GET_CODE (value) == SUBREG)
781             value = SUBREG_REG (value);
782           if (GET_CODE (value) == REG)
783             {
784               if (REGNO (value) >= FIRST_PSEUDO_REGISTER)
785                 return;
786             }
787           regno = REGNO (alter_subreg (DECL_RTL (decl)));
788           value = DECL_RTL (decl);
789         }
790       /* Don't output anything if an auto variable
791          gets RTL that is static.
792          GAS version 2.2 can't handle such output.  */
793       else if (GET_CODE (value) == MEM && CONSTANT_P (XEXP (value, 0))
794                && ! TREE_STATIC (decl))
795         return;
796
797       /* Emit any structure, union, or enum type that has not been output.
798          This occurs for tag-less structs (et al) used to declare variables
799          within functions.  */
800       if (TREE_CODE (type) == ENUMERAL_TYPE
801           || TREE_CODE (type) == RECORD_TYPE
802           || TREE_CODE (type) == UNION_TYPE
803           || TREE_CODE (type) == QUAL_UNION_TYPE)
804         {
805           if (COMPLETE_TYPE_P (type)            /* not a forward reference */
806               && KNOWN_TYPE_TAG (type) == 0)    /* not yet declared */
807             sdbout_one_type (type);
808         }
809
810       /* Defer SDB information for top-level initialized variables! */
811       if (! local
812           && GET_CODE (value) == MEM
813           && DECL_INITIAL (decl))
814         return;
815
816       /* C++ in 2.3 makes nameless symbols.  That will be fixed later.
817          For now, avoid crashing.  */
818       if (DECL_NAME (decl) == NULL_TREE)
819         return;
820
821       /* Record the name for, starting a symtab entry.  */
822       if (local)
823         name = IDENTIFIER_POINTER (DECL_NAME (decl));
824       else
825         name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
826
827       if (GET_CODE (value) == MEM
828           && GET_CODE (XEXP (value, 0)) == SYMBOL_REF)
829         {
830           PUT_SDB_DEF (name);
831           if (TREE_PUBLIC (decl))
832             {
833               PUT_SDB_VAL (XEXP (value, 0));
834               PUT_SDB_SCL (C_EXT);
835             }
836           else
837             {
838               PUT_SDB_VAL (XEXP (value, 0));
839               PUT_SDB_SCL (C_STAT);
840             }
841         }
842       else if (regno >= 0)
843         {
844           PUT_SDB_DEF (name);
845           PUT_SDB_INT_VAL (DBX_REGISTER_NUMBER (regno));
846           PUT_SDB_SCL (C_REG);
847         }
848       else if (GET_CODE (value) == MEM
849                && (GET_CODE (XEXP (value, 0)) == MEM
850                    || (GET_CODE (XEXP (value, 0)) == REG
851                        && REGNO (XEXP (value, 0)) != HARD_FRAME_POINTER_REGNUM
852                        && REGNO (XEXP (value, 0)) != STACK_POINTER_REGNUM)))
853         /* If the value is indirect by memory or by a register
854            that isn't the frame pointer
855            then it means the object is variable-sized and address through
856            that register or stack slot.  COFF has no way to represent this
857            so all we can do is output the variable as a pointer.  */
858         {
859           PUT_SDB_DEF (name);
860           if (GET_CODE (XEXP (value, 0)) == REG)
861             {
862               PUT_SDB_INT_VAL (DBX_REGISTER_NUMBER (REGNO (XEXP (value, 0))));
863               PUT_SDB_SCL (C_REG);
864             }
865           else
866             {
867               /* DECL_RTL looks like (MEM (MEM (PLUS (REG...)
868                  (CONST_INT...)))).
869                  We want the value of that CONST_INT.  */
870               /* Encore compiler hates a newline in a macro arg, it seems.  */
871               PUT_SDB_INT_VAL (DEBUGGER_AUTO_OFFSET
872                                (XEXP (XEXP (value, 0), 0)));
873               PUT_SDB_SCL (C_AUTO);
874             }
875
876           /* Effectively do build_pointer_type, but don't cache this type,
877              since it might be temporary whereas the type it points to
878              might have been saved for inlining.  */
879           /* Don't use REFERENCE_TYPE because dbx can't handle that.  */
880           type = make_node (POINTER_TYPE);
881           TREE_TYPE (type) = TREE_TYPE (decl);
882         }
883       else if (GET_CODE (value) == MEM
884                && ((GET_CODE (XEXP (value, 0)) == PLUS
885                     && GET_CODE (XEXP (XEXP (value, 0), 0)) == REG
886                     && GET_CODE (XEXP (XEXP (value, 0), 1)) == CONST_INT)
887                    /* This is for variables which are at offset zero from
888                       the frame pointer.  This happens on the Alpha.
889                       Non-frame pointer registers are excluded above.  */
890                    || (GET_CODE (XEXP (value, 0)) == REG)))
891         {
892           /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...)))
893              or (MEM (REG...)).  We want the value of that CONST_INT
894              or zero.  */
895           PUT_SDB_DEF (name);
896           PUT_SDB_INT_VAL (DEBUGGER_AUTO_OFFSET (XEXP (value, 0)));
897           PUT_SDB_SCL (C_AUTO);
898         }
899       else if (GET_CODE (value) == MEM && GET_CODE (XEXP (value, 0)) == CONST)
900         {
901           /* Handle an obscure case which can arise when optimizing and
902              when there are few available registers.  (This is *always*
903              the case for i386/i486 targets).  The DECL_RTL looks like
904              (MEM (CONST ...)) even though this variable is a local `auto'
905              or a local `register' variable.  In effect, what has happened
906              is that the reload pass has seen that all assignments and
907              references for one such a local variable can be replaced by
908              equivalent assignments and references to some static storage
909              variable, thereby avoiding the need for a register.  In such
910              cases we're forced to lie to debuggers and tell them that
911              this variable was itself `static'.  */
912           PUT_SDB_DEF (name);
913           PUT_SDB_VAL (XEXP (XEXP (value, 0), 0));
914           PUT_SDB_SCL (C_STAT);
915         }
916       else
917         {
918           /* It is something we don't know how to represent for SDB.  */
919           return;
920         }
921       break;
922
923     default:
924       break;
925     }
926   PUT_SDB_TYPE (plain_type (type));
927   PUT_SDB_ENDEF;
928 }
929 \f
930 /* Output SDB information for a top-level initialized variable
931    that has been delayed.  */
932
933 void
934 sdbout_toplevel_data (decl)
935      tree decl;
936 {
937   tree type = TREE_TYPE (decl);
938
939   if (DECL_IGNORED_P (decl))
940     return;
941
942   if (! (TREE_CODE (decl) == VAR_DECL
943          && GET_CODE (DECL_RTL (decl)) == MEM
944          && DECL_INITIAL (decl)))
945     abort ();
946
947   PUT_SDB_DEF (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
948   PUT_SDB_VAL (XEXP (DECL_RTL (decl), 0));
949   if (TREE_PUBLIC (decl))
950     {
951       PUT_SDB_SCL (C_EXT);
952     }
953   else
954     {
955       PUT_SDB_SCL (C_STAT);
956     }
957   PUT_SDB_TYPE (plain_type (type));
958   PUT_SDB_ENDEF;
959 }
960 \f
961 #ifdef SDB_ALLOW_FORWARD_REFERENCES
962
963 /* Machinery to record and output anonymous types.  */
964
965 static tree anonymous_types;
966
967 static void
968 sdbout_queue_anonymous_type (type)
969      tree type;
970 {
971   anonymous_types = tree_cons (NULL_TREE, type, anonymous_types);
972 }
973
974 static void
975 sdbout_dequeue_anonymous_types ()
976 {
977   register tree types, link;
978
979   while (anonymous_types)
980     {
981       types = nreverse (anonymous_types);
982       anonymous_types = NULL_TREE;
983
984       for (link = types; link; link = TREE_CHAIN (link))
985         {
986           register tree type = TREE_VALUE (link);
987
988           if (type && ! TREE_ASM_WRITTEN (type))
989             sdbout_one_type (type);
990         }
991     }
992 }
993
994 #endif
995 \f
996 /* Given a chain of ..._TYPE nodes, all of which have names,
997    output definitions of those names, as typedefs.  */
998
999 void
1000 sdbout_types (types)
1001      register tree types;
1002 {
1003   register tree link;
1004
1005   for (link = types; link; link = TREE_CHAIN (link))
1006     sdbout_one_type (link);
1007
1008 #ifdef SDB_ALLOW_FORWARD_REFERENCES
1009   sdbout_dequeue_anonymous_types ();
1010 #endif
1011 }
1012
1013 static void
1014 sdbout_type (type)
1015      tree type;
1016 {
1017   if (type == error_mark_node)
1018     type = integer_type_node;
1019   PUT_SDB_TYPE (plain_type (type));
1020 }
1021
1022 /* Output types of the fields of type TYPE, if they are structs.
1023
1024    Formerly did not chase through pointer types, since that could be circular.
1025    They must come before TYPE, since forward refs are not allowed.
1026    Now james@bigtex.cactus.org says to try them.  */
1027
1028 static void
1029 sdbout_field_types (type)
1030      tree type;
1031 {
1032   tree tail;
1033
1034   for (tail = TYPE_FIELDS (type); tail; tail = TREE_CHAIN (tail))
1035     /* This condition should match the one for emitting the actual
1036        members below.  */
1037     if (TREE_CODE (tail) == FIELD_DECL
1038         && DECL_NAME (tail)
1039         && DECL_SIZE (tail)
1040         && host_integerp (DECL_SIZE (tail), 1)
1041         && host_integerp (bit_position (tail), 0))
1042       {
1043         if (POINTER_TYPE_P (TREE_TYPE (tail)))
1044           sdbout_one_type (TREE_TYPE (TREE_TYPE (tail)));
1045         else
1046           sdbout_one_type (TREE_TYPE (tail));
1047       }
1048 }
1049
1050 /* Use this to put out the top level defined record and union types
1051    for later reference.  If this is a struct with a name, then put that
1052    name out.  Other unnamed structs will have .xxfake labels generated so
1053    that they may be referred to later.
1054    The label will be stored in the KNOWN_TYPE_TAG slot of a type.
1055    It may NOT be called recursively.  */
1056
1057 static void
1058 sdbout_one_type (type)
1059      tree type;
1060 {
1061   if (current_function_decl != NULL_TREE
1062       && DECL_SECTION_NAME (current_function_decl) != NULL_TREE)
1063     ; /* Don't change section amid function.  */
1064   else
1065     text_section ();
1066
1067   switch (TREE_CODE (type))
1068     {
1069     case RECORD_TYPE:
1070     case UNION_TYPE:
1071     case QUAL_UNION_TYPE:
1072     case ENUMERAL_TYPE:
1073       type = TYPE_MAIN_VARIANT (type);
1074       /* Don't output a type twice.  */
1075       if (TREE_ASM_WRITTEN (type))
1076         /* James said test TREE_ASM_BEING_WRITTEN here.  */
1077         return;
1078
1079       /* Output nothing if type is not yet defined.  */
1080       if (!COMPLETE_TYPE_P (type))
1081         return;
1082
1083       TREE_ASM_WRITTEN (type) = 1;
1084 #if 1
1085       /* This is reputed to cause trouble with the following case,
1086          but perhaps checking TYPE_SIZE above will fix it.  */
1087
1088       /* Here is a test case:
1089
1090         struct foo {
1091           struct badstr *bbb;
1092         } forwardref;
1093
1094         typedef struct intermediate {
1095           int aaaa;
1096         } intermediate_ref;
1097
1098         typedef struct badstr {
1099           int ccccc;
1100         } badtype;   */
1101
1102 #if 0
1103       TREE_ASM_BEING_WRITTEN (type) = 1;
1104 #endif
1105       /* This change, which ought to make better output,
1106          used to make the COFF assembler unhappy.
1107          Changes involving KNOWN_TYPE_TAG may fix the problem.  */
1108       /* Before really doing anything, output types we want to refer to.  */
1109       /* Note that in version 1 the following two lines
1110          are not used if forward references are in use.  */
1111       if (TREE_CODE (type) != ENUMERAL_TYPE)
1112         sdbout_field_types (type);
1113 #if 0
1114       TREE_ASM_WRITTEN (type) = 1;
1115 #endif
1116 #endif
1117
1118       /* Output a structure type.  */
1119       {
1120         int size = int_size_in_bytes (type);
1121         int member_scl = 0;
1122         tree tem;
1123         int i, n_baseclasses = 0;
1124
1125         /* Record the type tag, but not in its permanent place just yet.  */
1126         sdbout_record_type_name (type);
1127
1128         PUT_SDB_DEF (KNOWN_TYPE_TAG (type));
1129
1130         switch (TREE_CODE (type))
1131           {
1132           case UNION_TYPE:
1133           case QUAL_UNION_TYPE:
1134             PUT_SDB_SCL (C_UNTAG);
1135             PUT_SDB_TYPE (T_UNION);
1136             member_scl = C_MOU;
1137             break;
1138
1139           case RECORD_TYPE:
1140             PUT_SDB_SCL (C_STRTAG);
1141             PUT_SDB_TYPE (T_STRUCT);
1142             member_scl = C_MOS;
1143             break;
1144
1145           case ENUMERAL_TYPE:
1146             PUT_SDB_SCL (C_ENTAG);
1147             PUT_SDB_TYPE (T_ENUM);
1148             member_scl = C_MOE;
1149             break;
1150
1151           default:
1152             break;
1153           }
1154
1155         PUT_SDB_SIZE (size);
1156         PUT_SDB_ENDEF;
1157
1158         /* Print out the base class information with fields
1159            named after the types they hold.  */
1160         /* This is only relevent to aggregate types.  TYPE_BINFO is used
1161            for other purposes in an ENUMERAL_TYPE, so we must exclude that
1162            case.  */
1163         if (TREE_CODE (type) != ENUMERAL_TYPE)
1164           {
1165             if (TYPE_BINFO (type)
1166                 && TYPE_BINFO_BASETYPES (type))
1167               n_baseclasses = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (type));
1168             for (i = 0; i < n_baseclasses; i++)
1169               {
1170                 tree child = TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (type)),
1171                                            i);
1172                 tree child_type = BINFO_TYPE (child);
1173                 tree child_type_name;
1174                 if (TYPE_NAME (child_type) == 0)
1175                   continue;
1176                 if (TREE_CODE (TYPE_NAME (child_type)) == IDENTIFIER_NODE)
1177                   child_type_name = TYPE_NAME (child_type);
1178                 else if (TREE_CODE (TYPE_NAME (child_type)) == TYPE_DECL)
1179                   {
1180                     child_type_name = DECL_NAME (TYPE_NAME (child_type));
1181                     if (child_type_name && template_name_p (child_type_name))
1182                       child_type_name
1183                         = DECL_ASSEMBLER_NAME (TYPE_NAME (child_type));
1184                   }
1185                 else
1186                   continue;
1187
1188                 CONTIN;
1189                 PUT_SDB_DEF (IDENTIFIER_POINTER (child_type_name));
1190                 PUT_SDB_INT_VAL (tree_low_cst (BINFO_OFFSET (child), 0));
1191                 PUT_SDB_SCL (member_scl);
1192                 sdbout_type (BINFO_TYPE (child));
1193                 PUT_SDB_ENDEF;
1194               }
1195           }
1196
1197         /* output the individual fields */
1198
1199         if (TREE_CODE (type) == ENUMERAL_TYPE)
1200           {
1201             for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
1202               if (host_integerp (TREE_VALUE (tem), 0))
1203                 {
1204                   PUT_SDB_DEF (IDENTIFIER_POINTER (TREE_PURPOSE (tem)));
1205                   PUT_SDB_INT_VAL (tree_low_cst (TREE_VALUE (tem), 0));
1206                   PUT_SDB_SCL (C_MOE);
1207                   PUT_SDB_TYPE (T_MOE);
1208                   PUT_SDB_ENDEF;
1209                 }
1210           }
1211         else                    /* record or union type */
1212           for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
1213             /* Output the name, type, position (in bits), size (in bits)
1214                of each field.  */
1215
1216             /* Omit here the nameless fields that are used to skip bits.
1217                Also omit fields with variable size or position.
1218                Also omit non FIELD_DECL nodes that GNU C++ may put here.  */
1219             if (TREE_CODE (tem) == FIELD_DECL
1220                 && DECL_NAME (tem)
1221                 && DECL_SIZE (tem)
1222                 && host_integerp (DECL_SIZE (tem), 1)
1223                 && host_integerp (bit_position (tem), 0))
1224               {
1225                 const char *name;
1226
1227                 CONTIN;
1228                 name = IDENTIFIER_POINTER (DECL_NAME (tem));
1229                 PUT_SDB_DEF (name);
1230                 if (DECL_BIT_FIELD_TYPE (tem))
1231                   {
1232                     PUT_SDB_INT_VAL (int_bit_position (tem));
1233                     PUT_SDB_SCL (C_FIELD);
1234                     sdbout_type (DECL_BIT_FIELD_TYPE (tem));
1235                     PUT_SDB_SIZE (tree_low_cst (DECL_SIZE (tem), 1));
1236                   }
1237                 else
1238                   {
1239                     PUT_SDB_INT_VAL (int_bit_position (tem) / BITS_PER_UNIT);
1240                     PUT_SDB_SCL (member_scl);
1241                     sdbout_type (TREE_TYPE (tem));
1242                   }
1243                 PUT_SDB_ENDEF;
1244               }
1245         /* output end of a structure,union, or enumeral definition */
1246
1247         PUT_SDB_PLAIN_DEF ("eos");
1248         PUT_SDB_INT_VAL (size);
1249         PUT_SDB_SCL (C_EOS);
1250         PUT_SDB_TAG (KNOWN_TYPE_TAG (type));
1251         PUT_SDB_SIZE (size);
1252         PUT_SDB_ENDEF;
1253         break;
1254
1255       default:
1256         break;
1257       }
1258     }
1259 }
1260 \f
1261 /* The following two functions output definitions of function parameters.
1262    Each parameter gets a definition locating it in the parameter list.
1263    Each parameter that is a register variable gets a second definition
1264    locating it in the register.
1265
1266    Printing or argument lists in gdb uses the definitions that
1267    locate in the parameter list.  But reference to the variable in
1268    expressions uses preferentially the definition as a register.  */
1269
1270 /* Output definitions, referring to storage in the parmlist,
1271    of all the parms in PARMS, which is a chain of PARM_DECL nodes.  */
1272
1273 static void
1274 sdbout_parms (parms)
1275      tree parms;
1276 {
1277   for (; parms; parms = TREE_CHAIN (parms))
1278     if (DECL_NAME (parms))
1279       {
1280         int current_sym_value = 0;
1281         const char *name = IDENTIFIER_POINTER (DECL_NAME (parms));
1282
1283         if (name == 0 || *name == 0)
1284           name = gen_fake_label ();
1285
1286         /* Perform any necessary register eliminations on the parameter's rtl,
1287            so that the debugging output will be accurate.  */
1288         DECL_INCOMING_RTL (parms)
1289           = eliminate_regs (DECL_INCOMING_RTL (parms), 0, NULL_RTX);
1290         SET_DECL_RTL (parms,
1291                       eliminate_regs (DECL_RTL (parms), 0, NULL_RTX));
1292
1293         if (PARM_PASSED_IN_MEMORY (parms))
1294           {
1295             rtx addr = XEXP (DECL_INCOMING_RTL (parms), 0);
1296             tree type;
1297
1298             /* ??? Here we assume that the parm address is indexed
1299                off the frame pointer or arg pointer.
1300                If that is not true, we produce meaningless results,
1301                but do not crash.  */
1302             if (GET_CODE (addr) == PLUS
1303                 && GET_CODE (XEXP (addr, 1)) == CONST_INT)
1304               current_sym_value = INTVAL (XEXP (addr, 1));
1305             else
1306               current_sym_value = 0;
1307
1308             if (GET_CODE (DECL_RTL (parms)) == REG
1309                 && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
1310               type = DECL_ARG_TYPE (parms);
1311             else
1312               {
1313                 int original_sym_value = current_sym_value;
1314
1315                 /* This is the case where the parm is passed as an int or
1316                    double and it is converted to a char, short or float
1317                    and stored back in the parmlist.  In this case, describe
1318                    the parm with the variable's declared type, and adjust
1319                    the address if the least significant bytes (which we are
1320                    using) are not the first ones.  */
1321                 if (BYTES_BIG_ENDIAN
1322                     && TREE_TYPE (parms) != DECL_ARG_TYPE (parms))
1323                   current_sym_value +=
1324                     (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms)))
1325                      - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms))));
1326
1327                 if (GET_CODE (DECL_RTL (parms)) == MEM
1328                     && GET_CODE (XEXP (DECL_RTL (parms), 0)) == PLUS
1329                     && (GET_CODE (XEXP (XEXP (DECL_RTL (parms), 0), 1))
1330                         == CONST_INT)
1331                     && (INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1))
1332                         == current_sym_value))
1333                   type = TREE_TYPE (parms);
1334                 else
1335                   {
1336                     current_sym_value = original_sym_value;
1337                     type = DECL_ARG_TYPE (parms);
1338                   }
1339               }
1340
1341             PUT_SDB_DEF (name);
1342             PUT_SDB_INT_VAL (DEBUGGER_ARG_OFFSET (current_sym_value, addr));
1343             PUT_SDB_SCL (C_ARG);
1344             PUT_SDB_TYPE (plain_type (type));
1345             PUT_SDB_ENDEF;
1346           }
1347         else if (GET_CODE (DECL_RTL (parms)) == REG)
1348           {
1349             rtx best_rtl;
1350             /* Parm passed in registers and lives in registers or nowhere.  */
1351
1352             /* If parm lives in a register, use that register;
1353                pretend the parm was passed there.  It would be more consistent
1354                to describe the register where the parm was passed,
1355                but in practice that register usually holds something else.  */
1356             if (REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
1357               best_rtl = DECL_RTL (parms);
1358             /* If the parm lives nowhere,
1359                use the register where it was passed.  */
1360             else
1361               best_rtl = DECL_INCOMING_RTL (parms);
1362
1363             PUT_SDB_DEF (name);
1364             PUT_SDB_INT_VAL (DBX_REGISTER_NUMBER (REGNO (best_rtl)));
1365             PUT_SDB_SCL (C_REGPARM);
1366             PUT_SDB_TYPE (plain_type (TREE_TYPE (parms)));
1367             PUT_SDB_ENDEF;
1368           }
1369         else if (GET_CODE (DECL_RTL (parms)) == MEM
1370                  && XEXP (DECL_RTL (parms), 0) != const0_rtx)
1371           {
1372             /* Parm was passed in registers but lives on the stack.  */
1373
1374             /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...))),
1375                in which case we want the value of that CONST_INT,
1376                or (MEM (REG ...)) or (MEM (MEM ...)),
1377                in which case we use a value of zero.  */
1378             if (GET_CODE (XEXP (DECL_RTL (parms), 0)) == REG
1379                 || GET_CODE (XEXP (DECL_RTL (parms), 0)) == MEM)
1380               current_sym_value = 0;
1381             else
1382               current_sym_value = INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1));
1383
1384             /* Again, this assumes the offset is based on the arg pointer.  */
1385             PUT_SDB_DEF (name);
1386             PUT_SDB_INT_VAL (DEBUGGER_ARG_OFFSET (current_sym_value,
1387                                                   XEXP (DECL_RTL (parms), 0)));
1388             PUT_SDB_SCL (C_ARG);
1389             PUT_SDB_TYPE (plain_type (TREE_TYPE (parms)));
1390             PUT_SDB_ENDEF;
1391           }
1392       }
1393 }
1394
1395 /* Output definitions for the places where parms live during the function,
1396    when different from where they were passed, when the parms were passed
1397    in memory.
1398
1399    It is not useful to do this for parms passed in registers
1400    that live during the function in different registers, because it is
1401    impossible to look in the passed register for the passed value,
1402    so we use the within-the-function register to begin with.
1403
1404    PARMS is a chain of PARM_DECL nodes.  */
1405
1406 static void
1407 sdbout_reg_parms (parms)
1408      tree parms;
1409 {
1410   for (; parms; parms = TREE_CHAIN (parms))
1411     if (DECL_NAME (parms))
1412       {
1413         const char *name = IDENTIFIER_POINTER (DECL_NAME (parms));
1414
1415         /* Report parms that live in registers during the function
1416            but were passed in memory.  */
1417         if (GET_CODE (DECL_RTL (parms)) == REG
1418             && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER
1419             && PARM_PASSED_IN_MEMORY (parms))
1420           {
1421             if (name == 0 || *name == 0)
1422               name = gen_fake_label ();
1423             PUT_SDB_DEF (name);
1424             PUT_SDB_INT_VAL (DBX_REGISTER_NUMBER (REGNO (DECL_RTL (parms))));
1425             PUT_SDB_SCL (C_REG);
1426             PUT_SDB_TYPE (plain_type (TREE_TYPE (parms)));
1427             PUT_SDB_ENDEF;
1428           }
1429         /* Report parms that live in memory but not where they were passed.  */
1430         else if (GET_CODE (DECL_RTL (parms)) == MEM
1431                  && GET_CODE (XEXP (DECL_RTL (parms), 0)) == PLUS
1432                  && GET_CODE (XEXP (XEXP (DECL_RTL (parms), 0), 1)) == CONST_INT
1433                  && PARM_PASSED_IN_MEMORY (parms)
1434                  && ! rtx_equal_p (DECL_RTL (parms), DECL_INCOMING_RTL (parms)))
1435           {
1436 #if 0 /* ??? It is not clear yet what should replace this.  */
1437             int offset = DECL_OFFSET (parms) / BITS_PER_UNIT;
1438             /* A parm declared char is really passed as an int,
1439                so it occupies the least significant bytes.
1440                On a big-endian machine those are not the low-numbered ones.  */
1441             if (BYTES_BIG_ENDIAN
1442                 && offset != -1
1443                 && TREE_TYPE (parms) != DECL_ARG_TYPE (parms))
1444               offset += (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms)))
1445                          - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms))));
1446             if (INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1)) != offset) {...}
1447 #endif
1448               {
1449                 if (name == 0 || *name == 0)
1450                   name = gen_fake_label ();
1451                 PUT_SDB_DEF (name);
1452                 PUT_SDB_INT_VAL (DEBUGGER_AUTO_OFFSET
1453                                  (XEXP (DECL_RTL (parms), 0)));
1454                 PUT_SDB_SCL (C_AUTO);
1455                 PUT_SDB_TYPE (plain_type (TREE_TYPE (parms)));
1456                 PUT_SDB_ENDEF;
1457               }
1458           }
1459       }
1460 }
1461 \f
1462 /* Describe the beginning of an internal block within a function.
1463    Also output descriptions of variables defined in this block.
1464
1465    N is the number of the block, by order of beginning, counting from 1,
1466    and not counting the outermost (function top-level) block.
1467    The blocks match the BLOCKs in DECL_INITIAL (current_function_decl),
1468    if the count starts at 0 for the outermost one.  */
1469
1470 void
1471 sdbout_begin_block (file, line, n)
1472      FILE *file ATTRIBUTE_UNUSED;
1473      int line;
1474      int n;
1475 {
1476   tree decl = current_function_decl;
1477   MAKE_LINE_SAFE (line);
1478
1479   /* The SCO compiler does not emit a separate block for the function level
1480      scope, so we avoid it here also.  However, mips ECOFF compilers do emit
1481      a separate block, so we retain it when MIPS_DEBUGGING_INFO is defined.  */
1482 #ifndef MIPS_DEBUGGING_INFO
1483   if (n != 1)
1484 #endif
1485     PUT_SDB_BLOCK_START (line - sdb_begin_function_line);
1486
1487   if (n == 1)
1488     {
1489       /* Include the outermost BLOCK's variables in block 1.  */
1490       do_block = BLOCK_NUMBER (DECL_INITIAL (decl));
1491       sdbout_block (DECL_INITIAL (decl));
1492     }
1493   /* If -g1, suppress all the internal symbols of functions
1494      except for arguments.  */
1495   if (debug_info_level != DINFO_LEVEL_TERSE)
1496     {
1497       do_block = n;
1498       sdbout_block (DECL_INITIAL (decl));
1499     }
1500
1501 #ifdef SDB_ALLOW_FORWARD_REFERENCES
1502   sdbout_dequeue_anonymous_types ();
1503 #endif
1504 }
1505
1506 /* Describe the end line-number of an internal block within a function.  */
1507
1508 void
1509 sdbout_end_block (file, line, n)
1510      FILE *file ATTRIBUTE_UNUSED;
1511      int line;
1512      int n ATTRIBUTE_UNUSED;
1513 {
1514   MAKE_LINE_SAFE (line);
1515
1516   /* The SCO compiler does not emit a separate block for the function level
1517      scope, so we avoid it here also.  However, mips ECOFF compilers do emit
1518      a separate block, so we retain it when MIPS_DEBUGGING_INFO is defined.  */
1519 #ifndef MIPS_DEBUGGING_INFO
1520   if (n != 1)
1521 #endif
1522   PUT_SDB_BLOCK_END (line - sdb_begin_function_line);
1523 }
1524
1525 /* Output sdb info for the current function name.
1526    Called from assemble_start_function.  */
1527
1528 void
1529 sdbout_mark_begin_function ()
1530 {
1531   sdbout_symbol (current_function_decl, 0);
1532 }
1533
1534 /* Called at beginning of function body (after prologue).
1535    Record the function's starting line number, so we can output
1536    relative line numbers for the other lines.
1537    Describe beginning of outermost block.
1538    Also describe the parameter list.  */
1539
1540 void
1541 sdbout_begin_function (line)
1542      int line;
1543 {
1544   sdb_begin_function_line = line - 1;
1545   PUT_SDB_FUNCTION_START (line);
1546   sdbout_parms (DECL_ARGUMENTS (current_function_decl));
1547   sdbout_reg_parms (DECL_ARGUMENTS (current_function_decl));
1548 }
1549
1550 /* Called at end of function (before epilogue).
1551    Describe end of outermost block.  */
1552
1553 void
1554 sdbout_end_function (line)
1555      int line;
1556 {
1557 #ifdef SDB_ALLOW_FORWARD_REFERENCES
1558   sdbout_dequeue_anonymous_types ();
1559 #endif
1560
1561   MAKE_LINE_SAFE (line);
1562   PUT_SDB_FUNCTION_END (line - sdb_begin_function_line);
1563
1564   /* Indicate we are between functions, for line-number output.  */
1565   sdb_begin_function_line = -1;
1566 }
1567
1568 /* Output sdb info for the absolute end of a function.
1569    Called after the epilogue is output.  */
1570
1571 void
1572 sdbout_end_epilogue ()
1573 {
1574   PUT_SDB_EPILOGUE_END
1575     (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl)));
1576 }
1577
1578 /* Output sdb info for the given label.  Called only if LABEL_NAME (insn)
1579    is present.  */
1580
1581 void
1582 sdbout_label (insn)
1583      register rtx insn;
1584 {
1585   PUT_SDB_DEF (LABEL_NAME (insn));
1586   PUT_SDB_VAL (insn);
1587   PUT_SDB_SCL (C_LABEL);
1588   PUT_SDB_TYPE (T_NULL);
1589   PUT_SDB_ENDEF;
1590 }
1591
1592 /* Change to reading from a new source file.  */
1593
1594 void
1595 sdbout_start_new_source_file (filename)
1596      const char *filename ATTRIBUTE_UNUSED;
1597 {
1598 #ifdef MIPS_DEBUGGING_INFO
1599   struct sdb_file *n = (struct sdb_file *) xmalloc (sizeof *n);
1600
1601   n->next = current_file;
1602   n->name = filename;
1603   current_file = n;
1604   PUT_SDB_SRC_FILE (filename);
1605 #endif
1606 }
1607
1608 /* Revert to reading a previous source file.  */
1609
1610 void
1611 sdbout_resume_previous_source_file ()
1612 {
1613 #ifdef MIPS_DEBUGGING_INFO
1614   struct sdb_file *next;
1615
1616   next = current_file->next;
1617   free (current_file);
1618   current_file = next;
1619   PUT_SDB_SRC_FILE (current_file->name);
1620 #endif
1621 }
1622
1623 /* Set up for SDB output at the start of compilation.  */
1624
1625 void
1626 sdbout_init (asm_file, input_file_name, syms)
1627      FILE *asm_file ATTRIBUTE_UNUSED;
1628      const char *input_file_name ATTRIBUTE_UNUSED;
1629      tree syms ATTRIBUTE_UNUSED;
1630 {
1631 #ifdef MIPS_DEBUGGING_INFO
1632   current_file = (struct sdb_file *) xmalloc (sizeof *current_file);
1633   current_file->next = NULL;
1634   current_file->name = input_file_name;
1635 #endif
1636
1637 #ifdef RMS_QUICK_HACK_1
1638   tree t;
1639   for (t = syms; t; t = TREE_CHAIN (t))
1640     if (DECL_NAME (t) && IDENTIFIER_POINTER (DECL_NAME (t)) != 0
1641         && !strcmp (IDENTIFIER_POINTER (DECL_NAME (t)), "__vtbl_ptr_type"))
1642       sdbout_symbol (t, 0);
1643 #endif  
1644
1645 #ifdef SDB_ALLOW_FORWARD_REFERENCES
1646   ggc_add_tree_root (&anonymous_types, 1);
1647 #endif
1648 }
1649
1650 #endif /* SDB_DEBUGGING_INFO */