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 = ⊤
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