X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=inline;f=binutils%2Fieee.c;h=4cf2b1d7121a3f47265157cfb14626d40bbbe97b;hb=128e85e3ab36b8e30f6612fb50de3cbb4ede6824;hp=3763a8eed17208f88f5f2fc5ca88b5883ab9bcdf;hpb=220df88bffbd9b2acf1d86a744ffae70c9fff248;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/ieee.c b/binutils/ieee.c index 3763a8eed1..4cf2b1d712 100644 --- a/binutils/ieee.c +++ b/binutils/ieee.c @@ -1,6 +1,5 @@ /* ieee.c -- Read and write IEEE-695 debugging information. - Copyright 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2006, 2007, - 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 1996-2016 Free Software Foundation, Inc. Written by Ian Lance Taylor . This file is part of GNU Binutils. @@ -59,6 +58,16 @@ struct ieee_blockstack /* This structure holds information for a variable. */ +enum ieee_var_kind + { + IEEE_UNKNOWN, + IEEE_EXTERNAL, + IEEE_GLOBAL, + IEEE_STATIC, + IEEE_LOCAL, + IEEE_FUNCTION + }; + struct ieee_var { /* Start of name. */ @@ -70,15 +79,7 @@ struct ieee_var /* Slot if we make an indirect type. */ debug_type *pslot; /* Kind of variable or function. */ - enum - { - IEEE_UNKNOWN, - IEEE_EXTERNAL, - IEEE_GLOBAL, - IEEE_STATIC, - IEEE_LOCAL, - IEEE_FUNCTION - } kind; + enum ieee_var_kind kind; }; /* This structure holds all the variables. */ @@ -2500,7 +2501,7 @@ ieee_read_cxx_misc (struct ieee_info *info, const bfd_byte **pp, case 'z': { - const char *name, *mangled, *class; + const char *name, *mangled, *cxx_class; unsigned long namlen, mangledlen, classlen; bfd_vma control; @@ -2508,7 +2509,7 @@ ieee_read_cxx_misc (struct ieee_info *info, const bfd_byte **pp, if (! ieee_require_atn65 (info, pp, &name, &namlen) || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen) - || ! ieee_require_atn65 (info, pp, &class, &classlen) + || ! ieee_require_atn65 (info, pp, &cxx_class, &classlen) || ! ieee_require_asn (info, pp, &control)) return FALSE; @@ -2533,7 +2534,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp, unsigned long count) { const bfd_byte *start; - bfd_vma class; + bfd_vma cxx_class; const char *tag; unsigned long taglen; struct ieee_tag *it; @@ -2558,7 +2559,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp, start = *pp; - if (! ieee_require_asn (info, pp, &class)) + if (! ieee_require_asn (info, pp, &cxx_class)) return FALSE; --count; @@ -2614,7 +2615,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp, case 'b': { bfd_vma flags, cinline; - const char *basename, *fieldname; + const char *base, *fieldname; unsigned long baselen, fieldlen; char *basecopy; debug_type basetype; @@ -2626,7 +2627,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp, /* This represents a base or friend class. */ if (! ieee_require_asn (info, pp, &flags) - || ! ieee_require_atn65 (info, pp, &basename, &baselen) + || ! ieee_require_atn65 (info, pp, &base, &baselen) || ! ieee_require_asn (info, pp, &cinline) || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen)) return FALSE; @@ -2648,7 +2649,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp, return FALSE; } - basecopy = savestring (basename, baselen); + basecopy = savestring (base, baselen); basetype = debug_find_tagged_type (dhandle, basecopy, DEBUG_KIND_ILLEGAL); free (basecopy); @@ -2953,7 +2954,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp, { debug_type return_type; const debug_type *arg_types; - bfd_boolean varargs; + bfd_boolean varargs = FALSE; if (debug_get_type_kind (dhandle, pv->type) != DEBUG_KIND_FUNCTION) @@ -3111,7 +3112,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp, case 'z': { - const char *vname, *basename; + const char *vname, *base; unsigned long vnamelen, baselen; bfd_vma vsize, control; @@ -3119,7 +3120,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp, if (! ieee_require_atn65 (info, pp, &vname, &vnamelen) || ! ieee_require_asn (info, pp, &vsize) - || ! ieee_require_atn65 (info, pp, &basename, &baselen) + || ! ieee_require_atn65 (info, pp, &base, &baselen) || ! ieee_require_asn (info, pp, &control)) return FALSE; count -= 4; @@ -3136,7 +3137,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp, { char *basecopy; - basecopy = savestring (basename, baselen); + basecopy = savestring (base, baselen); vptrbase = debug_find_tagged_type (dhandle, basecopy, DEBUG_KIND_ILLEGAL); free (basecopy); @@ -3180,7 +3181,7 @@ ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp, it->slot. We update it->slot to automatically update all references to this struct. */ it->slot = debug_make_object_type (dhandle, - class != 'u', + cxx_class != 'u', debug_get_type_size (dhandle, it->slot), fields, baseclasses, dmethods, @@ -3303,7 +3304,7 @@ ieee_read_reference (struct ieee_info *info, const bfd_byte **pp) { const bfd_byte *start; bfd_vma flags; - const char *class, *name; + const char *cxx_class, *name; unsigned long classlen, namlen; debug_type *pslot; debug_type target; @@ -3317,7 +3318,7 @@ ieee_read_reference (struct ieee_info *info, const bfd_byte **pp) the spec. */ if (flags == 3) { - if (! ieee_require_atn65 (info, pp, &class, &classlen)) + if (! ieee_require_atn65 (info, pp, &cxx_class, &classlen)) return FALSE; } @@ -3407,8 +3408,8 @@ ieee_read_reference (struct ieee_info *info, const bfd_byte **pp) for (it = info->tags; it != NULL; it = it->next) { - if (it->name[0] == class[0] - && strncmp (it->name, class, classlen) == 0 + if (it->name[0] == cxx_class[0] + && strncmp (it->name, cxx_class, classlen) == 0 && strlen (it->name) == classlen) { if (it->fslots != NULL) @@ -4822,7 +4823,6 @@ ieee_start_compilation_unit (void *p, const char *filename) const char *backslash; #endif char *c, *s; - unsigned int nindx; if (info->filename != NULL) { @@ -4870,7 +4870,6 @@ ieee_start_compilation_unit (void *p, const char *filename) || ! ieee_write_id (info, info->modname)) return FALSE; - nindx = info->name_indx; ++info->name_indx; if (! ieee_change_buffer (info, &info->vars) || ! ieee_write_byte (info, (int) ieee_bb_record_enum) @@ -4938,7 +4937,7 @@ ieee_finish_compilation_unit (struct ieee_handle *info) if (! ieee_change_buffer (info, &info->linenos) || ! ieee_write_byte (info, (int) ieee_be_record_enum)) return FALSE; - if (strcmp (info->filename, info->lineno_filename) != 0) + if (filename_cmp (info->filename, info->lineno_filename) != 0) { /* We were not in the main file. We just closed the included line number block, and now we must close the @@ -5125,7 +5124,10 @@ ieee_add_bb11 (struct ieee_handle *info, asection *sec, bfd_vma low, || ! ieee_write_id (info, "") || ! ieee_write_number (info, 0) || ! ieee_write_id (info, "GNU objcopy")) - return FALSE; + { + free (c); + return FALSE; + } free (c); } @@ -5451,7 +5453,7 @@ ieee_pointer_type (void *p) if (! localp) { - m = ieee_get_modified_info (p, indx); + m = ieee_get_modified_info ((struct ieee_handle *) p, indx); if (m == NULL) return FALSE; @@ -5509,7 +5511,7 @@ ieee_function_type (void *p, int argcount, bfd_boolean varargs) m = NULL; if (argcount < 0 && ! localp) { - m = ieee_get_modified_info (p, retindx); + m = ieee_get_modified_info ((struct ieee_handle *) p, retindx); if (m == NULL) return FALSE; @@ -5529,7 +5531,10 @@ ieee_function_type (void *p, int argcount, bfd_boolean varargs) || ! ieee_write_number (info, 0) || ! ieee_write_number (info, retindx) || ! ieee_write_number (info, (bfd_vma) argcount + (varargs ? 1 : 0))) - return FALSE; + { + free (args); + return FALSE; + } if (argcount > 0) { for (i = 0; i < argcount; i++) @@ -5686,12 +5691,6 @@ ieee_set_type (void *p, bfd_boolean bitstringp ATTRIBUTE_UNUSED) static bfd_boolean ieee_offset_type (void *p) { - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int targetindx, baseindx; - - targetindx = ieee_pop_type (info); - baseindx = ieee_pop_type (info); - /* FIXME: The MRI C++ compiler does not appear to generate any useful type information about an offset type. It just records a pointer to member as an integer. The MRI/HP IEEE spec does @@ -5978,8 +5977,6 @@ ieee_struct_field (void *p, const char *name, bfd_vma bitpos, bfd_vma bitsize, if (referencep) { - unsigned int nindx; - /* We need to output a record recording that this field is really of reference type. We put this on the refs field of classdef, so that it can be appended to the C++ @@ -6199,7 +6196,7 @@ ieee_class_static_member (void *p, const char *name, const char *physname, /* Add a base class to a class. */ static bfd_boolean -ieee_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual, +ieee_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean is_virtual, enum debug_visibility visibility) { struct ieee_handle *info = (struct ieee_handle *) p; @@ -6225,7 +6222,7 @@ ieee_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual, class. The stabs debugging reader will create a field named _vb$CLASS for a virtual base class, so we just use that. FIXME: we should not depend upon a detail of stabs debugging. */ - if (virtual) + if (is_virtual) { fname = (char *) xmalloc (strlen (bname) + sizeof "_vb$"); sprintf (fname, "_vb$%s", bname); @@ -6243,7 +6240,10 @@ ieee_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual, || ! ieee_write_id (info, fname) || ! ieee_write_number (info, bindx) || ! ieee_write_number (info, bitpos / 8)) - return FALSE; + { + free (fname); + return FALSE; + } flags = 0; } @@ -6258,7 +6258,10 @@ ieee_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual, || ! ieee_write_atn65 (info, nindx, bname) || ! ieee_write_asn (info, nindx, 0) || ! ieee_write_atn65 (info, nindx, fname)) - return FALSE; + { + free (fname); + return FALSE; + } info->type_stack->type.classdef->pmisccount += 5; free (fname); @@ -6293,7 +6296,7 @@ ieee_class_method_var (struct ieee_handle *info, const char *physname, { unsigned int flags; unsigned int nindx; - bfd_boolean virtual; + bfd_boolean is_virtual; /* We don't need the type of the method. An IEEE consumer which wants the type must track down the function by the physical name @@ -6323,18 +6326,18 @@ ieee_class_method_var (struct ieee_handle *info, const char *physname, nindx = info->type_stack->type.classdef->indx; - virtual = context || voffset > 0; + is_virtual = context || voffset > 0; if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf) - || ! ieee_write_asn (info, nindx, virtual ? 'v' : 'm') + || ! ieee_write_asn (info, nindx, is_virtual ? 'v' : 'm') || ! ieee_write_asn (info, nindx, flags) || ! ieee_write_atn65 (info, nindx, info->type_stack->type.classdef->method) || ! ieee_write_atn65 (info, nindx, physname)) return FALSE; - if (virtual) + if (is_virtual) { if (voffset > info->type_stack->type.classdef->voffset) info->type_stack->type.classdef->voffset = voffset; @@ -7347,15 +7350,17 @@ ieee_lineno (void *p, const char *filename, unsigned long lineno, bfd_vma addr) info->lineno_filename = info->filename; } - if (strcmp (info->pending_lineno_filename, info->lineno_filename) != 0) + if (filename_cmp (info->pending_lineno_filename, + info->lineno_filename) != 0) { - if (strcmp (info->filename, info->lineno_filename) != 0) + if (filename_cmp (info->filename, info->lineno_filename) != 0) { /* We were not in the main file. Close the block for the included file. */ if (! ieee_write_byte (info, (int) ieee_be_record_enum)) return FALSE; - if (strcmp (info->filename, info->pending_lineno_filename) == 0) + if (filename_cmp (info->filename, + info->pending_lineno_filename) == 0) { /* We need a new NN record, and we aren't about to output one. */ @@ -7367,7 +7372,8 @@ ieee_lineno (void *p, const char *filename, unsigned long lineno, bfd_vma addr) return FALSE; } } - if (strcmp (info->filename, info->pending_lineno_filename) != 0) + if (filename_cmp (info->filename, + info->pending_lineno_filename) != 0) { /* We are not changing to the main file. Open a block for the new included file. */