X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=binutils%2Fieee.c;h=34b937342e0ee4b8d6ee8dd1c2d0daf9af90ddcb;hb=3d540e936bbc1b6971acd7bbb623b92a704f537e;hp=73f87c41c982aa06d394b3b481da0aaa8ea85e08;hpb=50c2245bd8d8b406e46e3888df92f2443f76a94f;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/ieee.c b/binutils/ieee.c index 73f87c41c9..34b937342e 100644 --- a/binutils/ieee.c +++ b/binutils/ieee.c @@ -1,12 +1,13 @@ /* ieee.c -- Read and write IEEE-695 debugging information. - Copyright 1996, 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, + 2008, 2009, 2010 Free Software Foundation, Inc. Written by Ian Lance Taylor . This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,17 +17,15 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ /* This file reads and writes IEEE-695 debugging information. */ -#include +#include "sysdep.h" #include - #include "bfd.h" #include "ieee.h" -#include "bucomm.h" #include "libiberty.h" #include "debug.h" #include "budbg.h" @@ -60,6 +59,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. */ @@ -71,15 +80,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. */ @@ -1070,6 +1071,16 @@ parse_ieee_bb (struct ieee_info *info, const bfd_byte **pp) break; } + if (! info->saw_filename) + { + namcopy = savestring (name, namlen); + if (namcopy == NULL) + return FALSE; + if (! debug_set_filename (info->dhandle, namcopy)) + return FALSE; + info->saw_filename = TRUE; + } + namcopy = savestring (name, namlen); if (namcopy == NULL) return FALSE; @@ -1234,7 +1245,7 @@ parse_ieee_be (struct ieee_info *info, const bfd_byte **pp) switch (info->blockstack.bsp->kind) { case 2: - /* When we end the global typedefs block, we copy out the the + /* When we end the global typedefs block, we copy out the contents of info->vars. This is because the variable indices may be reused in the local blocks. However, we need to preserve them so that we can locate a function returning a @@ -1787,6 +1798,7 @@ parse_ieee_ty (struct ieee_info *info, const bfd_byte **pp) break; case 'V': + case 'v': /* Void. This is not documented, but the MRI compiler emits it. */ type = debug_make_void_type (dhandle); break; @@ -2490,7 +2502,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; @@ -2498,7 +2510,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; @@ -2523,7 +2535,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; @@ -2548,7 +2560,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; @@ -2604,7 +2616,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; @@ -2616,7 +2628,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; @@ -2638,7 +2650,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); @@ -3101,7 +3113,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; @@ -3109,7 +3121,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; @@ -3126,7 +3138,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); @@ -3170,7 +3182,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, @@ -3293,7 +3305,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; @@ -3307,7 +3319,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; } @@ -3397,8 +3409,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) @@ -4593,8 +4605,10 @@ write_ieee_debugging_info (bfd *abfd, void *dhandle) info.type_indx = 256; info.name_indx = 32; - if (! bfd_hash_table_init (&info.typedefs.root, ieee_name_type_newfunc) - || ! bfd_hash_table_init (&info.tags.root, ieee_name_type_newfunc)) + if (!bfd_hash_table_init (&info.typedefs.root, ieee_name_type_newfunc, + sizeof (struct ieee_name_type_hash_entry)) + || !bfd_hash_table_init (&info.tags.root, ieee_name_type_newfunc, + sizeof (struct ieee_name_type_hash_entry))) return FALSE; if (! ieee_init_buffer (&info, &info.global_types) @@ -4675,14 +4689,10 @@ write_ieee_debugging_info (bfd *abfd, void *dhandle) return TRUE; } err = NULL; - s = bfd_make_section (abfd, ".debug"); + s = bfd_make_section_with_flags (abfd, ".debug", + SEC_DEBUGGING | SEC_HAS_CONTENTS); if (s == NULL) err = "bfd_make_section"; - if (err == NULL) - { - if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS)) - err = "bfd_set_section_flags"; - } if (err == NULL) { bfd_size_type size; @@ -4814,7 +4824,6 @@ ieee_start_compilation_unit (void *p, const char *filename) const char *backslash; #endif char *c, *s; - unsigned int nindx; if (info->filename != NULL) { @@ -4862,7 +4871,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) @@ -5443,7 +5451,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; @@ -5501,7 +5509,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; @@ -5678,12 +5686,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 @@ -5970,8 +5972,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++ @@ -6191,7 +6191,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; @@ -6217,7 +6217,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); @@ -6285,7 +6285,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 @@ -6315,18 +6315,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;