diff options
author | Ian Lance Taylor <ian@airs.com> | 1996-02-26 19:01:53 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1996-02-26 19:01:53 +0000 |
commit | bdec62283abf7a0444d8ff217ac6539007d19f3d (patch) | |
tree | d5e014efe5adf3e8f51edb55b3633703a96c2cfc /bfd/cofflink.c | |
parent | 110b814dbaff397a671fef550ef432a0e0921623 (diff) | |
download | gdb-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.c | 73 |
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; + } } } |