* cofflink.c (_bfd_coff_link_input_bfd): Don't try to optimize a

struct/union/enum type with no elements.
PR 9024.
This commit is contained in:
Ian Lance Taylor 1996-02-26 19:01:53 +00:00
parent 110b814dba
commit bdec62283a
2 changed files with 45 additions and 33 deletions

View File

@ -1,3 +1,8 @@
Mon Feb 26 14:01:13 1996 Ian Lance Taylor <ian@cygnus.com>
* cofflink.c (_bfd_coff_link_input_bfd): Don't try to optimize a
struct/union/enum type with no elements.
Sat Feb 24 11:38:58 1996 Ian Lance Taylor <ian@cygnus.com>
* bfd.c (bfd_errmsg): Handle a NULL return from strerror.

View File

@ -1,5 +1,5 @@
/* COFF specific linker code.
Copyright 1994, 1995 Free Software Foundation, Inc.
Copyright 1994, 1995, 1996 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
@ -365,7 +365,7 @@ coff_link_add_symbols (abfd, info)
value -= section->vma;
}
if (! (_bfd_generic_link_add_one_symbol
if (! (bfd_coff_link_add_one_symbol
(info, abfd, name, flags, section, value,
(const char *) NULL, copy, false,
(struct bfd_link_hash_entry **) sym_hash)))
@ -1189,7 +1189,6 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
struct coff_debug_merge_element **epp;
bfd_byte *esl, *eslend;
struct internal_syment *islp;
struct coff_debug_merge_type *mtl;
name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
if (name == NULL)
@ -1293,42 +1292,50 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
}
/* See if we already have a definition which matches this
type. */
for (mtl = mh->types; mtl != NULL; mtl = mtl->next)
type. We always output the type if it has no elements,
for simplicity. */
if (mt->elements == NULL)
bfd_release (input_bfd, (PTR) mt);
else
{
struct coff_debug_merge_element *me, *mel;
struct coff_debug_merge_type *mtl;
if (mtl->class != mt->class)
continue;
for (me = mt->elements, mel = mtl->elements;
me != NULL && mel != NULL;
me = me->next, mel = mel->next)
for (mtl = mh->types; mtl != NULL; mtl = mtl->next)
{
if (strcmp (me->name, mel->name) != 0
|| me->type != mel->type
|| me->tagndx != mel->tagndx)
struct coff_debug_merge_element *me, *mel;
if (mtl->class != mt->class)
continue;
for (me = mt->elements, mel = mtl->elements;
me != NULL && mel != NULL;
me = me->next, mel = mel->next)
{
if (strcmp (me->name, mel->name) != 0
|| me->type != mel->type
|| me->tagndx != mel->tagndx)
break;
}
if (me == NULL && mel == NULL)
break;
}
if (me == NULL && mel == NULL)
break;
}
if (mtl == NULL || (bfd_size_type) mtl->indx >= syment_base)
{
/* This is the first definition of this type. */
mt->indx = output_index;
mt->next = mh->types;
mh->types = mt;
}
else
{
/* This is a redefinition which can be merged. */
bfd_release (input_bfd, (PTR) mt);
*indexp = mtl->indx;
add = (eslend - esym) / isymesz;
skip = true;
if (mtl == NULL || (bfd_size_type) mtl->indx >= syment_base)
{
/* This is the first definition of this type. */
mt->indx = output_index;
mt->next = mh->types;
mh->types = mt;
}
else
{
/* This is a redefinition which can be merged. */
bfd_release (input_bfd, (PTR) mt);
*indexp = mtl->indx;
add = (eslend - esym) / isymesz;
skip = true;
}
}
}