aboutsummaryrefslogtreecommitdiff
path: root/bfd/cofflink.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1996-02-26 19:01:53 +0000
committerIan Lance Taylor <ian@airs.com>1996-02-26 19:01:53 +0000
commitbdec62283abf7a0444d8ff217ac6539007d19f3d (patch)
treed5e014efe5adf3e8f51edb55b3633703a96c2cfc /bfd/cofflink.c
parent110b814dbaff397a671fef550ef432a0e0921623 (diff)
downloadgdb-bdec62283abf7a0444d8ff217ac6539007d19f3d.zip
gdb-bdec62283abf7a0444d8ff217ac6539007d19f3d.tar.gz
gdb-bdec62283abf7a0444d8ff217ac6539007d19f3d.tar.bz2
* cofflink.c (_bfd_coff_link_input_bfd): Don't try to optimize a
struct/union/enum type with no elements. PR 9024.
Diffstat (limited to 'bfd/cofflink.c')
-rw-r--r--bfd/cofflink.c73
1 files changed, 40 insertions, 33 deletions
diff --git a/bfd/cofflink.c b/bfd/cofflink.c
index 999a81e..92b19e2 100644
--- a/bfd/cofflink.c
+++ b/bfd/cofflink.c
@@ -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;
-
- if (mtl->class != mt->class)
- continue;
+ struct coff_debug_merge_type *mtl;
- 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;
+ }
}
}