| OLD | NEW |
| 1 /* ELF strtab with GC and suffix merging support. | 1 /* ELF strtab with GC and suffix merging support. |
| 2 Copyright 2001, 2002, 2003, 2005, 2006, 2007, 2008 | 2 Copyright 2001, 2002, 2003, 2005, 2006, 2007, 2008 |
| 3 Free Software Foundation, Inc. | 3 Free Software Foundation, Inc. |
| 4 Written by Jakub Jelinek <jakub@redhat.com>. | 4 Written by Jakub Jelinek <jakub@redhat.com>. |
| 5 | 5 |
| 6 This file is part of BFD, the Binary File Descriptor library. | 6 This file is part of BFD, the Binary File Descriptor library. |
| 7 | 7 |
| 8 This program is free software; you can redistribute it and/or modify | 8 This program is free software; you can redistribute it and/or modify |
| 9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
| 10 the Free Software Foundation; either version 3 of the License, or | 10 the Free Software Foundation; either version 3 of the License, or |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 _bfd_elf_strtab_delref (struct elf_strtab_hash *tab, bfd_size_type idx) | 194 _bfd_elf_strtab_delref (struct elf_strtab_hash *tab, bfd_size_type idx) |
| 195 { | 195 { |
| 196 if (idx == 0 || idx == (bfd_size_type) -1) | 196 if (idx == 0 || idx == (bfd_size_type) -1) |
| 197 return; | 197 return; |
| 198 BFD_ASSERT (tab->sec_size == 0); | 198 BFD_ASSERT (tab->sec_size == 0); |
| 199 BFD_ASSERT (idx < tab->size); | 199 BFD_ASSERT (idx < tab->size); |
| 200 BFD_ASSERT (tab->array[idx]->refcount > 0); | 200 BFD_ASSERT (tab->array[idx]->refcount > 0); |
| 201 --tab->array[idx]->refcount; | 201 --tab->array[idx]->refcount; |
| 202 } | 202 } |
| 203 | 203 |
| 204 unsigned int |
| 205 _bfd_elf_strtab_refcount (struct elf_strtab_hash *tab, bfd_size_type idx) |
| 206 { |
| 207 return tab->array[idx]->refcount; |
| 208 } |
| 209 |
| 204 void | 210 void |
| 205 _bfd_elf_strtab_clear_all_refs (struct elf_strtab_hash *tab) | 211 _bfd_elf_strtab_clear_all_refs (struct elf_strtab_hash *tab) |
| 206 { | 212 { |
| 207 bfd_size_type idx; | 213 bfd_size_type idx; |
| 208 | 214 |
| 209 for (idx = 1; idx < tab->size; ++idx) | 215 for (idx = 1; idx < tab->size; idx++) |
| 210 tab->array[idx]->refcount = 0; | 216 tab->array[idx]->refcount = 0; |
| 211 } | 217 } |
| 212 | 218 |
| 219 /* Downsizes strtab. Entries from IDX up to the current size are |
| 220 removed from the array. */ |
| 221 void |
| 222 _bfd_elf_strtab_restore_size (struct elf_strtab_hash *tab, bfd_size_type idx) |
| 223 { |
| 224 bfd_size_type curr_size = tab->size; |
| 225 |
| 226 BFD_ASSERT (tab->sec_size == 0); |
| 227 BFD_ASSERT (idx <= curr_size); |
| 228 tab->size = idx; |
| 229 for (; idx < curr_size; ++idx) |
| 230 { |
| 231 /* We don't remove entries from the hash table, just set their |
| 232 REFCOUNT to zero. Setting LEN zero will result in the size |
| 233 growing if the entry is added again. See _bfd_elf_strtab_add. */ |
| 234 tab->array[idx]->refcount = 0; |
| 235 tab->array[idx]->len = 0; |
| 236 } |
| 237 } |
| 238 |
| 213 bfd_size_type | 239 bfd_size_type |
| 214 _bfd_elf_strtab_size (struct elf_strtab_hash *tab) | 240 _bfd_elf_strtab_size (struct elf_strtab_hash *tab) |
| 215 { | 241 { |
| 216 return tab->sec_size ? tab->sec_size : tab->size; | 242 return tab->sec_size ? tab->sec_size : tab->size; |
| 217 } | 243 } |
| 218 | 244 |
| 219 bfd_size_type | 245 bfd_size_type |
| 220 _bfd_elf_strtab_offset (struct elf_strtab_hash *tab, bfd_size_type idx) | 246 _bfd_elf_strtab_offset (struct elf_strtab_hash *tab, bfd_size_type idx) |
| 221 { | 247 { |
| 222 struct elf_strtab_hash_entry *entry; | 248 struct elf_strtab_hash_entry *entry; |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 tab->sec_size = size; | 412 tab->sec_size = size; |
| 387 | 413 |
| 388 /* Adjust the rest. */ | 414 /* Adjust the rest. */ |
| 389 for (i = 1; i < tab->size; ++i) | 415 for (i = 1; i < tab->size; ++i) |
| 390 { | 416 { |
| 391 e = tab->array[i]; | 417 e = tab->array[i]; |
| 392 if (e->refcount && e->len < 0) | 418 if (e->refcount && e->len < 0) |
| 393 e->u.index = e->u.suffix->u.index + (e->u.suffix->len + e->len); | 419 e->u.index = e->u.suffix->u.index + (e->u.suffix->len + e->len); |
| 394 } | 420 } |
| 395 } | 421 } |
| OLD | NEW |