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.
This commit is contained in:
Sriraman Tallam 2010-04-20 21:13:30 +00:00
parent ec31cde594
commit ce97fa81e0
15 changed files with 391 additions and 25 deletions

View file

@ -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,