+ {
+ /* This section of code collects all our local symbols, sorts
+ them by value, and looks for multiple symbols referring to
+ the same address. For those symbols, the flags are merged.
+ At this point, the only flag that can be set is
+ MN10300_CONVERT_CALL_TO_CALLS, so we simply OR the flags
+ together. */
+ int static_count = 0, i;
+ struct elf32_mn10300_link_hash_entry **entries;
+ struct elf32_mn10300_link_hash_entry **ptr;
+
+ elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
+ elf32_mn10300_count_hash_table_entries,
+ &static_count);
+
+ entries = (struct elf32_mn10300_link_hash_entry **)
+ bfd_malloc (static_count * sizeof (struct elf32_mn10300_link_hash_entry *));
+
+ ptr = entries;
+ elf32_mn10300_link_hash_traverse (hash_table->static_hash_table,
+ elf32_mn10300_list_hash_table_entries,
+ &ptr);
+
+ qsort (entries, static_count, sizeof(entries[0]), sort_by_value);
+
+ for (i=0; i<static_count-1; i++)
+ if (entries[i]->value && entries[i]->value == entries[i+1]->value)
+ {
+ int v = entries[i]->flags;
+ int j;
+ for (j=i+1; j<static_count && entries[j]->value == entries[i]->value; j++)
+ v |= entries[j]->flags;
+ for (j=i; j<static_count && entries[j]->value == entries[i]->value; j++)
+ entries[j]->flags = v;
+ i = j-1;
+ }
+ }
+