diff options
author | Sriraman Tallam <tmsriram@google.com> | 2010-04-20 21:13:30 +0000 |
---|---|---|
committer | Sriraman Tallam <tmsriram@google.com> | 2010-04-20 21:13:30 +0000 |
commit | ce97fa81e0c46d216b80b143ad8c02fff6906fef (patch) | |
tree | 539a9d93c76d2113b92da17405b144eba8fa92c5 /gold/icf.cc | |
parent | ec31cde5942e935e74f6ff919ffc480dfa2f1bac (diff) | |
download | gdb-ce97fa81e0c46d216b80b143ad8c02fff6906fef.zip gdb-ce97fa81e0c46d216b80b143ad8c02fff6906fef.tar.gz gdb-ce97fa81e0c46d216b80b143ad8c02fff6906fef.tar.bz2 |
2010-04-18 Sriraman Tallam <tmsriram@google.com>
* icf.cc (get_section_contents): Check for preemptible functions.
Ignore addend when appropriate.
* symtab.cc (should_add_dynsym_entry): Add new parameter. Check for
section folded.
(add_from_relobj): Check for section folded.
(set_dynsym_indexes): Fix call to should_add_dynsym_entry.
* symtab.h (should_add_dynsym_entry): Add new parameter.
* target-reloc.h (scan_relocs): Check for section folded.
* x86_64.cc (Target_x86_64::Scan::possible_function_pointer_reloc):
Check reloc types for function pointers in shared objects.
* testsuite/Makefile.am (icf_virtual_function_folding_test): New test
case.
(icf_preemptible_functions_test): New test case.
(icf_string_merge_test): New test case.
* testsuite.Makefile.in: Regenerate.
* testsuite/icf_safe_so_test.sh: Change to not fold foo_glob and
bar_glob. Refactor code.
* testsuite/icf_preemptible_functions_test.cc: New file.
* testsuite/icf_preemptible_functions_test.sh: New file.
* testsuite/icf_string_merge_test.cc: New file.
* testsuite/icf_string_merge_test.sh: New file.
* testsuite/icf_virtual_function_folding_test.cc: New file.
* testsuite/icf_virtual_function_folding_test.sh: New file.
Diffstat (limited to 'gold/icf.cc')
-rw-r--r-- | gold/icf.cc | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/gold/icf.cc b/gold/icf.cc index 1f955e6..5040a6e 100644 --- a/gold/icf.cc +++ b/gold/icf.cc @@ -304,7 +304,12 @@ get_section_contents(bool first_iteration, symtab->icf()->section_to_int_map(); Icf::Uniq_secn_id_map::iterator section_id_map_it = section_id_map.find(reloc_secn); - if (section_id_map_it != section_id_map.end()) + bool is_sym_preemptible = (*it_s != NULL + && !(*it_s)->is_from_dynobj() + && !(*it_s)->is_undefined() + && (*it_s)->is_preemptible()); + if (!is_sym_preemptible + && section_id_map_it != section_id_map.end()) { // This is a reloc to a section that might be folded. if (num_tracked_relocs) @@ -338,7 +343,14 @@ get_section_contents(bool first_iteration, { uint64_t entsize = (it_v->first)->section_entsize(it_v->second); - long long offset = it_a->first + it_a->second; + long long offset = it_a->first; + + unsigned long long addend = it_a->second; + // Ignoring the addend when it is a negative value. See the + // comments in Merged_symbol_value::Value in object.h. + if (addend < 0xffffff00) + offset = offset + addend; + section_size_type secn_len; const unsigned char* str_contents = (it_v->first)->section_contents(it_v->second, |