xref: /dflybsd-src/contrib/binutils-2.34/binutils/debug.c (revision b52ef7118d1621abed722c5bbbd542210290ecef)
1*fae548d3Szrj /* debug.c -- Handle generic debugging information.
2*fae548d3Szrj    Copyright (C) 1995-2020 Free Software Foundation, Inc.
3*fae548d3Szrj    Written by Ian Lance Taylor <ian@cygnus.com>.
4*fae548d3Szrj 
5*fae548d3Szrj    This file is part of GNU Binutils.
6*fae548d3Szrj 
7*fae548d3Szrj    This program is free software; you can redistribute it and/or modify
8*fae548d3Szrj    it under the terms of the GNU General Public License as published by
9*fae548d3Szrj    the Free Software Foundation; either version 3 of the License, or
10*fae548d3Szrj    (at your option) any later version.
11*fae548d3Szrj 
12*fae548d3Szrj    This program is distributed in the hope that it will be useful,
13*fae548d3Szrj    but WITHOUT ANY WARRANTY; without even the implied warranty of
14*fae548d3Szrj    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*fae548d3Szrj    GNU General Public License for more details.
16*fae548d3Szrj 
17*fae548d3Szrj    You should have received a copy of the GNU General Public License
18*fae548d3Szrj    along with this program; if not, write to the Free Software
19*fae548d3Szrj    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20*fae548d3Szrj    02110-1301, USA.  */
21*fae548d3Szrj 
22*fae548d3Szrj 
23*fae548d3Szrj /* This file implements a generic debugging format.  We may eventually
24*fae548d3Szrj    have readers which convert different formats into this generic
25*fae548d3Szrj    format, and writers which write it out.  The initial impetus for
26*fae548d3Szrj    this was writing a converter from stabs to HP IEEE-695 debugging
27*fae548d3Szrj    format.  */
28*fae548d3Szrj 
29*fae548d3Szrj #include "sysdep.h"
30*fae548d3Szrj #include <assert.h>
31*fae548d3Szrj #include "bfd.h"
32*fae548d3Szrj #include "libiberty.h"
33*fae548d3Szrj #include "filenames.h"
34*fae548d3Szrj #include "debug.h"
35*fae548d3Szrj 
36*fae548d3Szrj /* Global information we keep for debugging.  A pointer to this
37*fae548d3Szrj    structure is the debugging handle passed to all the routines.  */
38*fae548d3Szrj 
39*fae548d3Szrj struct debug_handle
40*fae548d3Szrj {
41*fae548d3Szrj   /* A linked list of compilation units.  */
42*fae548d3Szrj   struct debug_unit *units;
43*fae548d3Szrj   /* The current compilation unit.  */
44*fae548d3Szrj   struct debug_unit *current_unit;
45*fae548d3Szrj   /* The current source file.  */
46*fae548d3Szrj   struct debug_file *current_file;
47*fae548d3Szrj   /* The current function.  */
48*fae548d3Szrj   struct debug_function *current_function;
49*fae548d3Szrj   /* The current block.  */
50*fae548d3Szrj   struct debug_block *current_block;
51*fae548d3Szrj   /* The current line number information for the current unit.  */
52*fae548d3Szrj   struct debug_lineno *current_lineno;
53*fae548d3Szrj   /* Mark.  This is used by debug_write.  */
54*fae548d3Szrj   unsigned int mark;
55*fae548d3Szrj   /* A struct/class ID used by debug_write.  */
56*fae548d3Szrj   unsigned int class_id;
57*fae548d3Szrj   /* The base for class_id for this call to debug_write.  */
58*fae548d3Szrj   unsigned int base_id;
59*fae548d3Szrj   /* The current line number in debug_write.  */
60*fae548d3Szrj   struct debug_lineno *current_write_lineno;
61*fae548d3Szrj   unsigned int current_write_lineno_index;
62*fae548d3Szrj   /* A list of classes which have assigned ID's during debug_write.
63*fae548d3Szrj      This is linked through the next_id field of debug_class_type.  */
64*fae548d3Szrj   struct debug_class_id *id_list;
65*fae548d3Szrj   /* A list used to avoid recursion during debug_type_samep.  */
66*fae548d3Szrj   struct debug_type_compare_list *compare_list;
67*fae548d3Szrj };
68*fae548d3Szrj 
69*fae548d3Szrj /* Information we keep for a single compilation unit.  */
70*fae548d3Szrj 
71*fae548d3Szrj struct debug_unit
72*fae548d3Szrj {
73*fae548d3Szrj   /* The next compilation unit.  */
74*fae548d3Szrj   struct debug_unit *next;
75*fae548d3Szrj   /* A list of files included in this compilation unit.  The first
76*fae548d3Szrj      file is always the main one, and that is where the main file name
77*fae548d3Szrj      is stored.  */
78*fae548d3Szrj   struct debug_file *files;
79*fae548d3Szrj   /* Line number information for this compilation unit.  This is not
80*fae548d3Szrj      stored by function, because assembler code may have line number
81*fae548d3Szrj      information without function information.  */
82*fae548d3Szrj   struct debug_lineno *linenos;
83*fae548d3Szrj };
84*fae548d3Szrj 
85*fae548d3Szrj /* Information kept for a single source file.  */
86*fae548d3Szrj 
87*fae548d3Szrj struct debug_file
88*fae548d3Szrj {
89*fae548d3Szrj   /* The next source file in this compilation unit.  */
90*fae548d3Szrj   struct debug_file *next;
91*fae548d3Szrj   /* The name of the source file.  */
92*fae548d3Szrj   const char *filename;
93*fae548d3Szrj   /* Global functions, variables, types, etc.  */
94*fae548d3Szrj   struct debug_namespace *globals;
95*fae548d3Szrj };
96*fae548d3Szrj 
97*fae548d3Szrj /* A type.  */
98*fae548d3Szrj 
99*fae548d3Szrj struct debug_type_s
100*fae548d3Szrj {
101*fae548d3Szrj   /* Kind of type.  */
102*fae548d3Szrj   enum debug_type_kind kind;
103*fae548d3Szrj   /* Size of type (0 if not known).  */
104*fae548d3Szrj   unsigned int size;
105*fae548d3Szrj   /* Type which is a pointer to this type.  */
106*fae548d3Szrj   debug_type pointer;
107*fae548d3Szrj   /* Tagged union with additional information about the type.  */
108*fae548d3Szrj   union
109*fae548d3Szrj     {
110*fae548d3Szrj       /* DEBUG_KIND_INDIRECT.  */
111*fae548d3Szrj       struct debug_indirect_type *kindirect;
112*fae548d3Szrj       /* DEBUG_KIND_INT.  */
113*fae548d3Szrj       /* Whether the integer is unsigned.  */
114*fae548d3Szrj       bfd_boolean kint;
115*fae548d3Szrj       /* DEBUG_KIND_STRUCT, DEBUG_KIND_UNION, DEBUG_KIND_CLASS,
116*fae548d3Szrj          DEBUG_KIND_UNION_CLASS.  */
117*fae548d3Szrj       struct debug_class_type *kclass;
118*fae548d3Szrj       /* DEBUG_KIND_ENUM.  */
119*fae548d3Szrj       struct debug_enum_type *kenum;
120*fae548d3Szrj       /* DEBUG_KIND_POINTER.  */
121*fae548d3Szrj       struct debug_type_s *kpointer;
122*fae548d3Szrj       /* DEBUG_KIND_FUNCTION.  */
123*fae548d3Szrj       struct debug_function_type *kfunction;
124*fae548d3Szrj       /* DEBUG_KIND_REFERENCE.  */
125*fae548d3Szrj       struct debug_type_s *kreference;
126*fae548d3Szrj       /* DEBUG_KIND_RANGE.  */
127*fae548d3Szrj       struct debug_range_type *krange;
128*fae548d3Szrj       /* DEBUG_KIND_ARRAY.  */
129*fae548d3Szrj       struct debug_array_type *karray;
130*fae548d3Szrj       /* DEBUG_KIND_SET.  */
131*fae548d3Szrj       struct debug_set_type *kset;
132*fae548d3Szrj       /* DEBUG_KIND_OFFSET.  */
133*fae548d3Szrj       struct debug_offset_type *koffset;
134*fae548d3Szrj       /* DEBUG_KIND_METHOD.  */
135*fae548d3Szrj       struct debug_method_type *kmethod;
136*fae548d3Szrj       /* DEBUG_KIND_CONST.  */
137*fae548d3Szrj       struct debug_type_s *kconst;
138*fae548d3Szrj       /* DEBUG_KIND_VOLATILE.  */
139*fae548d3Szrj       struct debug_type_s *kvolatile;
140*fae548d3Szrj       /* DEBUG_KIND_NAMED, DEBUG_KIND_TAGGED.  */
141*fae548d3Szrj       struct debug_named_type *knamed;
142*fae548d3Szrj     } u;
143*fae548d3Szrj };
144*fae548d3Szrj 
145*fae548d3Szrj /* Information kept for an indirect type.  */
146*fae548d3Szrj 
147*fae548d3Szrj struct debug_indirect_type
148*fae548d3Szrj {
149*fae548d3Szrj   /* Slot where the final type will appear.  */
150*fae548d3Szrj   debug_type *slot;
151*fae548d3Szrj   /* Tag.  */
152*fae548d3Szrj   const char *tag;
153*fae548d3Szrj };
154*fae548d3Szrj 
155*fae548d3Szrj /* Information kept for a struct, union, or class.  */
156*fae548d3Szrj 
157*fae548d3Szrj struct debug_class_type
158*fae548d3Szrj {
159*fae548d3Szrj   /* NULL terminated array of fields.  */
160*fae548d3Szrj   debug_field *fields;
161*fae548d3Szrj   /* A mark field which indicates whether the struct has already been
162*fae548d3Szrj      printed.  */
163*fae548d3Szrj   unsigned int mark;
164*fae548d3Szrj   /* This is used to uniquely identify unnamed structs when printing.  */
165*fae548d3Szrj   unsigned int id;
166*fae548d3Szrj   /* The remaining fields are only used for DEBUG_KIND_CLASS and
167*fae548d3Szrj      DEBUG_KIND_UNION_CLASS.  */
168*fae548d3Szrj   /* NULL terminated array of base classes.  */
169*fae548d3Szrj   debug_baseclass *baseclasses;
170*fae548d3Szrj   /* NULL terminated array of methods.  */
171*fae548d3Szrj   debug_method *methods;
172*fae548d3Szrj   /* The type of the class providing the virtual function table for
173*fae548d3Szrj      this class.  This may point to the type itself.  */
174*fae548d3Szrj   debug_type vptrbase;
175*fae548d3Szrj };
176*fae548d3Szrj 
177*fae548d3Szrj /* Information kept for an enum.  */
178*fae548d3Szrj 
179*fae548d3Szrj struct debug_enum_type
180*fae548d3Szrj {
181*fae548d3Szrj   /* NULL terminated array of names.  */
182*fae548d3Szrj   const char **names;
183*fae548d3Szrj   /* Array of corresponding values.  */
184*fae548d3Szrj   bfd_signed_vma *values;
185*fae548d3Szrj };
186*fae548d3Szrj 
187*fae548d3Szrj /* Information kept for a function.  FIXME: We should be able to
188*fae548d3Szrj    record the parameter types.  */
189*fae548d3Szrj 
190*fae548d3Szrj struct debug_function_type
191*fae548d3Szrj {
192*fae548d3Szrj   /* Return type.  */
193*fae548d3Szrj   debug_type return_type;
194*fae548d3Szrj   /* NULL terminated array of argument types.  */
195*fae548d3Szrj   debug_type *arg_types;
196*fae548d3Szrj   /* Whether the function takes a variable number of arguments.  */
197*fae548d3Szrj   bfd_boolean varargs;
198*fae548d3Szrj };
199*fae548d3Szrj 
200*fae548d3Szrj /* Information kept for a range.  */
201*fae548d3Szrj 
202*fae548d3Szrj struct debug_range_type
203*fae548d3Szrj {
204*fae548d3Szrj   /* Range base type.  */
205*fae548d3Szrj   debug_type type;
206*fae548d3Szrj   /* Lower bound.  */
207*fae548d3Szrj   bfd_signed_vma lower;
208*fae548d3Szrj   /* Upper bound.  */
209*fae548d3Szrj   bfd_signed_vma upper;
210*fae548d3Szrj };
211*fae548d3Szrj 
212*fae548d3Szrj /* Information kept for an array.  */
213*fae548d3Szrj 
214*fae548d3Szrj struct debug_array_type
215*fae548d3Szrj {
216*fae548d3Szrj   /* Element type.  */
217*fae548d3Szrj   debug_type element_type;
218*fae548d3Szrj   /* Range type.  */
219*fae548d3Szrj   debug_type range_type;
220*fae548d3Szrj   /* Lower bound.  */
221*fae548d3Szrj   bfd_signed_vma lower;
222*fae548d3Szrj   /* Upper bound.  */
223*fae548d3Szrj   bfd_signed_vma upper;
224*fae548d3Szrj   /* Whether this array is really a string.  */
225*fae548d3Szrj   bfd_boolean stringp;
226*fae548d3Szrj };
227*fae548d3Szrj 
228*fae548d3Szrj /* Information kept for a set.  */
229*fae548d3Szrj 
230*fae548d3Szrj struct debug_set_type
231*fae548d3Szrj {
232*fae548d3Szrj   /* Base type.  */
233*fae548d3Szrj   debug_type type;
234*fae548d3Szrj   /* Whether this set is really a bitstring.  */
235*fae548d3Szrj   bfd_boolean bitstringp;
236*fae548d3Szrj };
237*fae548d3Szrj 
238*fae548d3Szrj /* Information kept for an offset type (a based pointer).  */
239*fae548d3Szrj 
240*fae548d3Szrj struct debug_offset_type
241*fae548d3Szrj {
242*fae548d3Szrj   /* The type the pointer is an offset from.  */
243*fae548d3Szrj   debug_type base_type;
244*fae548d3Szrj   /* The type the pointer points to.  */
245*fae548d3Szrj   debug_type target_type;
246*fae548d3Szrj };
247*fae548d3Szrj 
248*fae548d3Szrj /* Information kept for a method type.  */
249*fae548d3Szrj 
250*fae548d3Szrj struct debug_method_type
251*fae548d3Szrj {
252*fae548d3Szrj   /* The return type.  */
253*fae548d3Szrj   debug_type return_type;
254*fae548d3Szrj   /* The object type which this method is for.  */
255*fae548d3Szrj   debug_type domain_type;
256*fae548d3Szrj   /* A NULL terminated array of argument types.  */
257*fae548d3Szrj   debug_type *arg_types;
258*fae548d3Szrj   /* Whether the method takes a variable number of arguments.  */
259*fae548d3Szrj   bfd_boolean varargs;
260*fae548d3Szrj };
261*fae548d3Szrj 
262*fae548d3Szrj /* Information kept for a named type.  */
263*fae548d3Szrj 
264*fae548d3Szrj struct debug_named_type
265*fae548d3Szrj {
266*fae548d3Szrj   /* Name.  */
267*fae548d3Szrj   struct debug_name *name;
268*fae548d3Szrj   /* Real type.  */
269*fae548d3Szrj   debug_type type;
270*fae548d3Szrj };
271*fae548d3Szrj 
272*fae548d3Szrj /* A field in a struct or union.  */
273*fae548d3Szrj 
274*fae548d3Szrj struct debug_field_s
275*fae548d3Szrj {
276*fae548d3Szrj   /* Name of the field.  */
277*fae548d3Szrj   const char *name;
278*fae548d3Szrj   /* Type of the field.  */
279*fae548d3Szrj   struct debug_type_s *type;
280*fae548d3Szrj   /* Visibility of the field.  */
281*fae548d3Szrj   enum debug_visibility visibility;
282*fae548d3Szrj   /* Whether this is a static member.  */
283*fae548d3Szrj   bfd_boolean static_member;
284*fae548d3Szrj   union
285*fae548d3Szrj     {
286*fae548d3Szrj       /* If static_member is false.  */
287*fae548d3Szrj       struct
288*fae548d3Szrj 	{
289*fae548d3Szrj 	  /* Bit position of the field in the struct.  */
290*fae548d3Szrj 	  unsigned int bitpos;
291*fae548d3Szrj 	  /* Size of the field in bits.  */
292*fae548d3Szrj 	  unsigned int bitsize;
293*fae548d3Szrj 	} f;
294*fae548d3Szrj       /* If static_member is true.  */
295*fae548d3Szrj       struct
296*fae548d3Szrj 	{
297*fae548d3Szrj 	  const char *physname;
298*fae548d3Szrj 	} s;
299*fae548d3Szrj     } u;
300*fae548d3Szrj };
301*fae548d3Szrj 
302*fae548d3Szrj /* A base class for an object.  */
303*fae548d3Szrj 
304*fae548d3Szrj struct debug_baseclass_s
305*fae548d3Szrj {
306*fae548d3Szrj   /* Type of the base class.  */
307*fae548d3Szrj   struct debug_type_s *type;
308*fae548d3Szrj   /* Bit position of the base class in the object.  */
309*fae548d3Szrj   unsigned int bitpos;
310*fae548d3Szrj   /* Whether the base class is virtual.  */
311*fae548d3Szrj   bfd_boolean is_virtual;
312*fae548d3Szrj   /* Visibility of the base class.  */
313*fae548d3Szrj   enum debug_visibility visibility;
314*fae548d3Szrj };
315*fae548d3Szrj 
316*fae548d3Szrj /* A method of an object.  */
317*fae548d3Szrj 
318*fae548d3Szrj struct debug_method_s
319*fae548d3Szrj {
320*fae548d3Szrj   /* The name of the method.  */
321*fae548d3Szrj   const char *name;
322*fae548d3Szrj   /* A NULL terminated array of different types of variants.  */
323*fae548d3Szrj   struct debug_method_variant_s **variants;
324*fae548d3Szrj };
325*fae548d3Szrj 
326*fae548d3Szrj /* The variants of a method function of an object.  These indicate
327*fae548d3Szrj    which method to run.  */
328*fae548d3Szrj 
329*fae548d3Szrj struct debug_method_variant_s
330*fae548d3Szrj {
331*fae548d3Szrj   /* The physical name of the function.  */
332*fae548d3Szrj   const char *physname;
333*fae548d3Szrj   /* The type of the function.  */
334*fae548d3Szrj   struct debug_type_s *type;
335*fae548d3Szrj   /* The visibility of the function.  */
336*fae548d3Szrj   enum debug_visibility visibility;
337*fae548d3Szrj   /* Whether the function is const.  */
338*fae548d3Szrj   bfd_boolean constp;
339*fae548d3Szrj   /* Whether the function is volatile.  */
340*fae548d3Szrj   bfd_boolean volatilep;
341*fae548d3Szrj   /* The offset to the function in the virtual function table.  */
342*fae548d3Szrj   bfd_vma voffset;
343*fae548d3Szrj   /* If voffset is VOFFSET_STATIC_METHOD, this is a static method.  */
344*fae548d3Szrj #define VOFFSET_STATIC_METHOD ((bfd_vma) -1)
345*fae548d3Szrj   /* Context of a virtual method function.  */
346*fae548d3Szrj   struct debug_type_s *context;
347*fae548d3Szrj };
348*fae548d3Szrj 
349*fae548d3Szrj /* A variable.  This is the information we keep for a variable object.
350*fae548d3Szrj    This has no name; a name is associated with a variable in a
351*fae548d3Szrj    debug_name structure.  */
352*fae548d3Szrj 
353*fae548d3Szrj struct debug_variable
354*fae548d3Szrj {
355*fae548d3Szrj   /* Kind of variable.  */
356*fae548d3Szrj   enum debug_var_kind kind;
357*fae548d3Szrj   /* Type.  */
358*fae548d3Szrj   debug_type type;
359*fae548d3Szrj   /* Value.  The interpretation of the value depends upon kind.  */
360*fae548d3Szrj   bfd_vma val;
361*fae548d3Szrj };
362*fae548d3Szrj 
363*fae548d3Szrj /* A function.  This has no name; a name is associated with a function
364*fae548d3Szrj    in a debug_name structure.  */
365*fae548d3Szrj 
366*fae548d3Szrj struct debug_function
367*fae548d3Szrj {
368*fae548d3Szrj   /* Return type.  */
369*fae548d3Szrj   debug_type return_type;
370*fae548d3Szrj   /* Parameter information.  */
371*fae548d3Szrj   struct debug_parameter *parameters;
372*fae548d3Szrj   /* Block information.  The first structure on the list is the main
373*fae548d3Szrj      block of the function, and describes function local variables.  */
374*fae548d3Szrj   struct debug_block *blocks;
375*fae548d3Szrj };
376*fae548d3Szrj 
377*fae548d3Szrj /* A function parameter.  */
378*fae548d3Szrj 
379*fae548d3Szrj struct debug_parameter
380*fae548d3Szrj {
381*fae548d3Szrj   /* Next parameter.  */
382*fae548d3Szrj   struct debug_parameter *next;
383*fae548d3Szrj   /* Name.  */
384*fae548d3Szrj   const char *name;
385*fae548d3Szrj   /* Type.  */
386*fae548d3Szrj   debug_type type;
387*fae548d3Szrj   /* Kind.  */
388*fae548d3Szrj   enum debug_parm_kind kind;
389*fae548d3Szrj   /* Value (meaning depends upon kind).  */
390*fae548d3Szrj   bfd_vma val;
391*fae548d3Szrj };
392*fae548d3Szrj 
393*fae548d3Szrj /* A typed constant.  */
394*fae548d3Szrj 
395*fae548d3Szrj struct debug_typed_constant
396*fae548d3Szrj {
397*fae548d3Szrj   /* Type.  */
398*fae548d3Szrj   debug_type type;
399*fae548d3Szrj   /* Value.  FIXME: We may eventually need to support non-integral
400*fae548d3Szrj      values.  */
401*fae548d3Szrj   bfd_vma val;
402*fae548d3Szrj };
403*fae548d3Szrj 
404*fae548d3Szrj /* Information about a block within a function.  */
405*fae548d3Szrj 
406*fae548d3Szrj struct debug_block
407*fae548d3Szrj {
408*fae548d3Szrj   /* Next block with the same parent.  */
409*fae548d3Szrj   struct debug_block *next;
410*fae548d3Szrj   /* Parent block.  */
411*fae548d3Szrj   struct debug_block *parent;
412*fae548d3Szrj   /* List of child blocks.  */
413*fae548d3Szrj   struct debug_block *children;
414*fae548d3Szrj   /* Start address of the block.  */
415*fae548d3Szrj   bfd_vma start;
416*fae548d3Szrj   /* End address of the block.  */
417*fae548d3Szrj   bfd_vma end;
418*fae548d3Szrj   /* Local variables.  */
419*fae548d3Szrj   struct debug_namespace *locals;
420*fae548d3Szrj };
421*fae548d3Szrj 
422*fae548d3Szrj /* Line number information we keep for a compilation unit.  FIXME:
423*fae548d3Szrj    This structure is easy to create, but can be very space
424*fae548d3Szrj    inefficient.  */
425*fae548d3Szrj 
426*fae548d3Szrj struct debug_lineno
427*fae548d3Szrj {
428*fae548d3Szrj   /* More line number information for this block.  */
429*fae548d3Szrj   struct debug_lineno *next;
430*fae548d3Szrj   /* Source file.  */
431*fae548d3Szrj   struct debug_file *file;
432*fae548d3Szrj   /* Line numbers, terminated by a -1 or the end of the array.  */
433*fae548d3Szrj #define DEBUG_LINENO_COUNT 10
434*fae548d3Szrj   unsigned long linenos[DEBUG_LINENO_COUNT];
435*fae548d3Szrj   /* Addresses for the line numbers.  */
436*fae548d3Szrj   bfd_vma addrs[DEBUG_LINENO_COUNT];
437*fae548d3Szrj };
438*fae548d3Szrj 
439*fae548d3Szrj /* A namespace.  This is a mapping from names to objects.  FIXME: This
440*fae548d3Szrj    should be implemented as a hash table.  */
441*fae548d3Szrj 
442*fae548d3Szrj struct debug_namespace
443*fae548d3Szrj {
444*fae548d3Szrj   /* List of items in this namespace.  */
445*fae548d3Szrj   struct debug_name *list;
446*fae548d3Szrj   /* Pointer to where the next item in this namespace should go.  */
447*fae548d3Szrj   struct debug_name **tail;
448*fae548d3Szrj };
449*fae548d3Szrj 
450*fae548d3Szrj /* Kinds of objects that appear in a namespace.  */
451*fae548d3Szrj 
452*fae548d3Szrj enum debug_object_kind
453*fae548d3Szrj {
454*fae548d3Szrj   /* A type.  */
455*fae548d3Szrj   DEBUG_OBJECT_TYPE,
456*fae548d3Szrj   /* A tagged type (really a different sort of namespace).  */
457*fae548d3Szrj   DEBUG_OBJECT_TAG,
458*fae548d3Szrj   /* A variable.  */
459*fae548d3Szrj   DEBUG_OBJECT_VARIABLE,
460*fae548d3Szrj   /* A function.  */
461*fae548d3Szrj   DEBUG_OBJECT_FUNCTION,
462*fae548d3Szrj   /* An integer constant.  */
463*fae548d3Szrj   DEBUG_OBJECT_INT_CONSTANT,
464*fae548d3Szrj   /* A floating point constant.  */
465*fae548d3Szrj   DEBUG_OBJECT_FLOAT_CONSTANT,
466*fae548d3Szrj   /* A typed constant.  */
467*fae548d3Szrj   DEBUG_OBJECT_TYPED_CONSTANT
468*fae548d3Szrj };
469*fae548d3Szrj 
470*fae548d3Szrj /* Linkage of an object that appears in a namespace.  */
471*fae548d3Szrj 
472*fae548d3Szrj enum debug_object_linkage
473*fae548d3Szrj {
474*fae548d3Szrj   /* Local variable.  */
475*fae548d3Szrj   DEBUG_LINKAGE_AUTOMATIC,
476*fae548d3Szrj   /* Static--either file static or function static, depending upon the
477*fae548d3Szrj      namespace is.  */
478*fae548d3Szrj   DEBUG_LINKAGE_STATIC,
479*fae548d3Szrj   /* Global.  */
480*fae548d3Szrj   DEBUG_LINKAGE_GLOBAL,
481*fae548d3Szrj   /* No linkage.  */
482*fae548d3Szrj   DEBUG_LINKAGE_NONE
483*fae548d3Szrj };
484*fae548d3Szrj 
485*fae548d3Szrj /* A name in a namespace.  */
486*fae548d3Szrj 
487*fae548d3Szrj struct debug_name
488*fae548d3Szrj {
489*fae548d3Szrj   /* Next name in this namespace.  */
490*fae548d3Szrj   struct debug_name *next;
491*fae548d3Szrj   /* Name.  */
492*fae548d3Szrj   const char *name;
493*fae548d3Szrj   /* Mark.  This is used by debug_write.  */
494*fae548d3Szrj   unsigned int mark;
495*fae548d3Szrj   /* Kind of object.  */
496*fae548d3Szrj   enum debug_object_kind kind;
497*fae548d3Szrj   /* Linkage of object.  */
498*fae548d3Szrj   enum debug_object_linkage linkage;
499*fae548d3Szrj   /* Tagged union with additional information about the object.  */
500*fae548d3Szrj   union
501*fae548d3Szrj     {
502*fae548d3Szrj       /* DEBUG_OBJECT_TYPE.  */
503*fae548d3Szrj       struct debug_type_s *type;
504*fae548d3Szrj       /* DEBUG_OBJECT_TAG.  */
505*fae548d3Szrj       struct debug_type_s *tag;
506*fae548d3Szrj       /* DEBUG_OBJECT_VARIABLE.  */
507*fae548d3Szrj       struct debug_variable *variable;
508*fae548d3Szrj       /* DEBUG_OBJECT_FUNCTION.  */
509*fae548d3Szrj       struct debug_function *function;
510*fae548d3Szrj       /* DEBUG_OBJECT_INT_CONSTANT.  */
511*fae548d3Szrj       bfd_vma int_constant;
512*fae548d3Szrj       /* DEBUG_OBJECT_FLOAT_CONSTANT.  */
513*fae548d3Szrj       double float_constant;
514*fae548d3Szrj       /* DEBUG_OBJECT_TYPED_CONSTANT.  */
515*fae548d3Szrj       struct debug_typed_constant *typed_constant;
516*fae548d3Szrj     } u;
517*fae548d3Szrj };
518*fae548d3Szrj 
519*fae548d3Szrj /* During debug_write, a linked list of these structures is used to
520*fae548d3Szrj    keep track of ID numbers that have been assigned to classes.  */
521*fae548d3Szrj 
522*fae548d3Szrj struct debug_class_id
523*fae548d3Szrj {
524*fae548d3Szrj   /* Next ID number.  */
525*fae548d3Szrj   struct debug_class_id *next;
526*fae548d3Szrj   /* The type with the ID.  */
527*fae548d3Szrj   struct debug_type_s *type;
528*fae548d3Szrj   /* The tag; NULL if no tag.  */
529*fae548d3Szrj   const char *tag;
530*fae548d3Szrj };
531*fae548d3Szrj 
532*fae548d3Szrj /* During debug_type_samep, a linked list of these structures is kept
533*fae548d3Szrj    on the stack to avoid infinite recursion.  */
534*fae548d3Szrj 
535*fae548d3Szrj struct debug_type_compare_list
536*fae548d3Szrj {
537*fae548d3Szrj   /* Next type on list.  */
538*fae548d3Szrj   struct debug_type_compare_list *next;
539*fae548d3Szrj   /* The types we are comparing.  */
540*fae548d3Szrj   struct debug_type_s *t1;
541*fae548d3Szrj   struct debug_type_s *t2;
542*fae548d3Szrj };
543*fae548d3Szrj 
544*fae548d3Szrj /* During debug_get_real_type, a linked list of these structures is
545*fae548d3Szrj    kept on the stack to avoid infinite recursion.  */
546*fae548d3Szrj 
547*fae548d3Szrj struct debug_type_real_list
548*fae548d3Szrj {
549*fae548d3Szrj   /* Next type on list.  */
550*fae548d3Szrj   struct debug_type_real_list *next;
551*fae548d3Szrj   /* The type we are checking.  */
552*fae548d3Szrj   struct debug_type_s *t;
553*fae548d3Szrj };
554*fae548d3Szrj 
555*fae548d3Szrj /* Local functions.  */
556*fae548d3Szrj 
557*fae548d3Szrj static void debug_error (const char *);
558*fae548d3Szrj static struct debug_name *debug_add_to_namespace
559*fae548d3Szrj   (struct debug_handle *, struct debug_namespace **, const char *,
560*fae548d3Szrj    enum debug_object_kind, enum debug_object_linkage);
561*fae548d3Szrj static struct debug_name *debug_add_to_current_namespace
562*fae548d3Szrj   (struct debug_handle *, const char *, enum debug_object_kind,
563*fae548d3Szrj    enum debug_object_linkage);
564*fae548d3Szrj static struct debug_type_s *debug_make_type
565*fae548d3Szrj   (struct debug_handle *, enum debug_type_kind, unsigned int);
566*fae548d3Szrj static struct debug_type_s *debug_get_real_type
567*fae548d3Szrj   (void *, debug_type, struct debug_type_real_list *);
568*fae548d3Szrj static bfd_boolean debug_write_name
569*fae548d3Szrj   (struct debug_handle *, const struct debug_write_fns *, void *,
570*fae548d3Szrj    struct debug_name *);
571*fae548d3Szrj static bfd_boolean debug_write_type
572*fae548d3Szrj   (struct debug_handle *, const struct debug_write_fns *, void *,
573*fae548d3Szrj    struct debug_type_s *, struct debug_name *);
574*fae548d3Szrj static bfd_boolean debug_write_class_type
575*fae548d3Szrj   (struct debug_handle *, const struct debug_write_fns *, void *,
576*fae548d3Szrj    struct debug_type_s *, const char *);
577*fae548d3Szrj static bfd_boolean debug_write_function
578*fae548d3Szrj   (struct debug_handle *, const struct debug_write_fns *, void *,
579*fae548d3Szrj    const char *, enum debug_object_linkage, struct debug_function *);
580*fae548d3Szrj static bfd_boolean debug_write_block
581*fae548d3Szrj   (struct debug_handle *, const struct debug_write_fns *, void *,
582*fae548d3Szrj    struct debug_block *);
583*fae548d3Szrj static bfd_boolean debug_write_linenos
584*fae548d3Szrj   (struct debug_handle *, const struct debug_write_fns *, void *, bfd_vma);
585*fae548d3Szrj static bfd_boolean debug_set_class_id
586*fae548d3Szrj   (struct debug_handle *, const char *, struct debug_type_s *);
587*fae548d3Szrj static bfd_boolean debug_type_samep
588*fae548d3Szrj   (struct debug_handle *, struct debug_type_s *, struct debug_type_s *);
589*fae548d3Szrj static bfd_boolean debug_class_type_samep
590*fae548d3Szrj   (struct debug_handle *, struct debug_type_s *, struct debug_type_s *);
591*fae548d3Szrj 
592*fae548d3Szrj /* Issue an error message.  */
593*fae548d3Szrj 
594*fae548d3Szrj static void
debug_error(const char * message)595*fae548d3Szrj debug_error (const char *message)
596*fae548d3Szrj {
597*fae548d3Szrj   fprintf (stderr, "%s\n", message);
598*fae548d3Szrj }
599*fae548d3Szrj 
600*fae548d3Szrj /* Add an object to a namespace.  */
601*fae548d3Szrj 
602*fae548d3Szrj static struct debug_name *
debug_add_to_namespace(struct debug_handle * info ATTRIBUTE_UNUSED,struct debug_namespace ** nsp,const char * name,enum debug_object_kind kind,enum debug_object_linkage linkage)603*fae548d3Szrj debug_add_to_namespace (struct debug_handle *info ATTRIBUTE_UNUSED,
604*fae548d3Szrj 			struct debug_namespace **nsp, const char *name,
605*fae548d3Szrj 			enum debug_object_kind kind,
606*fae548d3Szrj 			enum debug_object_linkage linkage)
607*fae548d3Szrj {
608*fae548d3Szrj   struct debug_name *n;
609*fae548d3Szrj   struct debug_namespace *ns;
610*fae548d3Szrj 
611*fae548d3Szrj   n = (struct debug_name *) xmalloc (sizeof *n);
612*fae548d3Szrj   memset (n, 0, sizeof *n);
613*fae548d3Szrj 
614*fae548d3Szrj   n->name = name;
615*fae548d3Szrj   n->kind = kind;
616*fae548d3Szrj   n->linkage = linkage;
617*fae548d3Szrj 
618*fae548d3Szrj   ns = *nsp;
619*fae548d3Szrj   if (ns == NULL)
620*fae548d3Szrj     {
621*fae548d3Szrj       ns = (struct debug_namespace *) xmalloc (sizeof *ns);
622*fae548d3Szrj       memset (ns, 0, sizeof *ns);
623*fae548d3Szrj 
624*fae548d3Szrj       ns->tail = &ns->list;
625*fae548d3Szrj 
626*fae548d3Szrj       *nsp = ns;
627*fae548d3Szrj     }
628*fae548d3Szrj 
629*fae548d3Szrj   *ns->tail = n;
630*fae548d3Szrj   ns->tail = &n->next;
631*fae548d3Szrj 
632*fae548d3Szrj   return n;
633*fae548d3Szrj }
634*fae548d3Szrj 
635*fae548d3Szrj /* Add an object to the current namespace.  */
636*fae548d3Szrj 
637*fae548d3Szrj static struct debug_name *
debug_add_to_current_namespace(struct debug_handle * info,const char * name,enum debug_object_kind kind,enum debug_object_linkage linkage)638*fae548d3Szrj debug_add_to_current_namespace (struct debug_handle *info, const char *name,
639*fae548d3Szrj 				enum debug_object_kind kind,
640*fae548d3Szrj 				enum debug_object_linkage linkage)
641*fae548d3Szrj {
642*fae548d3Szrj   struct debug_namespace **nsp;
643*fae548d3Szrj 
644*fae548d3Szrj   if (info->current_unit == NULL
645*fae548d3Szrj       || info->current_file == NULL)
646*fae548d3Szrj     {
647*fae548d3Szrj       debug_error (_("debug_add_to_current_namespace: no current file"));
648*fae548d3Szrj       return NULL;
649*fae548d3Szrj     }
650*fae548d3Szrj 
651*fae548d3Szrj   if (info->current_block != NULL)
652*fae548d3Szrj     nsp = &info->current_block->locals;
653*fae548d3Szrj   else
654*fae548d3Szrj     nsp = &info->current_file->globals;
655*fae548d3Szrj 
656*fae548d3Szrj   return debug_add_to_namespace (info, nsp, name, kind, linkage);
657*fae548d3Szrj }
658*fae548d3Szrj 
659*fae548d3Szrj /* Return a handle for debugging information.  */
660*fae548d3Szrj 
661*fae548d3Szrj void *
debug_init(void)662*fae548d3Szrj debug_init (void)
663*fae548d3Szrj {
664*fae548d3Szrj   struct debug_handle *ret;
665*fae548d3Szrj 
666*fae548d3Szrj   ret = (struct debug_handle *) xmalloc (sizeof *ret);
667*fae548d3Szrj   memset (ret, 0, sizeof *ret);
668*fae548d3Szrj   return (void *) ret;
669*fae548d3Szrj }
670*fae548d3Szrj 
671*fae548d3Szrj /* Set the source filename.  This implicitly starts a new compilation
672*fae548d3Szrj    unit.  */
673*fae548d3Szrj 
674*fae548d3Szrj bfd_boolean
debug_set_filename(void * handle,const char * name)675*fae548d3Szrj debug_set_filename (void *handle, const char *name)
676*fae548d3Szrj {
677*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
678*fae548d3Szrj   struct debug_file *nfile;
679*fae548d3Szrj   struct debug_unit *nunit;
680*fae548d3Szrj 
681*fae548d3Szrj   if (name == NULL)
682*fae548d3Szrj     name = "";
683*fae548d3Szrj 
684*fae548d3Szrj   nfile = (struct debug_file *) xmalloc (sizeof *nfile);
685*fae548d3Szrj   memset (nfile, 0, sizeof *nfile);
686*fae548d3Szrj 
687*fae548d3Szrj   nfile->filename = name;
688*fae548d3Szrj 
689*fae548d3Szrj   nunit = (struct debug_unit *) xmalloc (sizeof *nunit);
690*fae548d3Szrj   memset (nunit, 0, sizeof *nunit);
691*fae548d3Szrj 
692*fae548d3Szrj   nunit->files = nfile;
693*fae548d3Szrj   info->current_file = nfile;
694*fae548d3Szrj 
695*fae548d3Szrj   if (info->current_unit != NULL)
696*fae548d3Szrj     info->current_unit->next = nunit;
697*fae548d3Szrj   else
698*fae548d3Szrj     {
699*fae548d3Szrj       assert (info->units == NULL);
700*fae548d3Szrj       info->units = nunit;
701*fae548d3Szrj     }
702*fae548d3Szrj 
703*fae548d3Szrj   info->current_unit = nunit;
704*fae548d3Szrj 
705*fae548d3Szrj   info->current_function = NULL;
706*fae548d3Szrj   info->current_block = NULL;
707*fae548d3Szrj   info->current_lineno = NULL;
708*fae548d3Szrj 
709*fae548d3Szrj   return TRUE;
710*fae548d3Szrj }
711*fae548d3Szrj 
712*fae548d3Szrj /* Change source files to the given file name.  This is used for
713*fae548d3Szrj    include files in a single compilation unit.  */
714*fae548d3Szrj 
715*fae548d3Szrj bfd_boolean
debug_start_source(void * handle,const char * name)716*fae548d3Szrj debug_start_source (void *handle, const char *name)
717*fae548d3Szrj {
718*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
719*fae548d3Szrj   struct debug_file *f, **pf;
720*fae548d3Szrj 
721*fae548d3Szrj   if (name == NULL)
722*fae548d3Szrj     name = "";
723*fae548d3Szrj 
724*fae548d3Szrj   if (info->current_unit == NULL)
725*fae548d3Szrj     {
726*fae548d3Szrj       debug_error (_("debug_start_source: no debug_set_filename call"));
727*fae548d3Szrj       return FALSE;
728*fae548d3Szrj     }
729*fae548d3Szrj 
730*fae548d3Szrj   for (f = info->current_unit->files; f != NULL; f = f->next)
731*fae548d3Szrj     {
732*fae548d3Szrj       if (filename_cmp (f->filename, name) == 0)
733*fae548d3Szrj 	{
734*fae548d3Szrj 	  info->current_file = f;
735*fae548d3Szrj 	  return TRUE;
736*fae548d3Szrj 	}
737*fae548d3Szrj     }
738*fae548d3Szrj 
739*fae548d3Szrj   f = (struct debug_file *) xmalloc (sizeof *f);
740*fae548d3Szrj   memset (f, 0, sizeof *f);
741*fae548d3Szrj 
742*fae548d3Szrj   f->filename = name;
743*fae548d3Szrj 
744*fae548d3Szrj   for (pf = &info->current_file->next;
745*fae548d3Szrj        *pf != NULL;
746*fae548d3Szrj        pf = &(*pf)->next)
747*fae548d3Szrj     ;
748*fae548d3Szrj   *pf = f;
749*fae548d3Szrj 
750*fae548d3Szrj   info->current_file = f;
751*fae548d3Szrj 
752*fae548d3Szrj   return TRUE;
753*fae548d3Szrj }
754*fae548d3Szrj 
755*fae548d3Szrj /* Record a function definition.  This implicitly starts a function
756*fae548d3Szrj    block.  The debug_type argument is the type of the return value.
757*fae548d3Szrj    The boolean indicates whether the function is globally visible.
758*fae548d3Szrj    The bfd_vma is the address of the start of the function.  Currently
759*fae548d3Szrj    the parameter types are specified by calls to
760*fae548d3Szrj    debug_record_parameter.  FIXME: There is no way to specify nested
761*fae548d3Szrj    functions.  */
762*fae548d3Szrj 
763*fae548d3Szrj bfd_boolean
debug_record_function(void * handle,const char * name,debug_type return_type,bfd_boolean global,bfd_vma addr)764*fae548d3Szrj debug_record_function (void *handle, const char *name,
765*fae548d3Szrj 		       debug_type return_type, bfd_boolean global,
766*fae548d3Szrj 		       bfd_vma addr)
767*fae548d3Szrj {
768*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
769*fae548d3Szrj   struct debug_function *f;
770*fae548d3Szrj   struct debug_block *b;
771*fae548d3Szrj   struct debug_name *n;
772*fae548d3Szrj 
773*fae548d3Szrj   if (name == NULL)
774*fae548d3Szrj     name = "";
775*fae548d3Szrj   if (return_type == NULL)
776*fae548d3Szrj     return FALSE;
777*fae548d3Szrj 
778*fae548d3Szrj   if (info->current_unit == NULL)
779*fae548d3Szrj     {
780*fae548d3Szrj       debug_error (_("debug_record_function: no debug_set_filename call"));
781*fae548d3Szrj       return FALSE;
782*fae548d3Szrj     }
783*fae548d3Szrj 
784*fae548d3Szrj   f = (struct debug_function *) xmalloc (sizeof *f);
785*fae548d3Szrj   memset (f, 0, sizeof *f);
786*fae548d3Szrj 
787*fae548d3Szrj   f->return_type = return_type;
788*fae548d3Szrj 
789*fae548d3Szrj   b = (struct debug_block *) xmalloc (sizeof *b);
790*fae548d3Szrj   memset (b, 0, sizeof *b);
791*fae548d3Szrj 
792*fae548d3Szrj   b->start = addr;
793*fae548d3Szrj   b->end = (bfd_vma) -1;
794*fae548d3Szrj 
795*fae548d3Szrj   f->blocks = b;
796*fae548d3Szrj 
797*fae548d3Szrj   info->current_function = f;
798*fae548d3Szrj   info->current_block = b;
799*fae548d3Szrj 
800*fae548d3Szrj   /* FIXME: If we could handle nested functions, this would be the
801*fae548d3Szrj      place: we would want to use a different namespace.  */
802*fae548d3Szrj   n = debug_add_to_namespace (info,
803*fae548d3Szrj 			      &info->current_file->globals,
804*fae548d3Szrj 			      name,
805*fae548d3Szrj 			      DEBUG_OBJECT_FUNCTION,
806*fae548d3Szrj 			      (global
807*fae548d3Szrj 			       ? DEBUG_LINKAGE_GLOBAL
808*fae548d3Szrj 			       : DEBUG_LINKAGE_STATIC));
809*fae548d3Szrj   if (n == NULL)
810*fae548d3Szrj     return FALSE;
811*fae548d3Szrj 
812*fae548d3Szrj   n->u.function = f;
813*fae548d3Szrj 
814*fae548d3Szrj   return TRUE;
815*fae548d3Szrj }
816*fae548d3Szrj 
817*fae548d3Szrj /* Record a parameter for the current function.  */
818*fae548d3Szrj 
819*fae548d3Szrj bfd_boolean
debug_record_parameter(void * handle,const char * name,debug_type type,enum debug_parm_kind kind,bfd_vma val)820*fae548d3Szrj debug_record_parameter (void *handle, const char *name, debug_type type,
821*fae548d3Szrj 			enum debug_parm_kind kind, bfd_vma val)
822*fae548d3Szrj {
823*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
824*fae548d3Szrj   struct debug_parameter *p, **pp;
825*fae548d3Szrj 
826*fae548d3Szrj   if (name == NULL || type == NULL)
827*fae548d3Szrj     return FALSE;
828*fae548d3Szrj 
829*fae548d3Szrj   if (info->current_unit == NULL
830*fae548d3Szrj       || info->current_function == NULL)
831*fae548d3Szrj     {
832*fae548d3Szrj       debug_error (_("debug_record_parameter: no current function"));
833*fae548d3Szrj       return FALSE;
834*fae548d3Szrj     }
835*fae548d3Szrj 
836*fae548d3Szrj   p = (struct debug_parameter *) xmalloc (sizeof *p);
837*fae548d3Szrj   memset (p, 0, sizeof *p);
838*fae548d3Szrj 
839*fae548d3Szrj   p->name = name;
840*fae548d3Szrj   p->type = type;
841*fae548d3Szrj   p->kind = kind;
842*fae548d3Szrj   p->val = val;
843*fae548d3Szrj 
844*fae548d3Szrj   for (pp = &info->current_function->parameters;
845*fae548d3Szrj        *pp != NULL;
846*fae548d3Szrj        pp = &(*pp)->next)
847*fae548d3Szrj     ;
848*fae548d3Szrj   *pp = p;
849*fae548d3Szrj 
850*fae548d3Szrj   return TRUE;
851*fae548d3Szrj }
852*fae548d3Szrj 
853*fae548d3Szrj /* End a function.  FIXME: This should handle function nesting.  */
854*fae548d3Szrj 
855*fae548d3Szrj bfd_boolean
debug_end_function(void * handle,bfd_vma addr)856*fae548d3Szrj debug_end_function (void *handle, bfd_vma addr)
857*fae548d3Szrj {
858*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
859*fae548d3Szrj 
860*fae548d3Szrj   if (info->current_unit == NULL
861*fae548d3Szrj       || info->current_block == NULL
862*fae548d3Szrj       || info->current_function == NULL)
863*fae548d3Szrj     {
864*fae548d3Szrj       debug_error (_("debug_end_function: no current function"));
865*fae548d3Szrj       return FALSE;
866*fae548d3Szrj     }
867*fae548d3Szrj 
868*fae548d3Szrj   if (info->current_block->parent != NULL)
869*fae548d3Szrj     {
870*fae548d3Szrj       debug_error (_("debug_end_function: some blocks were not closed"));
871*fae548d3Szrj       return FALSE;
872*fae548d3Szrj     }
873*fae548d3Szrj 
874*fae548d3Szrj   info->current_block->end = addr;
875*fae548d3Szrj 
876*fae548d3Szrj   info->current_function = NULL;
877*fae548d3Szrj   info->current_block = NULL;
878*fae548d3Szrj 
879*fae548d3Szrj   return TRUE;
880*fae548d3Szrj }
881*fae548d3Szrj 
882*fae548d3Szrj /* Start a block in a function.  All local information will be
883*fae548d3Szrj    recorded in this block, until the matching call to debug_end_block.
884*fae548d3Szrj    debug_start_block and debug_end_block may be nested.  The bfd_vma
885*fae548d3Szrj    argument is the address at which this block starts.  */
886*fae548d3Szrj 
887*fae548d3Szrj bfd_boolean
debug_start_block(void * handle,bfd_vma addr)888*fae548d3Szrj debug_start_block (void *handle, bfd_vma addr)
889*fae548d3Szrj {
890*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
891*fae548d3Szrj   struct debug_block *b, **pb;
892*fae548d3Szrj 
893*fae548d3Szrj   /* We must always have a current block: debug_record_function sets
894*fae548d3Szrj      one up.  */
895*fae548d3Szrj   if (info->current_unit == NULL
896*fae548d3Szrj       || info->current_block == NULL)
897*fae548d3Szrj     {
898*fae548d3Szrj       debug_error (_("debug_start_block: no current block"));
899*fae548d3Szrj       return FALSE;
900*fae548d3Szrj     }
901*fae548d3Szrj 
902*fae548d3Szrj   b = (struct debug_block *) xmalloc (sizeof *b);
903*fae548d3Szrj   memset (b, 0, sizeof *b);
904*fae548d3Szrj 
905*fae548d3Szrj   b->parent = info->current_block;
906*fae548d3Szrj   b->start = addr;
907*fae548d3Szrj   b->end = (bfd_vma) -1;
908*fae548d3Szrj 
909*fae548d3Szrj   /* This new block is a child of the current block.  */
910*fae548d3Szrj   for (pb = &info->current_block->children;
911*fae548d3Szrj        *pb != NULL;
912*fae548d3Szrj        pb = &(*pb)->next)
913*fae548d3Szrj     ;
914*fae548d3Szrj   *pb = b;
915*fae548d3Szrj 
916*fae548d3Szrj   info->current_block = b;
917*fae548d3Szrj 
918*fae548d3Szrj   return TRUE;
919*fae548d3Szrj }
920*fae548d3Szrj 
921*fae548d3Szrj /* Finish a block in a function.  This matches the call to
922*fae548d3Szrj    debug_start_block.  The argument is the address at which this block
923*fae548d3Szrj    ends.  */
924*fae548d3Szrj 
925*fae548d3Szrj bfd_boolean
debug_end_block(void * handle,bfd_vma addr)926*fae548d3Szrj debug_end_block (void *handle, bfd_vma addr)
927*fae548d3Szrj {
928*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
929*fae548d3Szrj   struct debug_block *parent;
930*fae548d3Szrj 
931*fae548d3Szrj   if (info->current_unit == NULL
932*fae548d3Szrj       || info->current_block == NULL)
933*fae548d3Szrj     {
934*fae548d3Szrj       debug_error (_("debug_end_block: no current block"));
935*fae548d3Szrj       return FALSE;
936*fae548d3Szrj     }
937*fae548d3Szrj 
938*fae548d3Szrj   parent = info->current_block->parent;
939*fae548d3Szrj   if (parent == NULL)
940*fae548d3Szrj     {
941*fae548d3Szrj       debug_error (_("debug_end_block: attempt to close top level block"));
942*fae548d3Szrj       return FALSE;
943*fae548d3Szrj     }
944*fae548d3Szrj 
945*fae548d3Szrj   info->current_block->end = addr;
946*fae548d3Szrj 
947*fae548d3Szrj   info->current_block = parent;
948*fae548d3Szrj 
949*fae548d3Szrj   return TRUE;
950*fae548d3Szrj }
951*fae548d3Szrj 
952*fae548d3Szrj /* Associate a line number in the current source file and function
953*fae548d3Szrj    with a given address.  */
954*fae548d3Szrj 
955*fae548d3Szrj bfd_boolean
debug_record_line(void * handle,unsigned long lineno,bfd_vma addr)956*fae548d3Szrj debug_record_line (void *handle, unsigned long lineno, bfd_vma addr)
957*fae548d3Szrj {
958*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
959*fae548d3Szrj   struct debug_lineno *l;
960*fae548d3Szrj   unsigned int i;
961*fae548d3Szrj 
962*fae548d3Szrj   if (info->current_unit == NULL)
963*fae548d3Szrj     {
964*fae548d3Szrj       debug_error (_("debug_record_line: no current unit"));
965*fae548d3Szrj       return FALSE;
966*fae548d3Szrj     }
967*fae548d3Szrj 
968*fae548d3Szrj   l = info->current_lineno;
969*fae548d3Szrj   if (l != NULL && l->file == info->current_file)
970*fae548d3Szrj     {
971*fae548d3Szrj       for (i = 0; i < DEBUG_LINENO_COUNT; i++)
972*fae548d3Szrj 	{
973*fae548d3Szrj 	  if (l->linenos[i] == (unsigned long) -1)
974*fae548d3Szrj 	    {
975*fae548d3Szrj 	      l->linenos[i] = lineno;
976*fae548d3Szrj 	      l->addrs[i] = addr;
977*fae548d3Szrj 	      return TRUE;
978*fae548d3Szrj 	    }
979*fae548d3Szrj 	}
980*fae548d3Szrj     }
981*fae548d3Szrj 
982*fae548d3Szrj   /* If we get here, then either 1) there is no current_lineno
983*fae548d3Szrj      structure, which means this is the first line number in this
984*fae548d3Szrj      compilation unit, 2) the current_lineno structure is for a
985*fae548d3Szrj      different file, or 3) the current_lineno structure is full.
986*fae548d3Szrj      Regardless, we want to allocate a new debug_lineno structure, put
987*fae548d3Szrj      it in the right place, and make it the new current_lineno
988*fae548d3Szrj      structure.  */
989*fae548d3Szrj 
990*fae548d3Szrj   l = (struct debug_lineno *) xmalloc (sizeof *l);
991*fae548d3Szrj   memset (l, 0, sizeof *l);
992*fae548d3Szrj 
993*fae548d3Szrj   l->file = info->current_file;
994*fae548d3Szrj   l->linenos[0] = lineno;
995*fae548d3Szrj   l->addrs[0] = addr;
996*fae548d3Szrj   for (i = 1; i < DEBUG_LINENO_COUNT; i++)
997*fae548d3Szrj     l->linenos[i] = (unsigned long) -1;
998*fae548d3Szrj 
999*fae548d3Szrj   if (info->current_lineno != NULL)
1000*fae548d3Szrj     info->current_lineno->next = l;
1001*fae548d3Szrj   else
1002*fae548d3Szrj     info->current_unit->linenos = l;
1003*fae548d3Szrj 
1004*fae548d3Szrj   info->current_lineno = l;
1005*fae548d3Szrj 
1006*fae548d3Szrj   return TRUE;
1007*fae548d3Szrj }
1008*fae548d3Szrj 
1009*fae548d3Szrj /* Start a named common block.  This is a block of variables that may
1010*fae548d3Szrj    move in memory.  */
1011*fae548d3Szrj 
1012*fae548d3Szrj bfd_boolean
debug_start_common_block(void * handle ATTRIBUTE_UNUSED,const char * name ATTRIBUTE_UNUSED)1013*fae548d3Szrj debug_start_common_block (void *handle ATTRIBUTE_UNUSED,
1014*fae548d3Szrj 			  const char *name ATTRIBUTE_UNUSED)
1015*fae548d3Szrj {
1016*fae548d3Szrj   /* FIXME */
1017*fae548d3Szrj   debug_error (_("debug_start_common_block: not implemented"));
1018*fae548d3Szrj   return FALSE;
1019*fae548d3Szrj }
1020*fae548d3Szrj 
1021*fae548d3Szrj /* End a named common block.  */
1022*fae548d3Szrj 
1023*fae548d3Szrj bfd_boolean
debug_end_common_block(void * handle ATTRIBUTE_UNUSED,const char * name ATTRIBUTE_UNUSED)1024*fae548d3Szrj debug_end_common_block (void *handle ATTRIBUTE_UNUSED,
1025*fae548d3Szrj 			const char *name ATTRIBUTE_UNUSED)
1026*fae548d3Szrj {
1027*fae548d3Szrj   /* FIXME */
1028*fae548d3Szrj   debug_error (_("debug_end_common_block: not implemented"));
1029*fae548d3Szrj   return FALSE;
1030*fae548d3Szrj }
1031*fae548d3Szrj 
1032*fae548d3Szrj /* Record a named integer constant.  */
1033*fae548d3Szrj 
1034*fae548d3Szrj bfd_boolean
debug_record_int_const(void * handle,const char * name,bfd_vma val)1035*fae548d3Szrj debug_record_int_const (void *handle, const char *name, bfd_vma val)
1036*fae548d3Szrj {
1037*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1038*fae548d3Szrj   struct debug_name *n;
1039*fae548d3Szrj 
1040*fae548d3Szrj   if (name == NULL)
1041*fae548d3Szrj     return FALSE;
1042*fae548d3Szrj 
1043*fae548d3Szrj   n = debug_add_to_current_namespace (info, name, DEBUG_OBJECT_INT_CONSTANT,
1044*fae548d3Szrj 				      DEBUG_LINKAGE_NONE);
1045*fae548d3Szrj   if (n == NULL)
1046*fae548d3Szrj     return FALSE;
1047*fae548d3Szrj 
1048*fae548d3Szrj   n->u.int_constant = val;
1049*fae548d3Szrj 
1050*fae548d3Szrj   return TRUE;
1051*fae548d3Szrj }
1052*fae548d3Szrj 
1053*fae548d3Szrj /* Record a named floating point constant.  */
1054*fae548d3Szrj 
1055*fae548d3Szrj bfd_boolean
debug_record_float_const(void * handle,const char * name,double val)1056*fae548d3Szrj debug_record_float_const (void *handle, const char *name, double val)
1057*fae548d3Szrj {
1058*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1059*fae548d3Szrj   struct debug_name *n;
1060*fae548d3Szrj 
1061*fae548d3Szrj   if (name == NULL)
1062*fae548d3Szrj     return FALSE;
1063*fae548d3Szrj 
1064*fae548d3Szrj   n = debug_add_to_current_namespace (info, name, DEBUG_OBJECT_FLOAT_CONSTANT,
1065*fae548d3Szrj 				      DEBUG_LINKAGE_NONE);
1066*fae548d3Szrj   if (n == NULL)
1067*fae548d3Szrj     return FALSE;
1068*fae548d3Szrj 
1069*fae548d3Szrj   n->u.float_constant = val;
1070*fae548d3Szrj 
1071*fae548d3Szrj   return TRUE;
1072*fae548d3Szrj }
1073*fae548d3Szrj 
1074*fae548d3Szrj /* Record a typed constant with an integral value.  */
1075*fae548d3Szrj 
1076*fae548d3Szrj bfd_boolean
debug_record_typed_const(void * handle,const char * name,debug_type type,bfd_vma val)1077*fae548d3Szrj debug_record_typed_const (void *handle, const char *name, debug_type type,
1078*fae548d3Szrj 			  bfd_vma val)
1079*fae548d3Szrj {
1080*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1081*fae548d3Szrj   struct debug_name *n;
1082*fae548d3Szrj   struct debug_typed_constant *tc;
1083*fae548d3Szrj 
1084*fae548d3Szrj   if (name == NULL || type == NULL)
1085*fae548d3Szrj     return FALSE;
1086*fae548d3Szrj 
1087*fae548d3Szrj   n = debug_add_to_current_namespace (info, name, DEBUG_OBJECT_TYPED_CONSTANT,
1088*fae548d3Szrj 				      DEBUG_LINKAGE_NONE);
1089*fae548d3Szrj   if (n == NULL)
1090*fae548d3Szrj     return FALSE;
1091*fae548d3Szrj 
1092*fae548d3Szrj   tc = (struct debug_typed_constant *) xmalloc (sizeof *tc);
1093*fae548d3Szrj   memset (tc, 0, sizeof *tc);
1094*fae548d3Szrj 
1095*fae548d3Szrj   tc->type = type;
1096*fae548d3Szrj   tc->val = val;
1097*fae548d3Szrj 
1098*fae548d3Szrj   n->u.typed_constant = tc;
1099*fae548d3Szrj 
1100*fae548d3Szrj   return TRUE;
1101*fae548d3Szrj }
1102*fae548d3Szrj 
1103*fae548d3Szrj /* Record a label.  */
1104*fae548d3Szrj 
1105*fae548d3Szrj bfd_boolean
debug_record_label(void * handle ATTRIBUTE_UNUSED,const char * name ATTRIBUTE_UNUSED,debug_type type ATTRIBUTE_UNUSED,bfd_vma addr ATTRIBUTE_UNUSED)1106*fae548d3Szrj debug_record_label (void *handle ATTRIBUTE_UNUSED,
1107*fae548d3Szrj 		    const char *name ATTRIBUTE_UNUSED,
1108*fae548d3Szrj 		    debug_type type ATTRIBUTE_UNUSED,
1109*fae548d3Szrj 		    bfd_vma addr ATTRIBUTE_UNUSED)
1110*fae548d3Szrj {
1111*fae548d3Szrj   /* FIXME.  */
1112*fae548d3Szrj   debug_error (_("debug_record_label: not implemented"));
1113*fae548d3Szrj   return FALSE;
1114*fae548d3Szrj }
1115*fae548d3Szrj 
1116*fae548d3Szrj /* Record a variable.  */
1117*fae548d3Szrj 
1118*fae548d3Szrj bfd_boolean
debug_record_variable(void * handle,const char * name,debug_type type,enum debug_var_kind kind,bfd_vma val)1119*fae548d3Szrj debug_record_variable (void *handle, const char *name, debug_type type,
1120*fae548d3Szrj 		       enum debug_var_kind kind, bfd_vma val)
1121*fae548d3Szrj {
1122*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1123*fae548d3Szrj   struct debug_namespace **nsp;
1124*fae548d3Szrj   enum debug_object_linkage linkage;
1125*fae548d3Szrj   struct debug_name *n;
1126*fae548d3Szrj   struct debug_variable *v;
1127*fae548d3Szrj 
1128*fae548d3Szrj   if (name == NULL || type == NULL)
1129*fae548d3Szrj     return FALSE;
1130*fae548d3Szrj 
1131*fae548d3Szrj   if (info->current_unit == NULL
1132*fae548d3Szrj       || info->current_file == NULL)
1133*fae548d3Szrj     {
1134*fae548d3Szrj       debug_error (_("debug_record_variable: no current file"));
1135*fae548d3Szrj       return FALSE;
1136*fae548d3Szrj     }
1137*fae548d3Szrj 
1138*fae548d3Szrj   if (kind == DEBUG_GLOBAL || kind == DEBUG_STATIC)
1139*fae548d3Szrj     {
1140*fae548d3Szrj       nsp = &info->current_file->globals;
1141*fae548d3Szrj       if (kind == DEBUG_GLOBAL)
1142*fae548d3Szrj 	linkage = DEBUG_LINKAGE_GLOBAL;
1143*fae548d3Szrj       else
1144*fae548d3Szrj 	linkage = DEBUG_LINKAGE_STATIC;
1145*fae548d3Szrj     }
1146*fae548d3Szrj   else
1147*fae548d3Szrj     {
1148*fae548d3Szrj       if (info->current_block == NULL)
1149*fae548d3Szrj 	nsp = &info->current_file->globals;
1150*fae548d3Szrj       else
1151*fae548d3Szrj 	nsp = &info->current_block->locals;
1152*fae548d3Szrj       linkage = DEBUG_LINKAGE_AUTOMATIC;
1153*fae548d3Szrj     }
1154*fae548d3Szrj 
1155*fae548d3Szrj   n = debug_add_to_namespace (info, nsp, name, DEBUG_OBJECT_VARIABLE, linkage);
1156*fae548d3Szrj   if (n == NULL)
1157*fae548d3Szrj     return FALSE;
1158*fae548d3Szrj 
1159*fae548d3Szrj   v = (struct debug_variable *) xmalloc (sizeof *v);
1160*fae548d3Szrj   memset (v, 0, sizeof *v);
1161*fae548d3Szrj 
1162*fae548d3Szrj   v->kind = kind;
1163*fae548d3Szrj   v->type = type;
1164*fae548d3Szrj   v->val = val;
1165*fae548d3Szrj 
1166*fae548d3Szrj   n->u.variable = v;
1167*fae548d3Szrj 
1168*fae548d3Szrj   return TRUE;
1169*fae548d3Szrj }
1170*fae548d3Szrj 
1171*fae548d3Szrj /* Make a type with a given kind and size.  */
1172*fae548d3Szrj 
1173*fae548d3Szrj static struct debug_type_s *
debug_make_type(struct debug_handle * info ATTRIBUTE_UNUSED,enum debug_type_kind kind,unsigned int size)1174*fae548d3Szrj debug_make_type (struct debug_handle *info ATTRIBUTE_UNUSED,
1175*fae548d3Szrj 		 enum debug_type_kind kind, unsigned int size)
1176*fae548d3Szrj {
1177*fae548d3Szrj   struct debug_type_s *t;
1178*fae548d3Szrj 
1179*fae548d3Szrj   t = (struct debug_type_s *) xmalloc (sizeof *t);
1180*fae548d3Szrj   memset (t, 0, sizeof *t);
1181*fae548d3Szrj 
1182*fae548d3Szrj   t->kind = kind;
1183*fae548d3Szrj   t->size = size;
1184*fae548d3Szrj 
1185*fae548d3Szrj   return t;
1186*fae548d3Szrj }
1187*fae548d3Szrj 
1188*fae548d3Szrj /* Make an indirect type which may be used as a placeholder for a type
1189*fae548d3Szrj    which is referenced before it is defined.  */
1190*fae548d3Szrj 
1191*fae548d3Szrj debug_type
debug_make_indirect_type(void * handle,debug_type * slot,const char * tag)1192*fae548d3Szrj debug_make_indirect_type (void *handle, debug_type *slot, const char *tag)
1193*fae548d3Szrj {
1194*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1195*fae548d3Szrj   struct debug_type_s *t;
1196*fae548d3Szrj   struct debug_indirect_type *i;
1197*fae548d3Szrj 
1198*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_INDIRECT, 0);
1199*fae548d3Szrj   if (t == NULL)
1200*fae548d3Szrj     return DEBUG_TYPE_NULL;
1201*fae548d3Szrj 
1202*fae548d3Szrj   i = (struct debug_indirect_type *) xmalloc (sizeof *i);
1203*fae548d3Szrj   memset (i, 0, sizeof *i);
1204*fae548d3Szrj 
1205*fae548d3Szrj   i->slot = slot;
1206*fae548d3Szrj   i->tag = tag;
1207*fae548d3Szrj 
1208*fae548d3Szrj   t->u.kindirect = i;
1209*fae548d3Szrj 
1210*fae548d3Szrj   return t;
1211*fae548d3Szrj }
1212*fae548d3Szrj 
1213*fae548d3Szrj /* Make a void type.  There is only one of these.  */
1214*fae548d3Szrj 
1215*fae548d3Szrj debug_type
debug_make_void_type(void * handle)1216*fae548d3Szrj debug_make_void_type (void *handle)
1217*fae548d3Szrj {
1218*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1219*fae548d3Szrj 
1220*fae548d3Szrj   return debug_make_type (info, DEBUG_KIND_VOID, 0);
1221*fae548d3Szrj }
1222*fae548d3Szrj 
1223*fae548d3Szrj /* Make an integer type of a given size.  The boolean argument is true
1224*fae548d3Szrj    if the integer is unsigned.  */
1225*fae548d3Szrj 
1226*fae548d3Szrj debug_type
debug_make_int_type(void * handle,unsigned int size,bfd_boolean unsignedp)1227*fae548d3Szrj debug_make_int_type (void *handle, unsigned int size, bfd_boolean unsignedp)
1228*fae548d3Szrj {
1229*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1230*fae548d3Szrj   struct debug_type_s *t;
1231*fae548d3Szrj 
1232*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_INT, size);
1233*fae548d3Szrj   if (t == NULL)
1234*fae548d3Szrj     return DEBUG_TYPE_NULL;
1235*fae548d3Szrj 
1236*fae548d3Szrj   t->u.kint = unsignedp;
1237*fae548d3Szrj 
1238*fae548d3Szrj   return t;
1239*fae548d3Szrj }
1240*fae548d3Szrj 
1241*fae548d3Szrj /* Make a floating point type of a given size.  FIXME: On some
1242*fae548d3Szrj    platforms, like an Alpha, you probably need to be able to specify
1243*fae548d3Szrj    the format.  */
1244*fae548d3Szrj 
1245*fae548d3Szrj debug_type
debug_make_float_type(void * handle,unsigned int size)1246*fae548d3Szrj debug_make_float_type (void *handle, unsigned int size)
1247*fae548d3Szrj {
1248*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1249*fae548d3Szrj 
1250*fae548d3Szrj   return debug_make_type (info, DEBUG_KIND_FLOAT, size);
1251*fae548d3Szrj }
1252*fae548d3Szrj 
1253*fae548d3Szrj /* Make a boolean type of a given size.  */
1254*fae548d3Szrj 
1255*fae548d3Szrj debug_type
debug_make_bool_type(void * handle,unsigned int size)1256*fae548d3Szrj debug_make_bool_type (void *handle, unsigned int size)
1257*fae548d3Szrj {
1258*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1259*fae548d3Szrj 
1260*fae548d3Szrj   return debug_make_type (info, DEBUG_KIND_BOOL, size);
1261*fae548d3Szrj }
1262*fae548d3Szrj 
1263*fae548d3Szrj /* Make a complex type of a given size.  */
1264*fae548d3Szrj 
1265*fae548d3Szrj debug_type
debug_make_complex_type(void * handle,unsigned int size)1266*fae548d3Szrj debug_make_complex_type (void *handle, unsigned int size)
1267*fae548d3Szrj {
1268*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1269*fae548d3Szrj 
1270*fae548d3Szrj   return debug_make_type (info, DEBUG_KIND_COMPLEX, size);
1271*fae548d3Szrj }
1272*fae548d3Szrj 
1273*fae548d3Szrj /* Make a structure type.  The second argument is true for a struct,
1274*fae548d3Szrj    false for a union.  The third argument is the size of the struct.
1275*fae548d3Szrj    The fourth argument is a NULL terminated array of fields.  */
1276*fae548d3Szrj 
1277*fae548d3Szrj debug_type
debug_make_struct_type(void * handle,bfd_boolean structp,bfd_vma size,debug_field * fields)1278*fae548d3Szrj debug_make_struct_type (void *handle, bfd_boolean structp, bfd_vma size,
1279*fae548d3Szrj 			debug_field *fields)
1280*fae548d3Szrj {
1281*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1282*fae548d3Szrj   struct debug_type_s *t;
1283*fae548d3Szrj   struct debug_class_type *c;
1284*fae548d3Szrj 
1285*fae548d3Szrj   t = debug_make_type (info,
1286*fae548d3Szrj 		       structp ? DEBUG_KIND_STRUCT : DEBUG_KIND_UNION,
1287*fae548d3Szrj 		       size);
1288*fae548d3Szrj   if (t == NULL)
1289*fae548d3Szrj     return DEBUG_TYPE_NULL;
1290*fae548d3Szrj 
1291*fae548d3Szrj   c = (struct debug_class_type *) xmalloc (sizeof *c);
1292*fae548d3Szrj   memset (c, 0, sizeof *c);
1293*fae548d3Szrj 
1294*fae548d3Szrj   c->fields = fields;
1295*fae548d3Szrj 
1296*fae548d3Szrj   t->u.kclass = c;
1297*fae548d3Szrj 
1298*fae548d3Szrj   return t;
1299*fae548d3Szrj }
1300*fae548d3Szrj 
1301*fae548d3Szrj /* Make an object type.  The first three arguments after the handle
1302*fae548d3Szrj    are the same as for debug_make_struct_type.  The next arguments are
1303*fae548d3Szrj    a NULL terminated array of base classes, a NULL terminated array of
1304*fae548d3Szrj    methods, the type of the object holding the virtual function table
1305*fae548d3Szrj    if it is not this object, and a boolean which is true if this
1306*fae548d3Szrj    object has its own virtual function table.  */
1307*fae548d3Szrj 
1308*fae548d3Szrj debug_type
debug_make_object_type(void * handle,bfd_boolean structp,bfd_vma size,debug_field * fields,debug_baseclass * baseclasses,debug_method * methods,debug_type vptrbase,bfd_boolean ownvptr)1309*fae548d3Szrj debug_make_object_type (void *handle, bfd_boolean structp, bfd_vma size,
1310*fae548d3Szrj 			debug_field *fields, debug_baseclass *baseclasses,
1311*fae548d3Szrj 			debug_method *methods, debug_type vptrbase,
1312*fae548d3Szrj 			bfd_boolean ownvptr)
1313*fae548d3Szrj {
1314*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1315*fae548d3Szrj   struct debug_type_s *t;
1316*fae548d3Szrj   struct debug_class_type *c;
1317*fae548d3Szrj 
1318*fae548d3Szrj   t = debug_make_type (info,
1319*fae548d3Szrj 		       structp ? DEBUG_KIND_CLASS : DEBUG_KIND_UNION_CLASS,
1320*fae548d3Szrj 		       size);
1321*fae548d3Szrj   if (t == NULL)
1322*fae548d3Szrj     return DEBUG_TYPE_NULL;
1323*fae548d3Szrj 
1324*fae548d3Szrj   c = (struct debug_class_type *) xmalloc (sizeof *c);
1325*fae548d3Szrj   memset (c, 0, sizeof *c);
1326*fae548d3Szrj 
1327*fae548d3Szrj   c->fields = fields;
1328*fae548d3Szrj   c->baseclasses = baseclasses;
1329*fae548d3Szrj   c->methods = methods;
1330*fae548d3Szrj   if (ownvptr)
1331*fae548d3Szrj     c->vptrbase = t;
1332*fae548d3Szrj   else
1333*fae548d3Szrj     c->vptrbase = vptrbase;
1334*fae548d3Szrj 
1335*fae548d3Szrj   t->u.kclass = c;
1336*fae548d3Szrj 
1337*fae548d3Szrj   return t;
1338*fae548d3Szrj }
1339*fae548d3Szrj 
1340*fae548d3Szrj /* Make an enumeration type.  The arguments are a null terminated
1341*fae548d3Szrj    array of strings, and an array of corresponding values.  */
1342*fae548d3Szrj 
1343*fae548d3Szrj debug_type
debug_make_enum_type(void * handle,const char ** names,bfd_signed_vma * values)1344*fae548d3Szrj debug_make_enum_type (void *handle, const char **names,
1345*fae548d3Szrj 		      bfd_signed_vma *values)
1346*fae548d3Szrj {
1347*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1348*fae548d3Szrj   struct debug_type_s *t;
1349*fae548d3Szrj   struct debug_enum_type *e;
1350*fae548d3Szrj 
1351*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_ENUM, 0);
1352*fae548d3Szrj   if (t == NULL)
1353*fae548d3Szrj     return DEBUG_TYPE_NULL;
1354*fae548d3Szrj 
1355*fae548d3Szrj   e = (struct debug_enum_type *) xmalloc (sizeof *e);
1356*fae548d3Szrj   memset (e, 0, sizeof *e);
1357*fae548d3Szrj 
1358*fae548d3Szrj   e->names = names;
1359*fae548d3Szrj   e->values = values;
1360*fae548d3Szrj 
1361*fae548d3Szrj   t->u.kenum = e;
1362*fae548d3Szrj 
1363*fae548d3Szrj   return t;
1364*fae548d3Szrj }
1365*fae548d3Szrj 
1366*fae548d3Szrj /* Make a pointer to a given type.  */
1367*fae548d3Szrj 
1368*fae548d3Szrj debug_type
debug_make_pointer_type(void * handle,debug_type type)1369*fae548d3Szrj debug_make_pointer_type (void *handle, debug_type type)
1370*fae548d3Szrj {
1371*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1372*fae548d3Szrj   struct debug_type_s *t;
1373*fae548d3Szrj 
1374*fae548d3Szrj   if (type == NULL)
1375*fae548d3Szrj     return DEBUG_TYPE_NULL;
1376*fae548d3Szrj 
1377*fae548d3Szrj   if (type->pointer != DEBUG_TYPE_NULL)
1378*fae548d3Szrj     return type->pointer;
1379*fae548d3Szrj 
1380*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_POINTER, 0);
1381*fae548d3Szrj   if (t == NULL)
1382*fae548d3Szrj     return DEBUG_TYPE_NULL;
1383*fae548d3Szrj 
1384*fae548d3Szrj   t->u.kpointer = type;
1385*fae548d3Szrj 
1386*fae548d3Szrj   type->pointer = t;
1387*fae548d3Szrj 
1388*fae548d3Szrj   return t;
1389*fae548d3Szrj }
1390*fae548d3Szrj 
1391*fae548d3Szrj /* Make a function returning a given type.  FIXME: We should be able
1392*fae548d3Szrj    to record the parameter types.  */
1393*fae548d3Szrj 
1394*fae548d3Szrj debug_type
debug_make_function_type(void * handle,debug_type type,debug_type * arg_types,bfd_boolean varargs)1395*fae548d3Szrj debug_make_function_type (void *handle, debug_type type,
1396*fae548d3Szrj 			  debug_type *arg_types, bfd_boolean varargs)
1397*fae548d3Szrj {
1398*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1399*fae548d3Szrj   struct debug_type_s *t;
1400*fae548d3Szrj   struct debug_function_type *f;
1401*fae548d3Szrj 
1402*fae548d3Szrj   if (type == NULL)
1403*fae548d3Szrj     return DEBUG_TYPE_NULL;
1404*fae548d3Szrj 
1405*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_FUNCTION, 0);
1406*fae548d3Szrj   if (t == NULL)
1407*fae548d3Szrj     return DEBUG_TYPE_NULL;
1408*fae548d3Szrj 
1409*fae548d3Szrj   f = (struct debug_function_type *) xmalloc (sizeof *f);
1410*fae548d3Szrj   memset (f, 0, sizeof *f);
1411*fae548d3Szrj 
1412*fae548d3Szrj   f->return_type = type;
1413*fae548d3Szrj   f->arg_types = arg_types;
1414*fae548d3Szrj   f->varargs = varargs;
1415*fae548d3Szrj 
1416*fae548d3Szrj   t->u.kfunction = f;
1417*fae548d3Szrj 
1418*fae548d3Szrj   return t;
1419*fae548d3Szrj }
1420*fae548d3Szrj 
1421*fae548d3Szrj /* Make a reference to a given type.  */
1422*fae548d3Szrj 
1423*fae548d3Szrj debug_type
debug_make_reference_type(void * handle,debug_type type)1424*fae548d3Szrj debug_make_reference_type (void *handle, debug_type type)
1425*fae548d3Szrj {
1426*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1427*fae548d3Szrj   struct debug_type_s *t;
1428*fae548d3Szrj 
1429*fae548d3Szrj   if (type == NULL)
1430*fae548d3Szrj     return DEBUG_TYPE_NULL;
1431*fae548d3Szrj 
1432*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_REFERENCE, 0);
1433*fae548d3Szrj   if (t == NULL)
1434*fae548d3Szrj     return DEBUG_TYPE_NULL;
1435*fae548d3Szrj 
1436*fae548d3Szrj   t->u.kreference = type;
1437*fae548d3Szrj 
1438*fae548d3Szrj   return t;
1439*fae548d3Szrj }
1440*fae548d3Szrj 
1441*fae548d3Szrj /* Make a range of a given type from a lower to an upper bound.  */
1442*fae548d3Szrj 
1443*fae548d3Szrj debug_type
debug_make_range_type(void * handle,debug_type type,bfd_signed_vma lower,bfd_signed_vma upper)1444*fae548d3Szrj debug_make_range_type (void *handle, debug_type type, bfd_signed_vma lower,
1445*fae548d3Szrj 		       bfd_signed_vma upper)
1446*fae548d3Szrj {
1447*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1448*fae548d3Szrj   struct debug_type_s *t;
1449*fae548d3Szrj   struct debug_range_type *r;
1450*fae548d3Szrj 
1451*fae548d3Szrj   if (type == NULL)
1452*fae548d3Szrj     return DEBUG_TYPE_NULL;
1453*fae548d3Szrj 
1454*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_RANGE, 0);
1455*fae548d3Szrj   if (t == NULL)
1456*fae548d3Szrj     return DEBUG_TYPE_NULL;
1457*fae548d3Szrj 
1458*fae548d3Szrj   r = (struct debug_range_type *) xmalloc (sizeof *r);
1459*fae548d3Szrj   memset (r, 0, sizeof *r);
1460*fae548d3Szrj 
1461*fae548d3Szrj   r->type = type;
1462*fae548d3Szrj   r->lower = lower;
1463*fae548d3Szrj   r->upper = upper;
1464*fae548d3Szrj 
1465*fae548d3Szrj   t->u.krange = r;
1466*fae548d3Szrj 
1467*fae548d3Szrj   return t;
1468*fae548d3Szrj }
1469*fae548d3Szrj 
1470*fae548d3Szrj /* Make an array type.  The second argument is the type of an element
1471*fae548d3Szrj    of the array.  The third argument is the type of a range of the
1472*fae548d3Szrj    array.  The fourth and fifth argument are the lower and upper
1473*fae548d3Szrj    bounds, respectively.  The sixth argument is true if this array is
1474*fae548d3Szrj    actually a string, as in C.  */
1475*fae548d3Szrj 
1476*fae548d3Szrj debug_type
debug_make_array_type(void * handle,debug_type element_type,debug_type range_type,bfd_signed_vma lower,bfd_signed_vma upper,bfd_boolean stringp)1477*fae548d3Szrj debug_make_array_type (void *handle, debug_type element_type,
1478*fae548d3Szrj 		       debug_type range_type, bfd_signed_vma lower,
1479*fae548d3Szrj 		       bfd_signed_vma upper, bfd_boolean stringp)
1480*fae548d3Szrj {
1481*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1482*fae548d3Szrj   struct debug_type_s *t;
1483*fae548d3Szrj   struct debug_array_type *a;
1484*fae548d3Szrj 
1485*fae548d3Szrj   if (element_type == NULL || range_type == NULL)
1486*fae548d3Szrj     return DEBUG_TYPE_NULL;
1487*fae548d3Szrj 
1488*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_ARRAY, 0);
1489*fae548d3Szrj   if (t == NULL)
1490*fae548d3Szrj     return DEBUG_TYPE_NULL;
1491*fae548d3Szrj 
1492*fae548d3Szrj   a = (struct debug_array_type *) xmalloc (sizeof *a);
1493*fae548d3Szrj   memset (a, 0, sizeof *a);
1494*fae548d3Szrj 
1495*fae548d3Szrj   a->element_type = element_type;
1496*fae548d3Szrj   a->range_type = range_type;
1497*fae548d3Szrj   a->lower = lower;
1498*fae548d3Szrj   a->upper = upper;
1499*fae548d3Szrj   a->stringp = stringp;
1500*fae548d3Szrj 
1501*fae548d3Szrj   t->u.karray = a;
1502*fae548d3Szrj 
1503*fae548d3Szrj   return t;
1504*fae548d3Szrj }
1505*fae548d3Szrj 
1506*fae548d3Szrj /* Make a set of a given type.  For example, a Pascal set type.  The
1507*fae548d3Szrj    boolean argument is true if this set is actually a bitstring, as in
1508*fae548d3Szrj    CHILL.  */
1509*fae548d3Szrj 
1510*fae548d3Szrj debug_type
debug_make_set_type(void * handle,debug_type type,bfd_boolean bitstringp)1511*fae548d3Szrj debug_make_set_type (void *handle, debug_type type, bfd_boolean bitstringp)
1512*fae548d3Szrj {
1513*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1514*fae548d3Szrj   struct debug_type_s *t;
1515*fae548d3Szrj   struct debug_set_type *s;
1516*fae548d3Szrj 
1517*fae548d3Szrj   if (type == NULL)
1518*fae548d3Szrj     return DEBUG_TYPE_NULL;
1519*fae548d3Szrj 
1520*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_SET, 0);
1521*fae548d3Szrj   if (t == NULL)
1522*fae548d3Szrj     return DEBUG_TYPE_NULL;
1523*fae548d3Szrj 
1524*fae548d3Szrj   s = (struct debug_set_type *) xmalloc (sizeof *s);
1525*fae548d3Szrj   memset (s, 0, sizeof *s);
1526*fae548d3Szrj 
1527*fae548d3Szrj   s->type = type;
1528*fae548d3Szrj   s->bitstringp = bitstringp;
1529*fae548d3Szrj 
1530*fae548d3Szrj   t->u.kset = s;
1531*fae548d3Szrj 
1532*fae548d3Szrj   return t;
1533*fae548d3Szrj }
1534*fae548d3Szrj 
1535*fae548d3Szrj /* Make a type for a pointer which is relative to an object.  The
1536*fae548d3Szrj    second argument is the type of the object to which the pointer is
1537*fae548d3Szrj    relative.  The third argument is the type that the pointer points
1538*fae548d3Szrj    to.  */
1539*fae548d3Szrj 
1540*fae548d3Szrj debug_type
debug_make_offset_type(void * handle,debug_type base_type,debug_type target_type)1541*fae548d3Szrj debug_make_offset_type (void *handle, debug_type base_type,
1542*fae548d3Szrj 			debug_type target_type)
1543*fae548d3Szrj {
1544*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1545*fae548d3Szrj   struct debug_type_s *t;
1546*fae548d3Szrj   struct debug_offset_type *o;
1547*fae548d3Szrj 
1548*fae548d3Szrj   if (base_type == NULL || target_type == NULL)
1549*fae548d3Szrj     return DEBUG_TYPE_NULL;
1550*fae548d3Szrj 
1551*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_OFFSET, 0);
1552*fae548d3Szrj   if (t == NULL)
1553*fae548d3Szrj     return DEBUG_TYPE_NULL;
1554*fae548d3Szrj 
1555*fae548d3Szrj   o = (struct debug_offset_type *) xmalloc (sizeof *o);
1556*fae548d3Szrj   memset (o, 0, sizeof *o);
1557*fae548d3Szrj 
1558*fae548d3Szrj   o->base_type = base_type;
1559*fae548d3Szrj   o->target_type = target_type;
1560*fae548d3Szrj 
1561*fae548d3Szrj   t->u.koffset = o;
1562*fae548d3Szrj 
1563*fae548d3Szrj   return t;
1564*fae548d3Szrj }
1565*fae548d3Szrj 
1566*fae548d3Szrj /* Make a type for a method function.  The second argument is the
1567*fae548d3Szrj    return type, the third argument is the domain, and the fourth
1568*fae548d3Szrj    argument is a NULL terminated array of argument types.  */
1569*fae548d3Szrj 
1570*fae548d3Szrj debug_type
debug_make_method_type(void * handle,debug_type return_type,debug_type domain_type,debug_type * arg_types,bfd_boolean varargs)1571*fae548d3Szrj debug_make_method_type (void *handle, debug_type return_type,
1572*fae548d3Szrj 			debug_type domain_type, debug_type *arg_types,
1573*fae548d3Szrj 			bfd_boolean varargs)
1574*fae548d3Szrj {
1575*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1576*fae548d3Szrj   struct debug_type_s *t;
1577*fae548d3Szrj   struct debug_method_type *m;
1578*fae548d3Szrj 
1579*fae548d3Szrj   if (return_type == NULL)
1580*fae548d3Szrj     return DEBUG_TYPE_NULL;
1581*fae548d3Szrj 
1582*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_METHOD, 0);
1583*fae548d3Szrj   if (t == NULL)
1584*fae548d3Szrj     return DEBUG_TYPE_NULL;
1585*fae548d3Szrj 
1586*fae548d3Szrj   m = (struct debug_method_type *) xmalloc (sizeof *m);
1587*fae548d3Szrj   memset (m, 0, sizeof *m);
1588*fae548d3Szrj 
1589*fae548d3Szrj   m->return_type = return_type;
1590*fae548d3Szrj   m->domain_type = domain_type;
1591*fae548d3Szrj   m->arg_types = arg_types;
1592*fae548d3Szrj   m->varargs = varargs;
1593*fae548d3Szrj 
1594*fae548d3Szrj   t->u.kmethod = m;
1595*fae548d3Szrj 
1596*fae548d3Szrj   return t;
1597*fae548d3Szrj }
1598*fae548d3Szrj 
1599*fae548d3Szrj /* Make a const qualified version of a given type.  */
1600*fae548d3Szrj 
1601*fae548d3Szrj debug_type
debug_make_const_type(void * handle,debug_type type)1602*fae548d3Szrj debug_make_const_type (void *handle, debug_type type)
1603*fae548d3Szrj {
1604*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1605*fae548d3Szrj   struct debug_type_s *t;
1606*fae548d3Szrj 
1607*fae548d3Szrj   if (type == NULL)
1608*fae548d3Szrj     return DEBUG_TYPE_NULL;
1609*fae548d3Szrj 
1610*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_CONST, 0);
1611*fae548d3Szrj   if (t == NULL)
1612*fae548d3Szrj     return DEBUG_TYPE_NULL;
1613*fae548d3Szrj 
1614*fae548d3Szrj   t->u.kconst = type;
1615*fae548d3Szrj 
1616*fae548d3Szrj   return t;
1617*fae548d3Szrj }
1618*fae548d3Szrj 
1619*fae548d3Szrj /* Make a volatile qualified version of a given type.  */
1620*fae548d3Szrj 
1621*fae548d3Szrj debug_type
debug_make_volatile_type(void * handle,debug_type type)1622*fae548d3Szrj debug_make_volatile_type (void *handle, debug_type type)
1623*fae548d3Szrj {
1624*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1625*fae548d3Szrj   struct debug_type_s *t;
1626*fae548d3Szrj 
1627*fae548d3Szrj   if (type == NULL)
1628*fae548d3Szrj     return DEBUG_TYPE_NULL;
1629*fae548d3Szrj 
1630*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_VOLATILE, 0);
1631*fae548d3Szrj   if (t == NULL)
1632*fae548d3Szrj     return DEBUG_TYPE_NULL;
1633*fae548d3Szrj 
1634*fae548d3Szrj   t->u.kvolatile = type;
1635*fae548d3Szrj 
1636*fae548d3Szrj   return t;
1637*fae548d3Szrj }
1638*fae548d3Szrj 
1639*fae548d3Szrj /* Make an undefined tagged type.  For example, a struct which has
1640*fae548d3Szrj    been mentioned, but not defined.  */
1641*fae548d3Szrj 
1642*fae548d3Szrj debug_type
debug_make_undefined_tagged_type(void * handle,const char * name,enum debug_type_kind kind)1643*fae548d3Szrj debug_make_undefined_tagged_type (void *handle, const char *name,
1644*fae548d3Szrj 				  enum debug_type_kind kind)
1645*fae548d3Szrj {
1646*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1647*fae548d3Szrj   struct debug_type_s *t;
1648*fae548d3Szrj 
1649*fae548d3Szrj   if (name == NULL)
1650*fae548d3Szrj     return DEBUG_TYPE_NULL;
1651*fae548d3Szrj 
1652*fae548d3Szrj   switch (kind)
1653*fae548d3Szrj     {
1654*fae548d3Szrj     case DEBUG_KIND_STRUCT:
1655*fae548d3Szrj     case DEBUG_KIND_UNION:
1656*fae548d3Szrj     case DEBUG_KIND_CLASS:
1657*fae548d3Szrj     case DEBUG_KIND_UNION_CLASS:
1658*fae548d3Szrj     case DEBUG_KIND_ENUM:
1659*fae548d3Szrj       break;
1660*fae548d3Szrj 
1661*fae548d3Szrj     default:
1662*fae548d3Szrj       debug_error (_("debug_make_undefined_type: unsupported kind"));
1663*fae548d3Szrj       return DEBUG_TYPE_NULL;
1664*fae548d3Szrj     }
1665*fae548d3Szrj 
1666*fae548d3Szrj   t = debug_make_type (info, kind, 0);
1667*fae548d3Szrj   if (t == NULL)
1668*fae548d3Szrj     return DEBUG_TYPE_NULL;
1669*fae548d3Szrj 
1670*fae548d3Szrj   return debug_tag_type (handle, name, t);
1671*fae548d3Szrj }
1672*fae548d3Szrj 
1673*fae548d3Szrj /* Make a base class for an object.  The second argument is the base
1674*fae548d3Szrj    class type.  The third argument is the bit position of this base
1675*fae548d3Szrj    class in the object (always 0 unless doing multiple inheritance).
1676*fae548d3Szrj    The fourth argument is whether this is a virtual class.  The fifth
1677*fae548d3Szrj    argument is the visibility of the base class.  */
1678*fae548d3Szrj 
1679*fae548d3Szrj debug_baseclass
debug_make_baseclass(void * handle ATTRIBUTE_UNUSED,debug_type type,bfd_vma bitpos,bfd_boolean is_virtual,enum debug_visibility visibility)1680*fae548d3Szrj debug_make_baseclass (void *handle ATTRIBUTE_UNUSED, debug_type type,
1681*fae548d3Szrj 		      bfd_vma bitpos, bfd_boolean is_virtual,
1682*fae548d3Szrj 		      enum debug_visibility visibility)
1683*fae548d3Szrj {
1684*fae548d3Szrj   struct debug_baseclass_s *b;
1685*fae548d3Szrj 
1686*fae548d3Szrj   b = (struct debug_baseclass_s *) xmalloc (sizeof *b);
1687*fae548d3Szrj   memset (b, 0, sizeof *b);
1688*fae548d3Szrj 
1689*fae548d3Szrj   b->type = type;
1690*fae548d3Szrj   b->bitpos = bitpos;
1691*fae548d3Szrj   b->is_virtual = is_virtual;
1692*fae548d3Szrj   b->visibility = visibility;
1693*fae548d3Szrj 
1694*fae548d3Szrj   return b;
1695*fae548d3Szrj }
1696*fae548d3Szrj 
1697*fae548d3Szrj /* Make a field for a struct.  The second argument is the name.  The
1698*fae548d3Szrj    third argument is the type of the field.  The fourth argument is
1699*fae548d3Szrj    the bit position of the field.  The fifth argument is the size of
1700*fae548d3Szrj    the field (it may be zero).  The sixth argument is the visibility
1701*fae548d3Szrj    of the field.  */
1702*fae548d3Szrj 
1703*fae548d3Szrj debug_field
debug_make_field(void * handle ATTRIBUTE_UNUSED,const char * name,debug_type type,bfd_vma bitpos,bfd_vma bitsize,enum debug_visibility visibility)1704*fae548d3Szrj debug_make_field (void *handle ATTRIBUTE_UNUSED, const char *name,
1705*fae548d3Szrj 		  debug_type type, bfd_vma bitpos, bfd_vma bitsize,
1706*fae548d3Szrj 		  enum debug_visibility visibility)
1707*fae548d3Szrj {
1708*fae548d3Szrj   struct debug_field_s *f;
1709*fae548d3Szrj 
1710*fae548d3Szrj   f = (struct debug_field_s *) xmalloc (sizeof *f);
1711*fae548d3Szrj   memset (f, 0, sizeof *f);
1712*fae548d3Szrj 
1713*fae548d3Szrj   f->name = name;
1714*fae548d3Szrj   f->type = type;
1715*fae548d3Szrj   f->static_member = FALSE;
1716*fae548d3Szrj   f->u.f.bitpos = bitpos;
1717*fae548d3Szrj   f->u.f.bitsize = bitsize;
1718*fae548d3Szrj   f->visibility = visibility;
1719*fae548d3Szrj 
1720*fae548d3Szrj   return f;
1721*fae548d3Szrj }
1722*fae548d3Szrj 
1723*fae548d3Szrj /* Make a static member of an object.  The second argument is the
1724*fae548d3Szrj    name.  The third argument is the type of the member.  The fourth
1725*fae548d3Szrj    argument is the physical name of the member (i.e., the name as a
1726*fae548d3Szrj    global variable).  The fifth argument is the visibility of the
1727*fae548d3Szrj    member.  */
1728*fae548d3Szrj 
1729*fae548d3Szrj debug_field
debug_make_static_member(void * handle ATTRIBUTE_UNUSED,const char * name,debug_type type,const char * physname,enum debug_visibility visibility)1730*fae548d3Szrj debug_make_static_member (void *handle ATTRIBUTE_UNUSED, const char *name,
1731*fae548d3Szrj 			  debug_type type, const char *physname,
1732*fae548d3Szrj 			  enum debug_visibility visibility)
1733*fae548d3Szrj {
1734*fae548d3Szrj   struct debug_field_s *f;
1735*fae548d3Szrj 
1736*fae548d3Szrj   f = (struct debug_field_s *) xmalloc (sizeof *f);
1737*fae548d3Szrj   memset (f, 0, sizeof *f);
1738*fae548d3Szrj 
1739*fae548d3Szrj   f->name = name;
1740*fae548d3Szrj   f->type = type;
1741*fae548d3Szrj   f->static_member = TRUE;
1742*fae548d3Szrj   f->u.s.physname = physname;
1743*fae548d3Szrj   f->visibility = visibility;
1744*fae548d3Szrj 
1745*fae548d3Szrj   return f;
1746*fae548d3Szrj }
1747*fae548d3Szrj 
1748*fae548d3Szrj /* Make a method.  The second argument is the name, and the third
1749*fae548d3Szrj    argument is a NULL terminated array of method variants.  */
1750*fae548d3Szrj 
1751*fae548d3Szrj debug_method
debug_make_method(void * handle ATTRIBUTE_UNUSED,const char * name,debug_method_variant * variants)1752*fae548d3Szrj debug_make_method (void *handle ATTRIBUTE_UNUSED, const char *name,
1753*fae548d3Szrj 		   debug_method_variant *variants)
1754*fae548d3Szrj {
1755*fae548d3Szrj   struct debug_method_s *m;
1756*fae548d3Szrj 
1757*fae548d3Szrj   m = (struct debug_method_s *) xmalloc (sizeof *m);
1758*fae548d3Szrj   memset (m, 0, sizeof *m);
1759*fae548d3Szrj 
1760*fae548d3Szrj   m->name = name;
1761*fae548d3Szrj   m->variants = variants;
1762*fae548d3Szrj 
1763*fae548d3Szrj   return m;
1764*fae548d3Szrj }
1765*fae548d3Szrj 
1766*fae548d3Szrj /* Make a method argument.  The second argument is the real name of
1767*fae548d3Szrj    the function.  The third argument is the type of the function.  The
1768*fae548d3Szrj    fourth argument is the visibility.  The fifth argument is whether
1769*fae548d3Szrj    this is a const function.  The sixth argument is whether this is a
1770*fae548d3Szrj    volatile function.  The seventh argument is the offset in the
1771*fae548d3Szrj    virtual function table, if any.  The eighth argument is the virtual
1772*fae548d3Szrj    function context.  FIXME: Are the const and volatile arguments
1773*fae548d3Szrj    necessary?  Could we just use debug_make_const_type?  */
1774*fae548d3Szrj 
1775*fae548d3Szrj debug_method_variant
debug_make_method_variant(void * handle ATTRIBUTE_UNUSED,const char * physname,debug_type type,enum debug_visibility visibility,bfd_boolean constp,bfd_boolean volatilep,bfd_vma voffset,debug_type context)1776*fae548d3Szrj debug_make_method_variant (void *handle ATTRIBUTE_UNUSED,
1777*fae548d3Szrj 			   const char *physname, debug_type type,
1778*fae548d3Szrj 			   enum debug_visibility visibility,
1779*fae548d3Szrj 			   bfd_boolean constp, bfd_boolean volatilep,
1780*fae548d3Szrj 			   bfd_vma voffset, debug_type context)
1781*fae548d3Szrj {
1782*fae548d3Szrj   struct debug_method_variant_s *m;
1783*fae548d3Szrj 
1784*fae548d3Szrj   m = (struct debug_method_variant_s *) xmalloc (sizeof *m);
1785*fae548d3Szrj   memset (m, 0, sizeof *m);
1786*fae548d3Szrj 
1787*fae548d3Szrj   m->physname = physname;
1788*fae548d3Szrj   m->type = type;
1789*fae548d3Szrj   m->visibility = visibility;
1790*fae548d3Szrj   m->constp = constp;
1791*fae548d3Szrj   m->volatilep = volatilep;
1792*fae548d3Szrj   m->voffset = voffset;
1793*fae548d3Szrj   m->context = context;
1794*fae548d3Szrj 
1795*fae548d3Szrj   return m;
1796*fae548d3Szrj }
1797*fae548d3Szrj 
1798*fae548d3Szrj /* Make a static method argument.  The arguments are the same as for
1799*fae548d3Szrj    debug_make_method_variant, except that the last two are omitted
1800*fae548d3Szrj    since a static method can not also be virtual.  */
1801*fae548d3Szrj 
1802*fae548d3Szrj debug_method_variant
debug_make_static_method_variant(void * handle ATTRIBUTE_UNUSED,const char * physname,debug_type type,enum debug_visibility visibility,bfd_boolean constp,bfd_boolean volatilep)1803*fae548d3Szrj debug_make_static_method_variant (void *handle ATTRIBUTE_UNUSED,
1804*fae548d3Szrj 				  const char *physname, debug_type type,
1805*fae548d3Szrj 				  enum debug_visibility visibility,
1806*fae548d3Szrj 				  bfd_boolean constp, bfd_boolean volatilep)
1807*fae548d3Szrj {
1808*fae548d3Szrj   struct debug_method_variant_s *m;
1809*fae548d3Szrj 
1810*fae548d3Szrj   m = (struct debug_method_variant_s *) xmalloc (sizeof *m);
1811*fae548d3Szrj   memset (m, 0, sizeof *m);
1812*fae548d3Szrj 
1813*fae548d3Szrj   m->physname = physname;
1814*fae548d3Szrj   m->type = type;
1815*fae548d3Szrj   m->visibility = visibility;
1816*fae548d3Szrj   m->constp = constp;
1817*fae548d3Szrj   m->volatilep = volatilep;
1818*fae548d3Szrj   m->voffset = VOFFSET_STATIC_METHOD;
1819*fae548d3Szrj 
1820*fae548d3Szrj   return m;
1821*fae548d3Szrj }
1822*fae548d3Szrj 
1823*fae548d3Szrj /* Name a type.  */
1824*fae548d3Szrj 
1825*fae548d3Szrj debug_type
debug_name_type(void * handle,const char * name,debug_type type)1826*fae548d3Szrj debug_name_type (void *handle, const char *name, debug_type type)
1827*fae548d3Szrj {
1828*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1829*fae548d3Szrj   struct debug_type_s *t;
1830*fae548d3Szrj   struct debug_named_type *n;
1831*fae548d3Szrj   struct debug_name *nm;
1832*fae548d3Szrj 
1833*fae548d3Szrj   if (name == NULL || type == NULL)
1834*fae548d3Szrj     return DEBUG_TYPE_NULL;
1835*fae548d3Szrj 
1836*fae548d3Szrj   if (info->current_unit == NULL
1837*fae548d3Szrj       || info->current_file == NULL)
1838*fae548d3Szrj     {
1839*fae548d3Szrj       debug_error (_("debug_name_type: no current file"));
1840*fae548d3Szrj       return DEBUG_TYPE_NULL;
1841*fae548d3Szrj     }
1842*fae548d3Szrj 
1843*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_NAMED, 0);
1844*fae548d3Szrj   if (t == NULL)
1845*fae548d3Szrj     return DEBUG_TYPE_NULL;
1846*fae548d3Szrj 
1847*fae548d3Szrj   n = (struct debug_named_type *) xmalloc (sizeof *n);
1848*fae548d3Szrj   memset (n, 0, sizeof *n);
1849*fae548d3Szrj 
1850*fae548d3Szrj   n->type = type;
1851*fae548d3Szrj 
1852*fae548d3Szrj   t->u.knamed = n;
1853*fae548d3Szrj 
1854*fae548d3Szrj   /* We always add the name to the global namespace.  This is probably
1855*fae548d3Szrj      wrong in some cases, but it seems to be right for stabs.  FIXME.  */
1856*fae548d3Szrj 
1857*fae548d3Szrj   nm = debug_add_to_namespace (info, &info->current_file->globals, name,
1858*fae548d3Szrj 			       DEBUG_OBJECT_TYPE, DEBUG_LINKAGE_NONE);
1859*fae548d3Szrj   if (nm == NULL)
1860*fae548d3Szrj     return DEBUG_TYPE_NULL;
1861*fae548d3Szrj 
1862*fae548d3Szrj   nm->u.type = t;
1863*fae548d3Szrj 
1864*fae548d3Szrj   n->name = nm;
1865*fae548d3Szrj 
1866*fae548d3Szrj   return t;
1867*fae548d3Szrj }
1868*fae548d3Szrj 
1869*fae548d3Szrj /* Tag a type.  */
1870*fae548d3Szrj 
1871*fae548d3Szrj debug_type
debug_tag_type(void * handle,const char * name,debug_type type)1872*fae548d3Szrj debug_tag_type (void *handle, const char *name, debug_type type)
1873*fae548d3Szrj {
1874*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1875*fae548d3Szrj   struct debug_type_s *t;
1876*fae548d3Szrj   struct debug_named_type *n;
1877*fae548d3Szrj   struct debug_name *nm;
1878*fae548d3Szrj 
1879*fae548d3Szrj   if (name == NULL || type == NULL)
1880*fae548d3Szrj     return DEBUG_TYPE_NULL;
1881*fae548d3Szrj 
1882*fae548d3Szrj   if (info->current_file == NULL)
1883*fae548d3Szrj     {
1884*fae548d3Szrj       debug_error (_("debug_tag_type: no current file"));
1885*fae548d3Szrj       return DEBUG_TYPE_NULL;
1886*fae548d3Szrj     }
1887*fae548d3Szrj 
1888*fae548d3Szrj   if (type->kind == DEBUG_KIND_TAGGED)
1889*fae548d3Szrj     {
1890*fae548d3Szrj       if (strcmp (type->u.knamed->name->name, name) == 0)
1891*fae548d3Szrj 	return type;
1892*fae548d3Szrj       debug_error (_("debug_tag_type: extra tag attempted"));
1893*fae548d3Szrj       return DEBUG_TYPE_NULL;
1894*fae548d3Szrj     }
1895*fae548d3Szrj 
1896*fae548d3Szrj   t = debug_make_type (info, DEBUG_KIND_TAGGED, 0);
1897*fae548d3Szrj   if (t == NULL)
1898*fae548d3Szrj     return DEBUG_TYPE_NULL;
1899*fae548d3Szrj 
1900*fae548d3Szrj   n = (struct debug_named_type *) xmalloc (sizeof *n);
1901*fae548d3Szrj   memset (n, 0, sizeof *n);
1902*fae548d3Szrj 
1903*fae548d3Szrj   n->type = type;
1904*fae548d3Szrj 
1905*fae548d3Szrj   t->u.knamed = n;
1906*fae548d3Szrj 
1907*fae548d3Szrj   /* We keep a global namespace of tags for each compilation unit.  I
1908*fae548d3Szrj      don't know if that is the right thing to do.  */
1909*fae548d3Szrj 
1910*fae548d3Szrj   nm = debug_add_to_namespace (info, &info->current_file->globals, name,
1911*fae548d3Szrj 			       DEBUG_OBJECT_TAG, DEBUG_LINKAGE_NONE);
1912*fae548d3Szrj   if (nm == NULL)
1913*fae548d3Szrj     return DEBUG_TYPE_NULL;
1914*fae548d3Szrj 
1915*fae548d3Szrj   nm->u.tag = t;
1916*fae548d3Szrj 
1917*fae548d3Szrj   n->name = nm;
1918*fae548d3Szrj 
1919*fae548d3Szrj   return t;
1920*fae548d3Szrj }
1921*fae548d3Szrj 
1922*fae548d3Szrj /* Record the size of a given type.  */
1923*fae548d3Szrj 
1924*fae548d3Szrj bfd_boolean
debug_record_type_size(void * handle ATTRIBUTE_UNUSED,debug_type type,unsigned int size)1925*fae548d3Szrj debug_record_type_size (void *handle ATTRIBUTE_UNUSED, debug_type type,
1926*fae548d3Szrj 			unsigned int size)
1927*fae548d3Szrj {
1928*fae548d3Szrj   if (type->size != 0 && type->size != size)
1929*fae548d3Szrj     fprintf (stderr, _("Warning: changing type size from %d to %d\n"),
1930*fae548d3Szrj 	     type->size, size);
1931*fae548d3Szrj 
1932*fae548d3Szrj   type->size = size;
1933*fae548d3Szrj 
1934*fae548d3Szrj   return TRUE;
1935*fae548d3Szrj }
1936*fae548d3Szrj 
1937*fae548d3Szrj /* Find a named type.  */
1938*fae548d3Szrj 
1939*fae548d3Szrj debug_type
debug_find_named_type(void * handle,const char * name)1940*fae548d3Szrj debug_find_named_type (void *handle, const char *name)
1941*fae548d3Szrj {
1942*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1943*fae548d3Szrj   struct debug_block *b;
1944*fae548d3Szrj   struct debug_file *f;
1945*fae548d3Szrj 
1946*fae548d3Szrj   /* We only search the current compilation unit.  I don't know if
1947*fae548d3Szrj      this is right or not.  */
1948*fae548d3Szrj 
1949*fae548d3Szrj   if (info->current_unit == NULL)
1950*fae548d3Szrj     {
1951*fae548d3Szrj       debug_error (_("debug_find_named_type: no current compilation unit"));
1952*fae548d3Szrj       return DEBUG_TYPE_NULL;
1953*fae548d3Szrj     }
1954*fae548d3Szrj 
1955*fae548d3Szrj   for (b = info->current_block; b != NULL; b = b->parent)
1956*fae548d3Szrj     {
1957*fae548d3Szrj       if (b->locals != NULL)
1958*fae548d3Szrj 	{
1959*fae548d3Szrj 	  struct debug_name *n;
1960*fae548d3Szrj 
1961*fae548d3Szrj 	  for (n = b->locals->list; n != NULL; n = n->next)
1962*fae548d3Szrj 	    {
1963*fae548d3Szrj 	      if (n->kind == DEBUG_OBJECT_TYPE
1964*fae548d3Szrj 		  && n->name[0] == name[0]
1965*fae548d3Szrj 		  && strcmp (n->name, name) == 0)
1966*fae548d3Szrj 		return n->u.type;
1967*fae548d3Szrj 	    }
1968*fae548d3Szrj 	}
1969*fae548d3Szrj     }
1970*fae548d3Szrj 
1971*fae548d3Szrj   for (f = info->current_unit->files; f != NULL; f = f->next)
1972*fae548d3Szrj     {
1973*fae548d3Szrj       if (f->globals != NULL)
1974*fae548d3Szrj 	{
1975*fae548d3Szrj 	  struct debug_name *n;
1976*fae548d3Szrj 
1977*fae548d3Szrj 	  for (n = f->globals->list; n != NULL; n = n->next)
1978*fae548d3Szrj 	    {
1979*fae548d3Szrj 	      if (n->kind == DEBUG_OBJECT_TYPE
1980*fae548d3Szrj 		  && n->name[0] == name[0]
1981*fae548d3Szrj 		  && strcmp (n->name, name) == 0)
1982*fae548d3Szrj 		return n->u.type;
1983*fae548d3Szrj 	    }
1984*fae548d3Szrj 	}
1985*fae548d3Szrj     }
1986*fae548d3Szrj 
1987*fae548d3Szrj   return DEBUG_TYPE_NULL;
1988*fae548d3Szrj }
1989*fae548d3Szrj 
1990*fae548d3Szrj /* Find a tagged type.  */
1991*fae548d3Szrj 
1992*fae548d3Szrj debug_type
debug_find_tagged_type(void * handle,const char * name,enum debug_type_kind kind)1993*fae548d3Szrj debug_find_tagged_type (void *handle, const char *name,
1994*fae548d3Szrj 			enum debug_type_kind kind)
1995*fae548d3Szrj {
1996*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
1997*fae548d3Szrj   struct debug_unit *u;
1998*fae548d3Szrj 
1999*fae548d3Szrj   /* We search the globals of all the compilation units.  I don't know
2000*fae548d3Szrj      if this is correct or not.  It would be easy to change.  */
2001*fae548d3Szrj 
2002*fae548d3Szrj   for (u = info->units; u != NULL; u = u->next)
2003*fae548d3Szrj     {
2004*fae548d3Szrj       struct debug_file *f;
2005*fae548d3Szrj 
2006*fae548d3Szrj       for (f = u->files; f != NULL; f = f->next)
2007*fae548d3Szrj 	{
2008*fae548d3Szrj 	  struct debug_name *n;
2009*fae548d3Szrj 
2010*fae548d3Szrj 	  if (f->globals != NULL)
2011*fae548d3Szrj 	    {
2012*fae548d3Szrj 	      for (n = f->globals->list; n != NULL; n = n->next)
2013*fae548d3Szrj 		{
2014*fae548d3Szrj 		  if (n->kind == DEBUG_OBJECT_TAG
2015*fae548d3Szrj 		      && (kind == DEBUG_KIND_ILLEGAL
2016*fae548d3Szrj 			  || n->u.tag->kind == kind)
2017*fae548d3Szrj 		      && n->name[0] == name[0]
2018*fae548d3Szrj 		      && strcmp (n->name, name) == 0)
2019*fae548d3Szrj 		    return n->u.tag;
2020*fae548d3Szrj 		}
2021*fae548d3Szrj 	    }
2022*fae548d3Szrj 	}
2023*fae548d3Szrj     }
2024*fae548d3Szrj 
2025*fae548d3Szrj   return DEBUG_TYPE_NULL;
2026*fae548d3Szrj }
2027*fae548d3Szrj 
2028*fae548d3Szrj /* Get a base type.  We build a linked list on the stack to avoid
2029*fae548d3Szrj    crashing if the type is defined circularly.  */
2030*fae548d3Szrj 
2031*fae548d3Szrj static struct debug_type_s *
debug_get_real_type(void * handle,debug_type type,struct debug_type_real_list * list)2032*fae548d3Szrj debug_get_real_type (void *handle, debug_type type,
2033*fae548d3Szrj 		     struct debug_type_real_list *list)
2034*fae548d3Szrj {
2035*fae548d3Szrj   struct debug_type_real_list *l;
2036*fae548d3Szrj   struct debug_type_real_list rl;
2037*fae548d3Szrj 
2038*fae548d3Szrj   switch (type->kind)
2039*fae548d3Szrj     {
2040*fae548d3Szrj     default:
2041*fae548d3Szrj       return type;
2042*fae548d3Szrj 
2043*fae548d3Szrj     case DEBUG_KIND_INDIRECT:
2044*fae548d3Szrj     case DEBUG_KIND_NAMED:
2045*fae548d3Szrj     case DEBUG_KIND_TAGGED:
2046*fae548d3Szrj       break;
2047*fae548d3Szrj     }
2048*fae548d3Szrj 
2049*fae548d3Szrj   for (l = list; l != NULL; l = l->next)
2050*fae548d3Szrj     {
2051*fae548d3Szrj       if (l->t == type || l == l->next)
2052*fae548d3Szrj 	{
2053*fae548d3Szrj 	  fprintf (stderr,
2054*fae548d3Szrj 		   _("debug_get_real_type: circular debug information for %s\n"),
2055*fae548d3Szrj 		   debug_get_type_name (handle, type));
2056*fae548d3Szrj 	  return NULL;
2057*fae548d3Szrj 	}
2058*fae548d3Szrj     }
2059*fae548d3Szrj 
2060*fae548d3Szrj   rl.next = list;
2061*fae548d3Szrj   rl.t = type;
2062*fae548d3Szrj 
2063*fae548d3Szrj   switch (type->kind)
2064*fae548d3Szrj     {
2065*fae548d3Szrj       /* The default case is just here to avoid warnings.  */
2066*fae548d3Szrj     default:
2067*fae548d3Szrj     case DEBUG_KIND_INDIRECT:
2068*fae548d3Szrj       if (*type->u.kindirect->slot != NULL)
2069*fae548d3Szrj 	return debug_get_real_type (handle, *type->u.kindirect->slot, &rl);
2070*fae548d3Szrj       return type;
2071*fae548d3Szrj     case DEBUG_KIND_NAMED:
2072*fae548d3Szrj     case DEBUG_KIND_TAGGED:
2073*fae548d3Szrj       return debug_get_real_type (handle, type->u.knamed->type, &rl);
2074*fae548d3Szrj     }
2075*fae548d3Szrj   /*NOTREACHED*/
2076*fae548d3Szrj }
2077*fae548d3Szrj 
2078*fae548d3Szrj /* Get the kind of a type.  */
2079*fae548d3Szrj 
2080*fae548d3Szrj enum debug_type_kind
debug_get_type_kind(void * handle,debug_type type)2081*fae548d3Szrj debug_get_type_kind (void *handle, debug_type type)
2082*fae548d3Szrj {
2083*fae548d3Szrj   if (type == NULL)
2084*fae548d3Szrj     return DEBUG_KIND_ILLEGAL;
2085*fae548d3Szrj   type = debug_get_real_type (handle, type, NULL);
2086*fae548d3Szrj   if (type == NULL)
2087*fae548d3Szrj     return DEBUG_KIND_ILLEGAL;
2088*fae548d3Szrj   return type->kind;
2089*fae548d3Szrj }
2090*fae548d3Szrj 
2091*fae548d3Szrj /* Get the name of a type.  */
2092*fae548d3Szrj 
2093*fae548d3Szrj const char *
debug_get_type_name(void * handle,debug_type type)2094*fae548d3Szrj debug_get_type_name (void *handle, debug_type type)
2095*fae548d3Szrj {
2096*fae548d3Szrj   if (type->kind == DEBUG_KIND_INDIRECT)
2097*fae548d3Szrj     {
2098*fae548d3Szrj       if (*type->u.kindirect->slot != NULL)
2099*fae548d3Szrj 	return debug_get_type_name (handle, *type->u.kindirect->slot);
2100*fae548d3Szrj       return type->u.kindirect->tag;
2101*fae548d3Szrj     }
2102*fae548d3Szrj   if (type->kind == DEBUG_KIND_NAMED
2103*fae548d3Szrj       || type->kind == DEBUG_KIND_TAGGED)
2104*fae548d3Szrj     return type->u.knamed->name->name;
2105*fae548d3Szrj   return NULL;
2106*fae548d3Szrj }
2107*fae548d3Szrj 
2108*fae548d3Szrj /* Get the size of a type.  */
2109*fae548d3Szrj 
2110*fae548d3Szrj bfd_vma
debug_get_type_size(void * handle,debug_type type)2111*fae548d3Szrj debug_get_type_size (void *handle, debug_type type)
2112*fae548d3Szrj {
2113*fae548d3Szrj   if (type == NULL)
2114*fae548d3Szrj     return 0;
2115*fae548d3Szrj 
2116*fae548d3Szrj   /* We don't call debug_get_real_type, because somebody might have
2117*fae548d3Szrj      called debug_record_type_size on a named or indirect type.  */
2118*fae548d3Szrj 
2119*fae548d3Szrj   if (type->size != 0)
2120*fae548d3Szrj     return type->size;
2121*fae548d3Szrj 
2122*fae548d3Szrj   switch (type->kind)
2123*fae548d3Szrj     {
2124*fae548d3Szrj     default:
2125*fae548d3Szrj       return 0;
2126*fae548d3Szrj     case DEBUG_KIND_INDIRECT:
2127*fae548d3Szrj       if (*type->u.kindirect->slot != NULL)
2128*fae548d3Szrj 	return debug_get_type_size (handle, *type->u.kindirect->slot);
2129*fae548d3Szrj       return 0;
2130*fae548d3Szrj     case DEBUG_KIND_NAMED:
2131*fae548d3Szrj     case DEBUG_KIND_TAGGED:
2132*fae548d3Szrj       return debug_get_type_size (handle, type->u.knamed->type);
2133*fae548d3Szrj     }
2134*fae548d3Szrj   /*NOTREACHED*/
2135*fae548d3Szrj }
2136*fae548d3Szrj 
2137*fae548d3Szrj /* Get the return type of a function or method type.  */
2138*fae548d3Szrj 
2139*fae548d3Szrj debug_type
debug_get_return_type(void * handle,debug_type type)2140*fae548d3Szrj debug_get_return_type (void *handle, debug_type type)
2141*fae548d3Szrj {
2142*fae548d3Szrj   if (type == NULL)
2143*fae548d3Szrj     return DEBUG_TYPE_NULL;
2144*fae548d3Szrj 
2145*fae548d3Szrj   type = debug_get_real_type (handle, type, NULL);
2146*fae548d3Szrj   if (type == NULL)
2147*fae548d3Szrj     return DEBUG_TYPE_NULL;
2148*fae548d3Szrj 
2149*fae548d3Szrj   switch (type->kind)
2150*fae548d3Szrj     {
2151*fae548d3Szrj     default:
2152*fae548d3Szrj       return DEBUG_TYPE_NULL;
2153*fae548d3Szrj     case DEBUG_KIND_FUNCTION:
2154*fae548d3Szrj       return type->u.kfunction->return_type;
2155*fae548d3Szrj     case DEBUG_KIND_METHOD:
2156*fae548d3Szrj       return type->u.kmethod->return_type;
2157*fae548d3Szrj     }
2158*fae548d3Szrj   /*NOTREACHED*/
2159*fae548d3Szrj }
2160*fae548d3Szrj 
2161*fae548d3Szrj /* Get the parameter types of a function or method type (except that
2162*fae548d3Szrj    we don't currently store the parameter types of a function).  */
2163*fae548d3Szrj 
2164*fae548d3Szrj const debug_type *
debug_get_parameter_types(void * handle,debug_type type,bfd_boolean * pvarargs)2165*fae548d3Szrj debug_get_parameter_types (void *handle, debug_type type,
2166*fae548d3Szrj 			   bfd_boolean *pvarargs)
2167*fae548d3Szrj {
2168*fae548d3Szrj   if (type == NULL)
2169*fae548d3Szrj     return NULL;
2170*fae548d3Szrj 
2171*fae548d3Szrj   type = debug_get_real_type (handle, type, NULL);
2172*fae548d3Szrj   if (type == NULL)
2173*fae548d3Szrj     return NULL;
2174*fae548d3Szrj 
2175*fae548d3Szrj   switch (type->kind)
2176*fae548d3Szrj     {
2177*fae548d3Szrj     default:
2178*fae548d3Szrj       return NULL;
2179*fae548d3Szrj     case DEBUG_KIND_FUNCTION:
2180*fae548d3Szrj       *pvarargs = type->u.kfunction->varargs;
2181*fae548d3Szrj       return type->u.kfunction->arg_types;
2182*fae548d3Szrj     case DEBUG_KIND_METHOD:
2183*fae548d3Szrj       *pvarargs = type->u.kmethod->varargs;
2184*fae548d3Szrj       return type->u.kmethod->arg_types;
2185*fae548d3Szrj     }
2186*fae548d3Szrj   /*NOTREACHED*/
2187*fae548d3Szrj }
2188*fae548d3Szrj 
2189*fae548d3Szrj /* Get the target type of a type.  */
2190*fae548d3Szrj 
2191*fae548d3Szrj debug_type
debug_get_target_type(void * handle,debug_type type)2192*fae548d3Szrj debug_get_target_type (void *handle, debug_type type)
2193*fae548d3Szrj {
2194*fae548d3Szrj   if (type == NULL)
2195*fae548d3Szrj     return NULL;
2196*fae548d3Szrj 
2197*fae548d3Szrj   type = debug_get_real_type (handle, type, NULL);
2198*fae548d3Szrj   if (type == NULL)
2199*fae548d3Szrj     return NULL;
2200*fae548d3Szrj 
2201*fae548d3Szrj   switch (type->kind)
2202*fae548d3Szrj     {
2203*fae548d3Szrj     default:
2204*fae548d3Szrj       return NULL;
2205*fae548d3Szrj     case DEBUG_KIND_POINTER:
2206*fae548d3Szrj       return type->u.kpointer;
2207*fae548d3Szrj     case DEBUG_KIND_REFERENCE:
2208*fae548d3Szrj       return type->u.kreference;
2209*fae548d3Szrj     case DEBUG_KIND_CONST:
2210*fae548d3Szrj       return type->u.kconst;
2211*fae548d3Szrj     case DEBUG_KIND_VOLATILE:
2212*fae548d3Szrj       return type->u.kvolatile;
2213*fae548d3Szrj     }
2214*fae548d3Szrj   /*NOTREACHED*/
2215*fae548d3Szrj }
2216*fae548d3Szrj 
2217*fae548d3Szrj /* Get the NULL terminated array of fields for a struct, union, or
2218*fae548d3Szrj    class.  */
2219*fae548d3Szrj 
2220*fae548d3Szrj const debug_field *
debug_get_fields(void * handle,debug_type type)2221*fae548d3Szrj debug_get_fields (void *handle, debug_type type)
2222*fae548d3Szrj {
2223*fae548d3Szrj   if (type == NULL)
2224*fae548d3Szrj     return NULL;
2225*fae548d3Szrj 
2226*fae548d3Szrj   type = debug_get_real_type (handle, type, NULL);
2227*fae548d3Szrj   if (type == NULL)
2228*fae548d3Szrj     return NULL;
2229*fae548d3Szrj 
2230*fae548d3Szrj   switch (type->kind)
2231*fae548d3Szrj     {
2232*fae548d3Szrj     default:
2233*fae548d3Szrj       return NULL;
2234*fae548d3Szrj     case DEBUG_KIND_STRUCT:
2235*fae548d3Szrj     case DEBUG_KIND_UNION:
2236*fae548d3Szrj     case DEBUG_KIND_CLASS:
2237*fae548d3Szrj     case DEBUG_KIND_UNION_CLASS:
2238*fae548d3Szrj       return type->u.kclass->fields;
2239*fae548d3Szrj     }
2240*fae548d3Szrj   /*NOTREACHED*/
2241*fae548d3Szrj }
2242*fae548d3Szrj 
2243*fae548d3Szrj /* Get the type of a field.  */
2244*fae548d3Szrj 
2245*fae548d3Szrj debug_type
debug_get_field_type(void * handle ATTRIBUTE_UNUSED,debug_field field)2246*fae548d3Szrj debug_get_field_type (void *handle ATTRIBUTE_UNUSED, debug_field field)
2247*fae548d3Szrj {
2248*fae548d3Szrj   if (field == NULL)
2249*fae548d3Szrj     return NULL;
2250*fae548d3Szrj   return field->type;
2251*fae548d3Szrj }
2252*fae548d3Szrj 
2253*fae548d3Szrj /* Get the name of a field.  */
2254*fae548d3Szrj 
2255*fae548d3Szrj const char *
debug_get_field_name(void * handle ATTRIBUTE_UNUSED,debug_field field)2256*fae548d3Szrj debug_get_field_name (void *handle ATTRIBUTE_UNUSED, debug_field field)
2257*fae548d3Szrj {
2258*fae548d3Szrj   if (field == NULL)
2259*fae548d3Szrj     return NULL;
2260*fae548d3Szrj   return field->name;
2261*fae548d3Szrj }
2262*fae548d3Szrj 
2263*fae548d3Szrj /* Get the bit position of a field.  */
2264*fae548d3Szrj 
2265*fae548d3Szrj bfd_vma
debug_get_field_bitpos(void * handle ATTRIBUTE_UNUSED,debug_field field)2266*fae548d3Szrj debug_get_field_bitpos (void *handle ATTRIBUTE_UNUSED, debug_field field)
2267*fae548d3Szrj {
2268*fae548d3Szrj   if (field == NULL || field->static_member)
2269*fae548d3Szrj     return (bfd_vma) -1;
2270*fae548d3Szrj   return field->u.f.bitpos;
2271*fae548d3Szrj }
2272*fae548d3Szrj 
2273*fae548d3Szrj /* Get the bit size of a field.  */
2274*fae548d3Szrj 
2275*fae548d3Szrj bfd_vma
debug_get_field_bitsize(void * handle ATTRIBUTE_UNUSED,debug_field field)2276*fae548d3Szrj debug_get_field_bitsize (void *handle ATTRIBUTE_UNUSED, debug_field field)
2277*fae548d3Szrj {
2278*fae548d3Szrj   if (field == NULL || field->static_member)
2279*fae548d3Szrj     return (bfd_vma) -1;
2280*fae548d3Szrj   return field->u.f.bitsize;
2281*fae548d3Szrj }
2282*fae548d3Szrj 
2283*fae548d3Szrj /* Get the visibility of a field.  */
2284*fae548d3Szrj 
2285*fae548d3Szrj enum debug_visibility
debug_get_field_visibility(void * handle ATTRIBUTE_UNUSED,debug_field field)2286*fae548d3Szrj debug_get_field_visibility (void *handle ATTRIBUTE_UNUSED, debug_field field)
2287*fae548d3Szrj {
2288*fae548d3Szrj   if (field == NULL)
2289*fae548d3Szrj     return DEBUG_VISIBILITY_IGNORE;
2290*fae548d3Szrj   return field->visibility;
2291*fae548d3Szrj }
2292*fae548d3Szrj 
2293*fae548d3Szrj /* Get the physical name of a field.  */
2294*fae548d3Szrj 
2295*fae548d3Szrj const char *
debug_get_field_physname(void * handle ATTRIBUTE_UNUSED,debug_field field)2296*fae548d3Szrj debug_get_field_physname (void *handle ATTRIBUTE_UNUSED, debug_field field)
2297*fae548d3Szrj {
2298*fae548d3Szrj   if (field == NULL || ! field->static_member)
2299*fae548d3Szrj     return NULL;
2300*fae548d3Szrj   return field->u.s.physname;
2301*fae548d3Szrj }
2302*fae548d3Szrj 
2303*fae548d3Szrj /* Write out the debugging information.  This is given a handle to
2304*fae548d3Szrj    debugging information, and a set of function pointers to call.  */
2305*fae548d3Szrj 
2306*fae548d3Szrj bfd_boolean
debug_write(void * handle,const struct debug_write_fns * fns,void * fhandle)2307*fae548d3Szrj debug_write (void *handle, const struct debug_write_fns *fns, void *fhandle)
2308*fae548d3Szrj {
2309*fae548d3Szrj   struct debug_handle *info = (struct debug_handle *) handle;
2310*fae548d3Szrj   struct debug_unit *u;
2311*fae548d3Szrj 
2312*fae548d3Szrj   /* We use a mark to tell whether we have already written out a
2313*fae548d3Szrj      particular name.  We use an integer, so that we don't have to
2314*fae548d3Szrj      clear the mark fields if we happen to write out the same
2315*fae548d3Szrj      information more than once.  */
2316*fae548d3Szrj   ++info->mark;
2317*fae548d3Szrj 
2318*fae548d3Szrj   /* The base_id field holds an ID value which will never be used, so
2319*fae548d3Szrj      that we can tell whether we have assigned an ID during this call
2320*fae548d3Szrj      to debug_write.  */
2321*fae548d3Szrj   info->base_id = info->class_id;
2322*fae548d3Szrj 
2323*fae548d3Szrj   /* We keep a linked list of classes for which was have assigned ID's
2324*fae548d3Szrj      during this call to debug_write.  */
2325*fae548d3Szrj   info->id_list = NULL;
2326*fae548d3Szrj 
2327*fae548d3Szrj   for (u = info->units; u != NULL; u = u->next)
2328*fae548d3Szrj     {
2329*fae548d3Szrj       struct debug_file *f;
2330*fae548d3Szrj       bfd_boolean first_file;
2331*fae548d3Szrj 
2332*fae548d3Szrj       info->current_write_lineno = u->linenos;
2333*fae548d3Szrj       info->current_write_lineno_index = 0;
2334*fae548d3Szrj 
2335*fae548d3Szrj       if (! (*fns->start_compilation_unit) (fhandle, u->files->filename))
2336*fae548d3Szrj 	return FALSE;
2337*fae548d3Szrj 
2338*fae548d3Szrj       first_file = TRUE;
2339*fae548d3Szrj       for (f = u->files; f != NULL; f = f->next)
2340*fae548d3Szrj 	{
2341*fae548d3Szrj 	  struct debug_name *n;
2342*fae548d3Szrj 
2343*fae548d3Szrj 	  if (first_file)
2344*fae548d3Szrj 	    first_file = FALSE;
2345*fae548d3Szrj 	  else if (! (*fns->start_source) (fhandle, f->filename))
2346*fae548d3Szrj 	    return FALSE;
2347*fae548d3Szrj 
2348*fae548d3Szrj 	  if (f->globals != NULL)
2349*fae548d3Szrj 	    for (n = f->globals->list; n != NULL; n = n->next)
2350*fae548d3Szrj 	      if (! debug_write_name (info, fns, fhandle, n))
2351*fae548d3Szrj 		return FALSE;
2352*fae548d3Szrj 	}
2353*fae548d3Szrj 
2354*fae548d3Szrj       /* Output any line number information which hasn't already been
2355*fae548d3Szrj          handled.  */
2356*fae548d3Szrj       if (! debug_write_linenos (info, fns, fhandle, (bfd_vma) -1))
2357*fae548d3Szrj 	return FALSE;
2358*fae548d3Szrj     }
2359*fae548d3Szrj 
2360*fae548d3Szrj   return TRUE;
2361*fae548d3Szrj }
2362*fae548d3Szrj 
2363*fae548d3Szrj /* Write out an element in a namespace.  */
2364*fae548d3Szrj 
2365*fae548d3Szrj static bfd_boolean
debug_write_name(struct debug_handle * info,const struct debug_write_fns * fns,void * fhandle,struct debug_name * n)2366*fae548d3Szrj debug_write_name (struct debug_handle *info,
2367*fae548d3Szrj 		  const struct debug_write_fns *fns, void *fhandle,
2368*fae548d3Szrj 		  struct debug_name *n)
2369*fae548d3Szrj {
2370*fae548d3Szrj   switch (n->kind)
2371*fae548d3Szrj     {
2372*fae548d3Szrj     case DEBUG_OBJECT_TYPE:
2373*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, n->u.type, n)
2374*fae548d3Szrj 	  || ! (*fns->typdef) (fhandle, n->name))
2375*fae548d3Szrj 	return FALSE;
2376*fae548d3Szrj       return TRUE;
2377*fae548d3Szrj     case DEBUG_OBJECT_TAG:
2378*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, n->u.tag, n))
2379*fae548d3Szrj 	return FALSE;
2380*fae548d3Szrj       return (*fns->tag) (fhandle, n->name);
2381*fae548d3Szrj     case DEBUG_OBJECT_VARIABLE:
2382*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, n->u.variable->type,
2383*fae548d3Szrj 			      (struct debug_name *) NULL))
2384*fae548d3Szrj 	return FALSE;
2385*fae548d3Szrj       return (*fns->variable) (fhandle, n->name, n->u.variable->kind,
2386*fae548d3Szrj 			       n->u.variable->val);
2387*fae548d3Szrj     case DEBUG_OBJECT_FUNCTION:
2388*fae548d3Szrj       return debug_write_function (info, fns, fhandle, n->name,
2389*fae548d3Szrj 				   n->linkage, n->u.function);
2390*fae548d3Szrj     case DEBUG_OBJECT_INT_CONSTANT:
2391*fae548d3Szrj       return (*fns->int_constant) (fhandle, n->name, n->u.int_constant);
2392*fae548d3Szrj     case DEBUG_OBJECT_FLOAT_CONSTANT:
2393*fae548d3Szrj       return (*fns->float_constant) (fhandle, n->name, n->u.float_constant);
2394*fae548d3Szrj     case DEBUG_OBJECT_TYPED_CONSTANT:
2395*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, n->u.typed_constant->type,
2396*fae548d3Szrj 			      (struct debug_name *) NULL))
2397*fae548d3Szrj 	return FALSE;
2398*fae548d3Szrj       return (*fns->typed_constant) (fhandle, n->name,
2399*fae548d3Szrj 				     n->u.typed_constant->val);
2400*fae548d3Szrj     default:
2401*fae548d3Szrj       abort ();
2402*fae548d3Szrj       return FALSE;
2403*fae548d3Szrj     }
2404*fae548d3Szrj   /*NOTREACHED*/
2405*fae548d3Szrj }
2406*fae548d3Szrj 
2407*fae548d3Szrj /* Write out a type.  If the type is DEBUG_KIND_NAMED or
2408*fae548d3Szrj    DEBUG_KIND_TAGGED, then the name argument is the name for which we
2409*fae548d3Szrj    are about to call typedef or tag.  If the type is anything else,
2410*fae548d3Szrj    then the name argument is a tag from a DEBUG_KIND_TAGGED type which
2411*fae548d3Szrj    points to this one.  */
2412*fae548d3Szrj 
2413*fae548d3Szrj static bfd_boolean
debug_write_type(struct debug_handle * info,const struct debug_write_fns * fns,void * fhandle,struct debug_type_s * type,struct debug_name * name)2414*fae548d3Szrj debug_write_type (struct debug_handle *info,
2415*fae548d3Szrj 		  const struct debug_write_fns *fns, void *fhandle,
2416*fae548d3Szrj 		  struct debug_type_s *type, struct debug_name *name)
2417*fae548d3Szrj {
2418*fae548d3Szrj   unsigned int i;
2419*fae548d3Szrj   int is;
2420*fae548d3Szrj   const char *tag = NULL;
2421*fae548d3Szrj 
2422*fae548d3Szrj   if (type == DEBUG_TYPE_NULL)
2423*fae548d3Szrj     return (*fns->empty_type) (fhandle);
2424*fae548d3Szrj 
2425*fae548d3Szrj   /* If we have a name for this type, just output it.  We only output
2426*fae548d3Szrj      typedef names after they have been defined.  We output type tags
2427*fae548d3Szrj      whenever we are not actually defining them.  */
2428*fae548d3Szrj   if ((type->kind == DEBUG_KIND_NAMED
2429*fae548d3Szrj        || type->kind == DEBUG_KIND_TAGGED)
2430*fae548d3Szrj       && (type->u.knamed->name->mark == info->mark
2431*fae548d3Szrj 	  || (type->kind == DEBUG_KIND_TAGGED
2432*fae548d3Szrj 	      && type->u.knamed->name != name)))
2433*fae548d3Szrj     {
2434*fae548d3Szrj       if (type->kind == DEBUG_KIND_NAMED)
2435*fae548d3Szrj 	return (*fns->typedef_type) (fhandle, type->u.knamed->name->name);
2436*fae548d3Szrj       else
2437*fae548d3Szrj 	{
2438*fae548d3Szrj 	  struct debug_type_s *real;
2439*fae548d3Szrj 	  unsigned int id;
2440*fae548d3Szrj 
2441*fae548d3Szrj 	  real = debug_get_real_type ((void *) info, type, NULL);
2442*fae548d3Szrj 	  if (real == NULL)
2443*fae548d3Szrj 	    return (*fns->empty_type) (fhandle);
2444*fae548d3Szrj 	  id = 0;
2445*fae548d3Szrj 	  if ((real->kind == DEBUG_KIND_STRUCT
2446*fae548d3Szrj 	       || real->kind == DEBUG_KIND_UNION
2447*fae548d3Szrj 	       || real->kind == DEBUG_KIND_CLASS
2448*fae548d3Szrj 	       || real->kind == DEBUG_KIND_UNION_CLASS)
2449*fae548d3Szrj 	      && real->u.kclass != NULL)
2450*fae548d3Szrj 	    {
2451*fae548d3Szrj 	      if (real->u.kclass->id <= info->base_id)
2452*fae548d3Szrj 		{
2453*fae548d3Szrj 		  if (! debug_set_class_id (info,
2454*fae548d3Szrj 					    type->u.knamed->name->name,
2455*fae548d3Szrj 					    real))
2456*fae548d3Szrj 		    return FALSE;
2457*fae548d3Szrj 		}
2458*fae548d3Szrj 	      id = real->u.kclass->id;
2459*fae548d3Szrj 	    }
2460*fae548d3Szrj 
2461*fae548d3Szrj 	  return (*fns->tag_type) (fhandle, type->u.knamed->name->name, id,
2462*fae548d3Szrj 				   real->kind);
2463*fae548d3Szrj 	}
2464*fae548d3Szrj     }
2465*fae548d3Szrj 
2466*fae548d3Szrj   /* Mark the name after we have already looked for a known name, so
2467*fae548d3Szrj      that we don't just define a type in terms of itself.  We need to
2468*fae548d3Szrj      mark the name here so that a struct containing a pointer to
2469*fae548d3Szrj      itself will work.  */
2470*fae548d3Szrj   if (name != NULL)
2471*fae548d3Szrj     name->mark = info->mark;
2472*fae548d3Szrj 
2473*fae548d3Szrj   if (name != NULL
2474*fae548d3Szrj       && type->kind != DEBUG_KIND_NAMED
2475*fae548d3Szrj       && type->kind != DEBUG_KIND_TAGGED)
2476*fae548d3Szrj     {
2477*fae548d3Szrj       assert (name->kind == DEBUG_OBJECT_TAG);
2478*fae548d3Szrj       tag = name->name;
2479*fae548d3Szrj     }
2480*fae548d3Szrj 
2481*fae548d3Szrj   switch (type->kind)
2482*fae548d3Szrj     {
2483*fae548d3Szrj     case DEBUG_KIND_ILLEGAL:
2484*fae548d3Szrj       debug_error (_("debug_write_type: illegal type encountered"));
2485*fae548d3Szrj       return FALSE;
2486*fae548d3Szrj     case DEBUG_KIND_INDIRECT:
2487*fae548d3Szrj       return debug_write_type (info, fns, fhandle, *type->u.kindirect->slot,
2488*fae548d3Szrj 			       name);
2489*fae548d3Szrj     case DEBUG_KIND_VOID:
2490*fae548d3Szrj       return (*fns->void_type) (fhandle);
2491*fae548d3Szrj     case DEBUG_KIND_INT:
2492*fae548d3Szrj       return (*fns->int_type) (fhandle, type->size, type->u.kint);
2493*fae548d3Szrj     case DEBUG_KIND_FLOAT:
2494*fae548d3Szrj       return (*fns->float_type) (fhandle, type->size);
2495*fae548d3Szrj     case DEBUG_KIND_COMPLEX:
2496*fae548d3Szrj       return (*fns->complex_type) (fhandle, type->size);
2497*fae548d3Szrj     case DEBUG_KIND_BOOL:
2498*fae548d3Szrj       return (*fns->bool_type) (fhandle, type->size);
2499*fae548d3Szrj     case DEBUG_KIND_STRUCT:
2500*fae548d3Szrj     case DEBUG_KIND_UNION:
2501*fae548d3Szrj       if (type->u.kclass != NULL)
2502*fae548d3Szrj 	{
2503*fae548d3Szrj 	  if (type->u.kclass->id <= info->base_id)
2504*fae548d3Szrj 	    {
2505*fae548d3Szrj 	      if (! debug_set_class_id (info, tag, type))
2506*fae548d3Szrj 		return FALSE;
2507*fae548d3Szrj 	    }
2508*fae548d3Szrj 
2509*fae548d3Szrj 	  if (info->mark == type->u.kclass->mark)
2510*fae548d3Szrj 	    {
2511*fae548d3Szrj 	      /* We are currently outputting this struct, or we have
2512*fae548d3Szrj 		 already output it.  I don't know if this can happen,
2513*fae548d3Szrj 		 but it can happen for a class.  */
2514*fae548d3Szrj 	      assert (type->u.kclass->id > info->base_id);
2515*fae548d3Szrj 	      return (*fns->tag_type) (fhandle, tag, type->u.kclass->id,
2516*fae548d3Szrj 				       type->kind);
2517*fae548d3Szrj 	    }
2518*fae548d3Szrj 	  type->u.kclass->mark = info->mark;
2519*fae548d3Szrj 	}
2520*fae548d3Szrj 
2521*fae548d3Szrj       if (! (*fns->start_struct_type) (fhandle, tag,
2522*fae548d3Szrj 				       (type->u.kclass != NULL
2523*fae548d3Szrj 					? type->u.kclass->id
2524*fae548d3Szrj 					: 0),
2525*fae548d3Szrj 				       type->kind == DEBUG_KIND_STRUCT,
2526*fae548d3Szrj 				       type->size))
2527*fae548d3Szrj 	return FALSE;
2528*fae548d3Szrj       if (type->u.kclass != NULL
2529*fae548d3Szrj 	  && type->u.kclass->fields != NULL)
2530*fae548d3Szrj 	{
2531*fae548d3Szrj 	  for (i = 0; type->u.kclass->fields[i] != NULL; i++)
2532*fae548d3Szrj 	    {
2533*fae548d3Szrj 	      struct debug_field_s *f;
2534*fae548d3Szrj 
2535*fae548d3Szrj 	      f = type->u.kclass->fields[i];
2536*fae548d3Szrj 	      if (! debug_write_type (info, fns, fhandle, f->type,
2537*fae548d3Szrj 				      (struct debug_name *) NULL)
2538*fae548d3Szrj 		  || ! (*fns->struct_field) (fhandle, f->name, f->u.f.bitpos,
2539*fae548d3Szrj 					     f->u.f.bitsize, f->visibility))
2540*fae548d3Szrj 		return FALSE;
2541*fae548d3Szrj 	    }
2542*fae548d3Szrj 	}
2543*fae548d3Szrj       return (*fns->end_struct_type) (fhandle);
2544*fae548d3Szrj     case DEBUG_KIND_CLASS:
2545*fae548d3Szrj     case DEBUG_KIND_UNION_CLASS:
2546*fae548d3Szrj       return debug_write_class_type (info, fns, fhandle, type, tag);
2547*fae548d3Szrj     case DEBUG_KIND_ENUM:
2548*fae548d3Szrj       if (type->u.kenum == NULL)
2549*fae548d3Szrj 	return (*fns->enum_type) (fhandle, tag, (const char **) NULL,
2550*fae548d3Szrj 				  (bfd_signed_vma *) NULL);
2551*fae548d3Szrj       return (*fns->enum_type) (fhandle, tag, type->u.kenum->names,
2552*fae548d3Szrj 				type->u.kenum->values);
2553*fae548d3Szrj     case DEBUG_KIND_POINTER:
2554*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, type->u.kpointer,
2555*fae548d3Szrj 			      (struct debug_name *) NULL))
2556*fae548d3Szrj 	return FALSE;
2557*fae548d3Szrj       return (*fns->pointer_type) (fhandle);
2558*fae548d3Szrj     case DEBUG_KIND_FUNCTION:
2559*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle,
2560*fae548d3Szrj 			      type->u.kfunction->return_type,
2561*fae548d3Szrj 			      (struct debug_name *) NULL))
2562*fae548d3Szrj 	return FALSE;
2563*fae548d3Szrj       if (type->u.kfunction->arg_types == NULL)
2564*fae548d3Szrj 	is = -1;
2565*fae548d3Szrj       else
2566*fae548d3Szrj 	{
2567*fae548d3Szrj 	  for (is = 0; type->u.kfunction->arg_types[is] != NULL; is++)
2568*fae548d3Szrj 	    if (! debug_write_type (info, fns, fhandle,
2569*fae548d3Szrj 				    type->u.kfunction->arg_types[is],
2570*fae548d3Szrj 				    (struct debug_name *) NULL))
2571*fae548d3Szrj 	      return FALSE;
2572*fae548d3Szrj 	}
2573*fae548d3Szrj       return (*fns->function_type) (fhandle, is,
2574*fae548d3Szrj 				    type->u.kfunction->varargs);
2575*fae548d3Szrj     case DEBUG_KIND_REFERENCE:
2576*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, type->u.kreference,
2577*fae548d3Szrj 			      (struct debug_name *) NULL))
2578*fae548d3Szrj 	return FALSE;
2579*fae548d3Szrj       return (*fns->reference_type) (fhandle);
2580*fae548d3Szrj     case DEBUG_KIND_RANGE:
2581*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, type->u.krange->type,
2582*fae548d3Szrj 			      (struct debug_name *) NULL))
2583*fae548d3Szrj 	return FALSE;
2584*fae548d3Szrj       return (*fns->range_type) (fhandle, type->u.krange->lower,
2585*fae548d3Szrj 				 type->u.krange->upper);
2586*fae548d3Szrj     case DEBUG_KIND_ARRAY:
2587*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, type->u.karray->element_type,
2588*fae548d3Szrj 			      (struct debug_name *) NULL)
2589*fae548d3Szrj 	  || ! debug_write_type (info, fns, fhandle,
2590*fae548d3Szrj 				 type->u.karray->range_type,
2591*fae548d3Szrj 				 (struct debug_name *) NULL))
2592*fae548d3Szrj 	return FALSE;
2593*fae548d3Szrj       return (*fns->array_type) (fhandle, type->u.karray->lower,
2594*fae548d3Szrj 				 type->u.karray->upper,
2595*fae548d3Szrj 				 type->u.karray->stringp);
2596*fae548d3Szrj     case DEBUG_KIND_SET:
2597*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, type->u.kset->type,
2598*fae548d3Szrj 			      (struct debug_name *) NULL))
2599*fae548d3Szrj 	return FALSE;
2600*fae548d3Szrj       return (*fns->set_type) (fhandle, type->u.kset->bitstringp);
2601*fae548d3Szrj     case DEBUG_KIND_OFFSET:
2602*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, type->u.koffset->base_type,
2603*fae548d3Szrj 			      (struct debug_name *) NULL)
2604*fae548d3Szrj 	  || ! debug_write_type (info, fns, fhandle,
2605*fae548d3Szrj 				 type->u.koffset->target_type,
2606*fae548d3Szrj 				 (struct debug_name *) NULL))
2607*fae548d3Szrj 	return FALSE;
2608*fae548d3Szrj       return (*fns->offset_type) (fhandle);
2609*fae548d3Szrj     case DEBUG_KIND_METHOD:
2610*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle,
2611*fae548d3Szrj 			      type->u.kmethod->return_type,
2612*fae548d3Szrj 			      (struct debug_name *) NULL))
2613*fae548d3Szrj 	return FALSE;
2614*fae548d3Szrj       if (type->u.kmethod->arg_types == NULL)
2615*fae548d3Szrj 	is = -1;
2616*fae548d3Szrj       else
2617*fae548d3Szrj 	{
2618*fae548d3Szrj 	  for (is = 0; type->u.kmethod->arg_types[is] != NULL; is++)
2619*fae548d3Szrj 	    if (! debug_write_type (info, fns, fhandle,
2620*fae548d3Szrj 				    type->u.kmethod->arg_types[is],
2621*fae548d3Szrj 				    (struct debug_name *) NULL))
2622*fae548d3Szrj 	      return FALSE;
2623*fae548d3Szrj 	}
2624*fae548d3Szrj       if (type->u.kmethod->domain_type != NULL)
2625*fae548d3Szrj 	{
2626*fae548d3Szrj 	  if (! debug_write_type (info, fns, fhandle,
2627*fae548d3Szrj 				  type->u.kmethod->domain_type,
2628*fae548d3Szrj 				  (struct debug_name *) NULL))
2629*fae548d3Szrj 	    return FALSE;
2630*fae548d3Szrj 	}
2631*fae548d3Szrj       return (*fns->method_type) (fhandle,
2632*fae548d3Szrj 				  type->u.kmethod->domain_type != NULL,
2633*fae548d3Szrj 				  is,
2634*fae548d3Szrj 				  type->u.kmethod->varargs);
2635*fae548d3Szrj     case DEBUG_KIND_CONST:
2636*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, type->u.kconst,
2637*fae548d3Szrj 			      (struct debug_name *) NULL))
2638*fae548d3Szrj 	return FALSE;
2639*fae548d3Szrj       return (*fns->const_type) (fhandle);
2640*fae548d3Szrj     case DEBUG_KIND_VOLATILE:
2641*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, type->u.kvolatile,
2642*fae548d3Szrj 			      (struct debug_name *) NULL))
2643*fae548d3Szrj 	return FALSE;
2644*fae548d3Szrj       return (*fns->volatile_type) (fhandle);
2645*fae548d3Szrj     case DEBUG_KIND_NAMED:
2646*fae548d3Szrj       return debug_write_type (info, fns, fhandle, type->u.knamed->type,
2647*fae548d3Szrj 			       (struct debug_name *) NULL);
2648*fae548d3Szrj     case DEBUG_KIND_TAGGED:
2649*fae548d3Szrj       return debug_write_type (info, fns, fhandle, type->u.knamed->type,
2650*fae548d3Szrj 			       type->u.knamed->name);
2651*fae548d3Szrj     default:
2652*fae548d3Szrj       abort ();
2653*fae548d3Szrj       return FALSE;
2654*fae548d3Szrj     }
2655*fae548d3Szrj }
2656*fae548d3Szrj 
2657*fae548d3Szrj /* Write out a class type.  */
2658*fae548d3Szrj 
2659*fae548d3Szrj static bfd_boolean
debug_write_class_type(struct debug_handle * info,const struct debug_write_fns * fns,void * fhandle,struct debug_type_s * type,const char * tag)2660*fae548d3Szrj debug_write_class_type (struct debug_handle *info,
2661*fae548d3Szrj 			const struct debug_write_fns *fns, void *fhandle,
2662*fae548d3Szrj 			struct debug_type_s *type, const char *tag)
2663*fae548d3Szrj {
2664*fae548d3Szrj   unsigned int i;
2665*fae548d3Szrj   unsigned int id;
2666*fae548d3Szrj   struct debug_type_s *vptrbase;
2667*fae548d3Szrj 
2668*fae548d3Szrj   if (type->u.kclass == NULL)
2669*fae548d3Szrj     {
2670*fae548d3Szrj       id = 0;
2671*fae548d3Szrj       vptrbase = NULL;
2672*fae548d3Szrj     }
2673*fae548d3Szrj   else
2674*fae548d3Szrj     {
2675*fae548d3Szrj       if (type->u.kclass->id <= info->base_id)
2676*fae548d3Szrj 	{
2677*fae548d3Szrj 	  if (! debug_set_class_id (info, tag, type))
2678*fae548d3Szrj 	    return FALSE;
2679*fae548d3Szrj 	}
2680*fae548d3Szrj 
2681*fae548d3Szrj       if (info->mark == type->u.kclass->mark)
2682*fae548d3Szrj 	{
2683*fae548d3Szrj 	  /* We are currently outputting this class, or we have
2684*fae548d3Szrj 	     already output it.  This can happen when there are
2685*fae548d3Szrj 	     methods for an anonymous class.  */
2686*fae548d3Szrj 	  assert (type->u.kclass->id > info->base_id);
2687*fae548d3Szrj 	  return (*fns->tag_type) (fhandle, tag, type->u.kclass->id,
2688*fae548d3Szrj 				   type->kind);
2689*fae548d3Szrj 	}
2690*fae548d3Szrj       type->u.kclass->mark = info->mark;
2691*fae548d3Szrj       id = type->u.kclass->id;
2692*fae548d3Szrj 
2693*fae548d3Szrj       vptrbase = type->u.kclass->vptrbase;
2694*fae548d3Szrj       if (vptrbase != NULL && vptrbase != type)
2695*fae548d3Szrj 	{
2696*fae548d3Szrj 	  if (! debug_write_type (info, fns, fhandle, vptrbase,
2697*fae548d3Szrj 				  (struct debug_name *) NULL))
2698*fae548d3Szrj 	    return FALSE;
2699*fae548d3Szrj 	}
2700*fae548d3Szrj     }
2701*fae548d3Szrj 
2702*fae548d3Szrj   if (! (*fns->start_class_type) (fhandle, tag, id,
2703*fae548d3Szrj 				  type->kind == DEBUG_KIND_CLASS,
2704*fae548d3Szrj 				  type->size,
2705*fae548d3Szrj 				  vptrbase != NULL,
2706*fae548d3Szrj 				  vptrbase == type))
2707*fae548d3Szrj     return FALSE;
2708*fae548d3Szrj 
2709*fae548d3Szrj   if (type->u.kclass != NULL)
2710*fae548d3Szrj     {
2711*fae548d3Szrj       if (type->u.kclass->fields != NULL)
2712*fae548d3Szrj 	{
2713*fae548d3Szrj 	  for (i = 0; type->u.kclass->fields[i] != NULL; i++)
2714*fae548d3Szrj 	    {
2715*fae548d3Szrj 	      struct debug_field_s *f;
2716*fae548d3Szrj 
2717*fae548d3Szrj 	      f = type->u.kclass->fields[i];
2718*fae548d3Szrj 	      if (! debug_write_type (info, fns, fhandle, f->type,
2719*fae548d3Szrj 				      (struct debug_name *) NULL))
2720*fae548d3Szrj 		return FALSE;
2721*fae548d3Szrj 	      if (f->static_member)
2722*fae548d3Szrj 		{
2723*fae548d3Szrj 		  if (! (*fns->class_static_member) (fhandle, f->name,
2724*fae548d3Szrj 						     f->u.s.physname,
2725*fae548d3Szrj 						     f->visibility))
2726*fae548d3Szrj 		    return FALSE;
2727*fae548d3Szrj 		}
2728*fae548d3Szrj 	      else
2729*fae548d3Szrj 		{
2730*fae548d3Szrj 		  if (! (*fns->struct_field) (fhandle, f->name, f->u.f.bitpos,
2731*fae548d3Szrj 					      f->u.f.bitsize, f->visibility))
2732*fae548d3Szrj 		    return FALSE;
2733*fae548d3Szrj 		}
2734*fae548d3Szrj 	    }
2735*fae548d3Szrj 	}
2736*fae548d3Szrj 
2737*fae548d3Szrj       if (type->u.kclass->baseclasses != NULL)
2738*fae548d3Szrj 	{
2739*fae548d3Szrj 	  for (i = 0; type->u.kclass->baseclasses[i] != NULL; i++)
2740*fae548d3Szrj 	    {
2741*fae548d3Szrj 	      struct debug_baseclass_s *b;
2742*fae548d3Szrj 
2743*fae548d3Szrj 	      b = type->u.kclass->baseclasses[i];
2744*fae548d3Szrj 	      if (! debug_write_type (info, fns, fhandle, b->type,
2745*fae548d3Szrj 				      (struct debug_name *) NULL))
2746*fae548d3Szrj 		return FALSE;
2747*fae548d3Szrj 	      if (! (*fns->class_baseclass) (fhandle, b->bitpos, b->is_virtual,
2748*fae548d3Szrj 					     b->visibility))
2749*fae548d3Szrj 		return FALSE;
2750*fae548d3Szrj 	    }
2751*fae548d3Szrj 	}
2752*fae548d3Szrj 
2753*fae548d3Szrj       if (type->u.kclass->methods != NULL)
2754*fae548d3Szrj 	{
2755*fae548d3Szrj 	  for (i = 0; type->u.kclass->methods[i] != NULL; i++)
2756*fae548d3Szrj 	    {
2757*fae548d3Szrj 	      struct debug_method_s *m;
2758*fae548d3Szrj 	      unsigned int j;
2759*fae548d3Szrj 
2760*fae548d3Szrj 	      m = type->u.kclass->methods[i];
2761*fae548d3Szrj 	      if (! (*fns->class_start_method) (fhandle, m->name))
2762*fae548d3Szrj 		return FALSE;
2763*fae548d3Szrj 	      for (j = 0; m->variants[j] != NULL; j++)
2764*fae548d3Szrj 		{
2765*fae548d3Szrj 		  struct debug_method_variant_s *v;
2766*fae548d3Szrj 
2767*fae548d3Szrj 		  v = m->variants[j];
2768*fae548d3Szrj 		  if (v->context != NULL)
2769*fae548d3Szrj 		    {
2770*fae548d3Szrj 		      if (! debug_write_type (info, fns, fhandle, v->context,
2771*fae548d3Szrj 					      (struct debug_name *) NULL))
2772*fae548d3Szrj 			return FALSE;
2773*fae548d3Szrj 		    }
2774*fae548d3Szrj 		  if (! debug_write_type (info, fns, fhandle, v->type,
2775*fae548d3Szrj 					  (struct debug_name *) NULL))
2776*fae548d3Szrj 		    return FALSE;
2777*fae548d3Szrj 		  if (v->voffset != VOFFSET_STATIC_METHOD)
2778*fae548d3Szrj 		    {
2779*fae548d3Szrj 		      if (! (*fns->class_method_variant) (fhandle, v->physname,
2780*fae548d3Szrj 							  v->visibility,
2781*fae548d3Szrj 							  v->constp,
2782*fae548d3Szrj 							  v->volatilep,
2783*fae548d3Szrj 							  v->voffset,
2784*fae548d3Szrj 							  v->context != NULL))
2785*fae548d3Szrj 			return FALSE;
2786*fae548d3Szrj 		    }
2787*fae548d3Szrj 		  else
2788*fae548d3Szrj 		    {
2789*fae548d3Szrj 		      if (! (*fns->class_static_method_variant) (fhandle,
2790*fae548d3Szrj 								 v->physname,
2791*fae548d3Szrj 								 v->visibility,
2792*fae548d3Szrj 								 v->constp,
2793*fae548d3Szrj 								 v->volatilep))
2794*fae548d3Szrj 			return FALSE;
2795*fae548d3Szrj 		    }
2796*fae548d3Szrj 		}
2797*fae548d3Szrj 	      if (! (*fns->class_end_method) (fhandle))
2798*fae548d3Szrj 		return FALSE;
2799*fae548d3Szrj 	    }
2800*fae548d3Szrj 	}
2801*fae548d3Szrj     }
2802*fae548d3Szrj 
2803*fae548d3Szrj   return (*fns->end_class_type) (fhandle);
2804*fae548d3Szrj }
2805*fae548d3Szrj 
2806*fae548d3Szrj /* Write out information for a function.  */
2807*fae548d3Szrj 
2808*fae548d3Szrj static bfd_boolean
debug_write_function(struct debug_handle * info,const struct debug_write_fns * fns,void * fhandle,const char * name,enum debug_object_linkage linkage,struct debug_function * function)2809*fae548d3Szrj debug_write_function (struct debug_handle *info,
2810*fae548d3Szrj 		      const struct debug_write_fns *fns, void *fhandle,
2811*fae548d3Szrj 		      const char *name, enum debug_object_linkage linkage,
2812*fae548d3Szrj 		      struct debug_function *function)
2813*fae548d3Szrj {
2814*fae548d3Szrj   struct debug_parameter *p;
2815*fae548d3Szrj   struct debug_block *b;
2816*fae548d3Szrj 
2817*fae548d3Szrj   if (! debug_write_linenos (info, fns, fhandle, function->blocks->start))
2818*fae548d3Szrj     return FALSE;
2819*fae548d3Szrj 
2820*fae548d3Szrj   if (! debug_write_type (info, fns, fhandle, function->return_type,
2821*fae548d3Szrj 			  (struct debug_name *) NULL))
2822*fae548d3Szrj     return FALSE;
2823*fae548d3Szrj 
2824*fae548d3Szrj   if (! (*fns->start_function) (fhandle, name,
2825*fae548d3Szrj 				linkage == DEBUG_LINKAGE_GLOBAL))
2826*fae548d3Szrj     return FALSE;
2827*fae548d3Szrj 
2828*fae548d3Szrj   for (p = function->parameters; p != NULL; p = p->next)
2829*fae548d3Szrj     {
2830*fae548d3Szrj       if (! debug_write_type (info, fns, fhandle, p->type,
2831*fae548d3Szrj 			      (struct debug_name *) NULL)
2832*fae548d3Szrj 	  || ! (*fns->function_parameter) (fhandle, p->name, p->kind, p->val))
2833*fae548d3Szrj 	return FALSE;
2834*fae548d3Szrj     }
2835*fae548d3Szrj 
2836*fae548d3Szrj   for (b = function->blocks; b != NULL; b = b->next)
2837*fae548d3Szrj     {
2838*fae548d3Szrj       if (! debug_write_block (info, fns, fhandle, b))
2839*fae548d3Szrj 	return FALSE;
2840*fae548d3Szrj     }
2841*fae548d3Szrj 
2842*fae548d3Szrj   return (*fns->end_function) (fhandle);
2843*fae548d3Szrj }
2844*fae548d3Szrj 
2845*fae548d3Szrj /* Write out information for a block.  */
2846*fae548d3Szrj 
2847*fae548d3Szrj static bfd_boolean
debug_write_block(struct debug_handle * info,const struct debug_write_fns * fns,void * fhandle,struct debug_block * block)2848*fae548d3Szrj debug_write_block (struct debug_handle *info,
2849*fae548d3Szrj 		   const struct debug_write_fns *fns, void *fhandle,
2850*fae548d3Szrj 		   struct debug_block *block)
2851*fae548d3Szrj {
2852*fae548d3Szrj   struct debug_name *n;
2853*fae548d3Szrj   struct debug_block *b;
2854*fae548d3Szrj 
2855*fae548d3Szrj   if (! debug_write_linenos (info, fns, fhandle, block->start))
2856*fae548d3Szrj     return FALSE;
2857*fae548d3Szrj 
2858*fae548d3Szrj   /* I can't see any point to writing out a block with no local
2859*fae548d3Szrj      variables, so we don't bother, except for the top level block.  */
2860*fae548d3Szrj   if (block->locals != NULL || block->parent == NULL)
2861*fae548d3Szrj     {
2862*fae548d3Szrj       if (! (*fns->start_block) (fhandle, block->start))
2863*fae548d3Szrj 	return FALSE;
2864*fae548d3Szrj     }
2865*fae548d3Szrj 
2866*fae548d3Szrj   if (block->locals != NULL)
2867*fae548d3Szrj     {
2868*fae548d3Szrj       for (n = block->locals->list; n != NULL; n = n->next)
2869*fae548d3Szrj 	{
2870*fae548d3Szrj 	  if (! debug_write_name (info, fns, fhandle, n))
2871*fae548d3Szrj 	    return FALSE;
2872*fae548d3Szrj 	}
2873*fae548d3Szrj     }
2874*fae548d3Szrj 
2875*fae548d3Szrj   for (b = block->children; b != NULL; b = b->next)
2876*fae548d3Szrj     {
2877*fae548d3Szrj       if (! debug_write_block (info, fns, fhandle, b))
2878*fae548d3Szrj 	return FALSE;
2879*fae548d3Szrj     }
2880*fae548d3Szrj 
2881*fae548d3Szrj   if (! debug_write_linenos (info, fns, fhandle, block->end))
2882*fae548d3Szrj     return FALSE;
2883*fae548d3Szrj 
2884*fae548d3Szrj   if (block->locals != NULL || block->parent == NULL)
2885*fae548d3Szrj     {
2886*fae548d3Szrj       if (! (*fns->end_block) (fhandle, block->end))
2887*fae548d3Szrj 	return FALSE;
2888*fae548d3Szrj     }
2889*fae548d3Szrj 
2890*fae548d3Szrj   return TRUE;
2891*fae548d3Szrj }
2892*fae548d3Szrj 
2893*fae548d3Szrj /* Write out line number information up to ADDRESS.  */
2894*fae548d3Szrj 
2895*fae548d3Szrj static bfd_boolean
debug_write_linenos(struct debug_handle * info,const struct debug_write_fns * fns,void * fhandle,bfd_vma address)2896*fae548d3Szrj debug_write_linenos (struct debug_handle *info,
2897*fae548d3Szrj 		     const struct debug_write_fns *fns, void *fhandle,
2898*fae548d3Szrj 		     bfd_vma address)
2899*fae548d3Szrj {
2900*fae548d3Szrj   while (info->current_write_lineno != NULL)
2901*fae548d3Szrj     {
2902*fae548d3Szrj       struct debug_lineno *l;
2903*fae548d3Szrj 
2904*fae548d3Szrj       l = info->current_write_lineno;
2905*fae548d3Szrj 
2906*fae548d3Szrj       while (info->current_write_lineno_index < DEBUG_LINENO_COUNT)
2907*fae548d3Szrj 	{
2908*fae548d3Szrj 	  if (l->linenos[info->current_write_lineno_index]
2909*fae548d3Szrj 	      == (unsigned long) -1)
2910*fae548d3Szrj 	    break;
2911*fae548d3Szrj 
2912*fae548d3Szrj 	  if (l->addrs[info->current_write_lineno_index] >= address)
2913*fae548d3Szrj 	    return TRUE;
2914*fae548d3Szrj 
2915*fae548d3Szrj 	  if (! (*fns->lineno) (fhandle, l->file->filename,
2916*fae548d3Szrj 				l->linenos[info->current_write_lineno_index],
2917*fae548d3Szrj 				l->addrs[info->current_write_lineno_index]))
2918*fae548d3Szrj 	    return FALSE;
2919*fae548d3Szrj 
2920*fae548d3Szrj 	  ++info->current_write_lineno_index;
2921*fae548d3Szrj 	}
2922*fae548d3Szrj 
2923*fae548d3Szrj       info->current_write_lineno = l->next;
2924*fae548d3Szrj       info->current_write_lineno_index = 0;
2925*fae548d3Szrj     }
2926*fae548d3Szrj 
2927*fae548d3Szrj   return TRUE;
2928*fae548d3Szrj }
2929*fae548d3Szrj 
2930*fae548d3Szrj /* Get the ID number for a class.  If during the same call to
2931*fae548d3Szrj    debug_write we find a struct with the same definition with the same
2932*fae548d3Szrj    name, we use the same ID.  This type of things happens because the
2933*fae548d3Szrj    same struct will be defined by multiple compilation units.  */
2934*fae548d3Szrj 
2935*fae548d3Szrj static bfd_boolean
debug_set_class_id(struct debug_handle * info,const char * tag,struct debug_type_s * type)2936*fae548d3Szrj debug_set_class_id (struct debug_handle *info, const char *tag,
2937*fae548d3Szrj 		    struct debug_type_s *type)
2938*fae548d3Szrj {
2939*fae548d3Szrj   struct debug_class_type *c;
2940*fae548d3Szrj   struct debug_class_id *l;
2941*fae548d3Szrj 
2942*fae548d3Szrj   assert (type->kind == DEBUG_KIND_STRUCT
2943*fae548d3Szrj 	  || type->kind == DEBUG_KIND_UNION
2944*fae548d3Szrj 	  || type->kind == DEBUG_KIND_CLASS
2945*fae548d3Szrj 	  || type->kind == DEBUG_KIND_UNION_CLASS);
2946*fae548d3Szrj 
2947*fae548d3Szrj   c = type->u.kclass;
2948*fae548d3Szrj 
2949*fae548d3Szrj   if (c->id > info->base_id)
2950*fae548d3Szrj     return TRUE;
2951*fae548d3Szrj 
2952*fae548d3Szrj   for (l = info->id_list; l != NULL; l = l->next)
2953*fae548d3Szrj     {
2954*fae548d3Szrj       if (l->type->kind != type->kind)
2955*fae548d3Szrj 	continue;
2956*fae548d3Szrj 
2957*fae548d3Szrj       if (tag == NULL)
2958*fae548d3Szrj 	{
2959*fae548d3Szrj 	  if (l->tag != NULL)
2960*fae548d3Szrj 	    continue;
2961*fae548d3Szrj 	}
2962*fae548d3Szrj       else
2963*fae548d3Szrj 	{
2964*fae548d3Szrj 	  if (l->tag == NULL
2965*fae548d3Szrj 	      || l->tag[0] != tag[0]
2966*fae548d3Szrj 	      || strcmp (l->tag, tag) != 0)
2967*fae548d3Szrj 	    continue;
2968*fae548d3Szrj 	}
2969*fae548d3Szrj 
2970*fae548d3Szrj       if (debug_type_samep (info, l->type, type))
2971*fae548d3Szrj 	{
2972*fae548d3Szrj 	  c->id = l->type->u.kclass->id;
2973*fae548d3Szrj 	  return TRUE;
2974*fae548d3Szrj 	}
2975*fae548d3Szrj     }
2976*fae548d3Szrj 
2977*fae548d3Szrj   /* There are no identical types.  Use a new ID, and add it to the
2978*fae548d3Szrj      list.  */
2979*fae548d3Szrj   ++info->class_id;
2980*fae548d3Szrj   c->id = info->class_id;
2981*fae548d3Szrj 
2982*fae548d3Szrj   l = (struct debug_class_id *) xmalloc (sizeof *l);
2983*fae548d3Szrj   memset (l, 0, sizeof *l);
2984*fae548d3Szrj 
2985*fae548d3Szrj   l->type = type;
2986*fae548d3Szrj   l->tag = tag;
2987*fae548d3Szrj 
2988*fae548d3Szrj   l->next = info->id_list;
2989*fae548d3Szrj   info->id_list = l;
2990*fae548d3Szrj 
2991*fae548d3Szrj   return TRUE;
2992*fae548d3Szrj }
2993*fae548d3Szrj 
2994*fae548d3Szrj /* See if two types are the same.  At this point, we don't care about
2995*fae548d3Szrj    tags and the like.  */
2996*fae548d3Szrj 
2997*fae548d3Szrj static bfd_boolean
debug_type_samep(struct debug_handle * info,struct debug_type_s * t1,struct debug_type_s * t2)2998*fae548d3Szrj debug_type_samep (struct debug_handle *info, struct debug_type_s *t1,
2999*fae548d3Szrj 		  struct debug_type_s *t2)
3000*fae548d3Szrj {
3001*fae548d3Szrj   struct debug_type_compare_list *l;
3002*fae548d3Szrj   struct debug_type_compare_list top;
3003*fae548d3Szrj   bfd_boolean ret;
3004*fae548d3Szrj 
3005*fae548d3Szrj   if (t1 == NULL)
3006*fae548d3Szrj     return t2 == NULL;
3007*fae548d3Szrj   if (t2 == NULL)
3008*fae548d3Szrj     return FALSE;
3009*fae548d3Szrj 
3010*fae548d3Szrj   while (t1->kind == DEBUG_KIND_INDIRECT)
3011*fae548d3Szrj     {
3012*fae548d3Szrj       t1 = *t1->u.kindirect->slot;
3013*fae548d3Szrj       if (t1 == NULL)
3014*fae548d3Szrj 	return FALSE;
3015*fae548d3Szrj     }
3016*fae548d3Szrj   while (t2->kind == DEBUG_KIND_INDIRECT)
3017*fae548d3Szrj     {
3018*fae548d3Szrj       t2 = *t2->u.kindirect->slot;
3019*fae548d3Szrj       if (t2 == NULL)
3020*fae548d3Szrj 	return FALSE;
3021*fae548d3Szrj     }
3022*fae548d3Szrj 
3023*fae548d3Szrj   if (t1 == t2)
3024*fae548d3Szrj     return TRUE;
3025*fae548d3Szrj 
3026*fae548d3Szrj   /* As a special case, permit a typedef to match a tag, since C++
3027*fae548d3Szrj      debugging output will sometimes add a typedef where C debugging
3028*fae548d3Szrj      output will not.  */
3029*fae548d3Szrj   if (t1->kind == DEBUG_KIND_NAMED
3030*fae548d3Szrj       && t2->kind == DEBUG_KIND_TAGGED)
3031*fae548d3Szrj     return debug_type_samep (info, t1->u.knamed->type, t2);
3032*fae548d3Szrj   else if (t1->kind == DEBUG_KIND_TAGGED
3033*fae548d3Szrj 	   && t2->kind == DEBUG_KIND_NAMED)
3034*fae548d3Szrj     return debug_type_samep (info, t1, t2->u.knamed->type);
3035*fae548d3Szrj 
3036*fae548d3Szrj   if (t1->kind != t2->kind
3037*fae548d3Szrj       || t1->size != t2->size)
3038*fae548d3Szrj     return FALSE;
3039*fae548d3Szrj 
3040*fae548d3Szrj   /* Get rid of the trivial cases first.  */
3041*fae548d3Szrj   switch (t1->kind)
3042*fae548d3Szrj     {
3043*fae548d3Szrj     default:
3044*fae548d3Szrj       break;
3045*fae548d3Szrj     case DEBUG_KIND_VOID:
3046*fae548d3Szrj     case DEBUG_KIND_FLOAT:
3047*fae548d3Szrj     case DEBUG_KIND_COMPLEX:
3048*fae548d3Szrj     case DEBUG_KIND_BOOL:
3049*fae548d3Szrj       return TRUE;
3050*fae548d3Szrj     case DEBUG_KIND_INT:
3051*fae548d3Szrj       return t1->u.kint == t2->u.kint;
3052*fae548d3Szrj     }
3053*fae548d3Szrj 
3054*fae548d3Szrj   /* We have to avoid an infinite recursion.  We do this by keeping a
3055*fae548d3Szrj      list of types which we are comparing.  We just keep the list on
3056*fae548d3Szrj      the stack.  If we encounter a pair of types we are currently
3057*fae548d3Szrj      comparing, we just assume that they are equal.  */
3058*fae548d3Szrj   for (l = info->compare_list; l != NULL; l = l->next)
3059*fae548d3Szrj     {
3060*fae548d3Szrj       if (l->t1 == t1 && l->t2 == t2)
3061*fae548d3Szrj 	return TRUE;
3062*fae548d3Szrj     }
3063*fae548d3Szrj 
3064*fae548d3Szrj   top.t1 = t1;
3065*fae548d3Szrj   top.t2 = t2;
3066*fae548d3Szrj   top.next = info->compare_list;
3067*fae548d3Szrj   info->compare_list = &top;
3068*fae548d3Szrj 
3069*fae548d3Szrj   switch (t1->kind)
3070*fae548d3Szrj     {
3071*fae548d3Szrj     default:
3072*fae548d3Szrj       abort ();
3073*fae548d3Szrj       ret = FALSE;
3074*fae548d3Szrj       break;
3075*fae548d3Szrj 
3076*fae548d3Szrj     case DEBUG_KIND_STRUCT:
3077*fae548d3Szrj     case DEBUG_KIND_UNION:
3078*fae548d3Szrj     case DEBUG_KIND_CLASS:
3079*fae548d3Szrj     case DEBUG_KIND_UNION_CLASS:
3080*fae548d3Szrj       if (t1->u.kclass == NULL)
3081*fae548d3Szrj 	ret = t2->u.kclass == NULL;
3082*fae548d3Szrj       else if (t2->u.kclass == NULL)
3083*fae548d3Szrj 	ret = FALSE;
3084*fae548d3Szrj       else if (t1->u.kclass->id > info->base_id
3085*fae548d3Szrj 	       && t1->u.kclass->id == t2->u.kclass->id)
3086*fae548d3Szrj 	ret = TRUE;
3087*fae548d3Szrj       else
3088*fae548d3Szrj 	ret = debug_class_type_samep (info, t1, t2);
3089*fae548d3Szrj       break;
3090*fae548d3Szrj 
3091*fae548d3Szrj     case DEBUG_KIND_ENUM:
3092*fae548d3Szrj       if (t1->u.kenum == NULL)
3093*fae548d3Szrj 	ret = t2->u.kenum == NULL;
3094*fae548d3Szrj       else if (t2->u.kenum == NULL)
3095*fae548d3Szrj 	ret = FALSE;
3096*fae548d3Szrj       else
3097*fae548d3Szrj 	{
3098*fae548d3Szrj 	  const char **pn1, **pn2;
3099*fae548d3Szrj 	  bfd_signed_vma *pv1, *pv2;
3100*fae548d3Szrj 
3101*fae548d3Szrj 	  pn1 = t1->u.kenum->names;
3102*fae548d3Szrj 	  pn2 = t2->u.kenum->names;
3103*fae548d3Szrj 	  pv1 = t1->u.kenum->values;
3104*fae548d3Szrj 	  pv2 = t2->u.kenum->values;
3105*fae548d3Szrj 	  while (*pn1 != NULL && *pn2 != NULL)
3106*fae548d3Szrj 	    {
3107*fae548d3Szrj 	      if (**pn1 != **pn2
3108*fae548d3Szrj 		  || *pv1 != *pv2
3109*fae548d3Szrj 		  || strcmp (*pn1, *pn2) != 0)
3110*fae548d3Szrj 		break;
3111*fae548d3Szrj 	      ++pn1;
3112*fae548d3Szrj 	      ++pn2;
3113*fae548d3Szrj 	      ++pv1;
3114*fae548d3Szrj 	      ++pv2;
3115*fae548d3Szrj 	    }
3116*fae548d3Szrj 	  ret = *pn1 == NULL && *pn2 == NULL;
3117*fae548d3Szrj 	}
3118*fae548d3Szrj       break;
3119*fae548d3Szrj 
3120*fae548d3Szrj     case DEBUG_KIND_POINTER:
3121*fae548d3Szrj       ret = debug_type_samep (info, t1->u.kpointer, t2->u.kpointer);
3122*fae548d3Szrj       break;
3123*fae548d3Szrj 
3124*fae548d3Szrj     case DEBUG_KIND_FUNCTION:
3125*fae548d3Szrj       if (t1->u.kfunction->varargs != t2->u.kfunction->varargs
3126*fae548d3Szrj 	  || ! debug_type_samep (info, t1->u.kfunction->return_type,
3127*fae548d3Szrj 				 t2->u.kfunction->return_type)
3128*fae548d3Szrj 	  || ((t1->u.kfunction->arg_types == NULL)
3129*fae548d3Szrj 	      != (t2->u.kfunction->arg_types == NULL)))
3130*fae548d3Szrj 	ret = FALSE;
3131*fae548d3Szrj       else if (t1->u.kfunction->arg_types == NULL)
3132*fae548d3Szrj 	ret = TRUE;
3133*fae548d3Szrj       else
3134*fae548d3Szrj 	{
3135*fae548d3Szrj 	  struct debug_type_s **a1, **a2;
3136*fae548d3Szrj 
3137*fae548d3Szrj 	  a1 = t1->u.kfunction->arg_types;
3138*fae548d3Szrj 	  a2 = t2->u.kfunction->arg_types;
3139*fae548d3Szrj 	  while (*a1 != NULL && *a2 != NULL)
3140*fae548d3Szrj 	    {
3141*fae548d3Szrj 	      if (! debug_type_samep (info, *a1, *a2))
3142*fae548d3Szrj 		break;
3143*fae548d3Szrj 	      ++a1;
3144*fae548d3Szrj 	      ++a2;
3145*fae548d3Szrj 	    }
3146*fae548d3Szrj 	  ret = *a1 == NULL && *a2 == NULL;
3147*fae548d3Szrj 	}
3148*fae548d3Szrj       break;
3149*fae548d3Szrj 
3150*fae548d3Szrj     case DEBUG_KIND_REFERENCE:
3151*fae548d3Szrj       ret = debug_type_samep (info, t1->u.kreference, t2->u.kreference);
3152*fae548d3Szrj       break;
3153*fae548d3Szrj 
3154*fae548d3Szrj     case DEBUG_KIND_RANGE:
3155*fae548d3Szrj       ret = (t1->u.krange->lower == t2->u.krange->lower
3156*fae548d3Szrj 	     && t1->u.krange->upper == t2->u.krange->upper
3157*fae548d3Szrj 	     && debug_type_samep (info, t1->u.krange->type,
3158*fae548d3Szrj 				  t2->u.krange->type));
3159*fae548d3Szrj       break;
3160*fae548d3Szrj 
3161*fae548d3Szrj     case DEBUG_KIND_ARRAY:
3162*fae548d3Szrj       ret = (t1->u.karray->lower == t2->u.karray->lower
3163*fae548d3Szrj 	     && t1->u.karray->upper == t2->u.karray->upper
3164*fae548d3Szrj 	     && t1->u.karray->stringp == t2->u.karray->stringp
3165*fae548d3Szrj 	     && debug_type_samep (info, t1->u.karray->element_type,
3166*fae548d3Szrj 				  t2->u.karray->element_type));
3167*fae548d3Szrj       break;
3168*fae548d3Szrj 
3169*fae548d3Szrj     case DEBUG_KIND_SET:
3170*fae548d3Szrj       ret = (t1->u.kset->bitstringp == t2->u.kset->bitstringp
3171*fae548d3Szrj 	     && debug_type_samep (info, t1->u.kset->type, t2->u.kset->type));
3172*fae548d3Szrj       break;
3173*fae548d3Szrj 
3174*fae548d3Szrj     case DEBUG_KIND_OFFSET:
3175*fae548d3Szrj       ret = (debug_type_samep (info, t1->u.koffset->base_type,
3176*fae548d3Szrj 			       t2->u.koffset->base_type)
3177*fae548d3Szrj 	     && debug_type_samep (info, t1->u.koffset->target_type,
3178*fae548d3Szrj 				  t2->u.koffset->target_type));
3179*fae548d3Szrj       break;
3180*fae548d3Szrj 
3181*fae548d3Szrj     case DEBUG_KIND_METHOD:
3182*fae548d3Szrj       if (t1->u.kmethod->varargs != t2->u.kmethod->varargs
3183*fae548d3Szrj 	  || ! debug_type_samep (info, t1->u.kmethod->return_type,
3184*fae548d3Szrj 				 t2->u.kmethod->return_type)
3185*fae548d3Szrj 	  || ! debug_type_samep (info, t1->u.kmethod->domain_type,
3186*fae548d3Szrj 				 t2->u.kmethod->domain_type)
3187*fae548d3Szrj 	  || ((t1->u.kmethod->arg_types == NULL)
3188*fae548d3Szrj 	      != (t2->u.kmethod->arg_types == NULL)))
3189*fae548d3Szrj 	ret = FALSE;
3190*fae548d3Szrj       else if (t1->u.kmethod->arg_types == NULL)
3191*fae548d3Szrj 	ret = TRUE;
3192*fae548d3Szrj       else
3193*fae548d3Szrj 	{
3194*fae548d3Szrj 	  struct debug_type_s **a1, **a2;
3195*fae548d3Szrj 
3196*fae548d3Szrj 	  a1 = t1->u.kmethod->arg_types;
3197*fae548d3Szrj 	  a2 = t2->u.kmethod->arg_types;
3198*fae548d3Szrj 	  while (*a1 != NULL && *a2 != NULL)
3199*fae548d3Szrj 	    {
3200*fae548d3Szrj 	      if (! debug_type_samep (info, *a1, *a2))
3201*fae548d3Szrj 		break;
3202*fae548d3Szrj 	      ++a1;
3203*fae548d3Szrj 	      ++a2;
3204*fae548d3Szrj 	    }
3205*fae548d3Szrj 	  ret = *a1 == NULL && *a2 == NULL;
3206*fae548d3Szrj 	}
3207*fae548d3Szrj       break;
3208*fae548d3Szrj 
3209*fae548d3Szrj     case DEBUG_KIND_CONST:
3210*fae548d3Szrj       ret = debug_type_samep (info, t1->u.kconst, t2->u.kconst);
3211*fae548d3Szrj       break;
3212*fae548d3Szrj 
3213*fae548d3Szrj     case DEBUG_KIND_VOLATILE:
3214*fae548d3Szrj       ret = debug_type_samep (info, t1->u.kvolatile, t2->u.kvolatile);
3215*fae548d3Szrj       break;
3216*fae548d3Szrj 
3217*fae548d3Szrj     case DEBUG_KIND_NAMED:
3218*fae548d3Szrj     case DEBUG_KIND_TAGGED:
3219*fae548d3Szrj       ret = (strcmp (t1->u.knamed->name->name, t2->u.knamed->name->name) == 0
3220*fae548d3Szrj 	     && debug_type_samep (info, t1->u.knamed->type,
3221*fae548d3Szrj 				  t2->u.knamed->type));
3222*fae548d3Szrj       break;
3223*fae548d3Szrj     }
3224*fae548d3Szrj 
3225*fae548d3Szrj   info->compare_list = top.next;
3226*fae548d3Szrj 
3227*fae548d3Szrj   return ret;
3228*fae548d3Szrj }
3229*fae548d3Szrj 
3230*fae548d3Szrj /* See if two classes are the same.  This is a subroutine of
3231*fae548d3Szrj    debug_type_samep.  */
3232*fae548d3Szrj 
3233*fae548d3Szrj static bfd_boolean
debug_class_type_samep(struct debug_handle * info,struct debug_type_s * t1,struct debug_type_s * t2)3234*fae548d3Szrj debug_class_type_samep (struct debug_handle *info, struct debug_type_s *t1,
3235*fae548d3Szrj 			struct debug_type_s *t2)
3236*fae548d3Szrj {
3237*fae548d3Szrj   struct debug_class_type *c1, *c2;
3238*fae548d3Szrj 
3239*fae548d3Szrj   c1 = t1->u.kclass;
3240*fae548d3Szrj   c2 = t2->u.kclass;
3241*fae548d3Szrj 
3242*fae548d3Szrj   if ((c1->fields == NULL) != (c2->fields == NULL)
3243*fae548d3Szrj       || (c1->baseclasses == NULL) != (c2->baseclasses == NULL)
3244*fae548d3Szrj       || (c1->methods == NULL) != (c2->methods == NULL)
3245*fae548d3Szrj       || (c1->vptrbase == NULL) != (c2->vptrbase == NULL))
3246*fae548d3Szrj     return FALSE;
3247*fae548d3Szrj 
3248*fae548d3Szrj   if (c1->fields != NULL)
3249*fae548d3Szrj     {
3250*fae548d3Szrj       struct debug_field_s **pf1, **pf2;
3251*fae548d3Szrj 
3252*fae548d3Szrj       for (pf1 = c1->fields, pf2 = c2->fields;
3253*fae548d3Szrj 	   *pf1 != NULL && *pf2 != NULL;
3254*fae548d3Szrj 	   pf1++, pf2++)
3255*fae548d3Szrj 	{
3256*fae548d3Szrj 	  struct debug_field_s *f1, *f2;
3257*fae548d3Szrj 
3258*fae548d3Szrj 	  f1 = *pf1;
3259*fae548d3Szrj 	  f2 = *pf2;
3260*fae548d3Szrj 	  if (f1->name[0] != f2->name[0]
3261*fae548d3Szrj 	      || f1->visibility != f2->visibility
3262*fae548d3Szrj 	      || f1->static_member != f2->static_member)
3263*fae548d3Szrj 	    return FALSE;
3264*fae548d3Szrj 	  if (f1->static_member)
3265*fae548d3Szrj 	    {
3266*fae548d3Szrj 	      if (strcmp (f1->u.s.physname, f2->u.s.physname) != 0)
3267*fae548d3Szrj 		return FALSE;
3268*fae548d3Szrj 	    }
3269*fae548d3Szrj 	  else
3270*fae548d3Szrj 	    {
3271*fae548d3Szrj 	      if (f1->u.f.bitpos != f2->u.f.bitpos
3272*fae548d3Szrj 		  || f1->u.f.bitsize != f2->u.f.bitsize)
3273*fae548d3Szrj 		return FALSE;
3274*fae548d3Szrj 	    }
3275*fae548d3Szrj 	  /* We do the checks which require function calls last.  We
3276*fae548d3Szrj              don't require that the types of fields have the same
3277*fae548d3Szrj              names, since that sometimes fails in the presence of
3278*fae548d3Szrj              typedefs and we really don't care.  */
3279*fae548d3Szrj 	  if (strcmp (f1->name, f2->name) != 0
3280*fae548d3Szrj 	      || ! debug_type_samep (info,
3281*fae548d3Szrj 				     debug_get_real_type ((void *) info,
3282*fae548d3Szrj 							  f1->type, NULL),
3283*fae548d3Szrj 				     debug_get_real_type ((void *) info,
3284*fae548d3Szrj 							  f2->type, NULL)))
3285*fae548d3Szrj 	    return FALSE;
3286*fae548d3Szrj 	}
3287*fae548d3Szrj       if (*pf1 != NULL || *pf2 != NULL)
3288*fae548d3Szrj 	return FALSE;
3289*fae548d3Szrj     }
3290*fae548d3Szrj 
3291*fae548d3Szrj   if (c1->vptrbase != NULL)
3292*fae548d3Szrj     {
3293*fae548d3Szrj       if (! debug_type_samep (info, c1->vptrbase, c2->vptrbase))
3294*fae548d3Szrj 	return FALSE;
3295*fae548d3Szrj     }
3296*fae548d3Szrj 
3297*fae548d3Szrj   if (c1->baseclasses != NULL)
3298*fae548d3Szrj     {
3299*fae548d3Szrj       struct debug_baseclass_s **pb1, **pb2;
3300*fae548d3Szrj 
3301*fae548d3Szrj       for (pb1 = c1->baseclasses, pb2 = c2->baseclasses;
3302*fae548d3Szrj 	   *pb1 != NULL && *pb2 != NULL;
3303*fae548d3Szrj 	   ++pb1, ++pb2)
3304*fae548d3Szrj 	{
3305*fae548d3Szrj 	  struct debug_baseclass_s *b1, *b2;
3306*fae548d3Szrj 
3307*fae548d3Szrj 	  b1 = *pb1;
3308*fae548d3Szrj 	  b2 = *pb2;
3309*fae548d3Szrj 	  if (b1->bitpos != b2->bitpos
3310*fae548d3Szrj 	      || b1->is_virtual != b2->is_virtual
3311*fae548d3Szrj 	      || b1->visibility != b2->visibility
3312*fae548d3Szrj 	      || ! debug_type_samep (info, b1->type, b2->type))
3313*fae548d3Szrj 	    return FALSE;
3314*fae548d3Szrj 	}
3315*fae548d3Szrj       if (*pb1 != NULL || *pb2 != NULL)
3316*fae548d3Szrj 	return FALSE;
3317*fae548d3Szrj     }
3318*fae548d3Szrj 
3319*fae548d3Szrj   if (c1->methods != NULL)
3320*fae548d3Szrj     {
3321*fae548d3Szrj       struct debug_method_s **pm1, **pm2;
3322*fae548d3Szrj 
3323*fae548d3Szrj       for (pm1 = c1->methods, pm2 = c2->methods;
3324*fae548d3Szrj 	   *pm1 != NULL && *pm2 != NULL;
3325*fae548d3Szrj 	   ++pm1, ++pm2)
3326*fae548d3Szrj 	{
3327*fae548d3Szrj 	  struct debug_method_s *m1, *m2;
3328*fae548d3Szrj 
3329*fae548d3Szrj 	  m1 = *pm1;
3330*fae548d3Szrj 	  m2 = *pm2;
3331*fae548d3Szrj 	  if (m1->name[0] != m2->name[0]
3332*fae548d3Szrj 	      || strcmp (m1->name, m2->name) != 0
3333*fae548d3Szrj 	      || (m1->variants == NULL) != (m2->variants == NULL))
3334*fae548d3Szrj 	    return FALSE;
3335*fae548d3Szrj 	  if (m1->variants == NULL)
3336*fae548d3Szrj 	    {
3337*fae548d3Szrj 	      struct debug_method_variant_s **pv1, **pv2;
3338*fae548d3Szrj 
3339*fae548d3Szrj 	      for (pv1 = m1->variants, pv2 = m2->variants;
3340*fae548d3Szrj 		   *pv1 != NULL && *pv2 != NULL;
3341*fae548d3Szrj 		   ++pv1, ++pv2)
3342*fae548d3Szrj 		{
3343*fae548d3Szrj 		  struct debug_method_variant_s *v1, *v2;
3344*fae548d3Szrj 
3345*fae548d3Szrj 		  v1 = *pv1;
3346*fae548d3Szrj 		  v2 = *pv2;
3347*fae548d3Szrj 		  if (v1->physname[0] != v2->physname[0]
3348*fae548d3Szrj 		      || v1->visibility != v2->visibility
3349*fae548d3Szrj 		      || v1->constp != v2->constp
3350*fae548d3Szrj 		      || v1->volatilep != v2->volatilep
3351*fae548d3Szrj 		      || v1->voffset != v2->voffset
3352*fae548d3Szrj 		      || (v1->context == NULL) != (v2->context == NULL)
3353*fae548d3Szrj 		      || strcmp (v1->physname, v2->physname) != 0
3354*fae548d3Szrj 		      || ! debug_type_samep (info, v1->type, v2->type))
3355*fae548d3Szrj 		    return FALSE;
3356*fae548d3Szrj 		  if (v1->context != NULL)
3357*fae548d3Szrj 		    {
3358*fae548d3Szrj 		      if (! debug_type_samep (info, v1->context,
3359*fae548d3Szrj 					      v2->context))
3360*fae548d3Szrj 			return FALSE;
3361*fae548d3Szrj 		    }
3362*fae548d3Szrj 		}
3363*fae548d3Szrj 	      if (*pv1 != NULL || *pv2 != NULL)
3364*fae548d3Szrj 		return FALSE;
3365*fae548d3Szrj 	    }
3366*fae548d3Szrj 	}
3367*fae548d3Szrj       if (*pm1 != NULL || *pm2 != NULL)
3368*fae548d3Szrj 	return FALSE;
3369*fae548d3Szrj     }
3370*fae548d3Szrj 
3371*fae548d3Szrj   return TRUE;
3372*fae548d3Szrj }
3373