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