diff options
author | Ian Lance Taylor <ian@airs.com> | 2010-03-11 01:10:53 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2010-03-11 01:10:53 +0000 |
commit | b6848d3c09394cfc3ce9efd4847e1e33a43d51dd (patch) | |
tree | c849af13e3c244807b6bc58571040423d1bcab6f /gold/reloc.cc | |
parent | e469c7fb687b55ecd0d6048cbb9134a00b7f03d8 (diff) | |
download | binutils-b6848d3c09394cfc3ce9efd4847e1e33a43d51dd.zip binutils-b6848d3c09394cfc3ce9efd4847e1e33a43d51dd.tar.gz binutils-b6848d3c09394cfc3ce9efd4847e1e33a43d51dd.tar.bz2 |
* reloc.cc (Sized_relobj::split_stack_adjust_reltype): Call the
target to ask whether a reference to a symbol requires a stack
split.
* target.h (Target::is_call_to_non_split): New function.
(Target::do_is_call_to_non_split): Declare virtual function.
* target.cc: Include "symtab.h".
(Target::do_is_call_to_non_split): New function.
* i386.cc (Target_i386::do_is_call_to_non_split): New function.
Diffstat (limited to 'gold/reloc.cc')
-rw-r--r-- | gold/reloc.cc | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/gold/reloc.cc b/gold/reloc.cc index 617573d..8879f0a 100644 --- a/gold/reloc.cc +++ b/gold/reloc.cc @@ -1106,14 +1106,17 @@ Sized_relobj<size, big_endian>::split_stack_adjust_reltype( // cases we will ask for a large stack unnecessarily, but this // is not fatal. FIXME: Some targets have symbols which are // functions but are not type STT_FUNC, e.g., STT_ARM_TFUNC. - if (gsym->type() == elfcpp::STT_FUNC - && !gsym->is_undefined() + if (!gsym->is_undefined() && gsym->source() == Symbol::FROM_OBJECT && !gsym->object()->uses_split_stack()) { - section_offset_type offset = - convert_to_section_size_type(reloc.get_r_offset()); - non_split_refs.push_back(offset); + unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info()); + if (parameters->target().is_call_to_non_split(gsym, r_type)) + { + section_offset_type offset = + convert_to_section_size_type(reloc.get_r_offset()); + non_split_refs.push_back(offset); + } } } |