gold: Add view and view_size parameters to is_call_to_non_split.

This is needed by s390 split-stack support, to distinguish call
and load-address relocations.

gold/ChangeLog:

	* i386.cc (Target_i386::is_call_to_non_split): Add view and view_size
	parameters.
	* reloc.cc (Sized_relobj_file::split_stack_adjust_reltype): Pass view
	and view_size to is_call_to_non_split.
	* target.cc (Target::is_call_to_non_split): Add view and view_size
	parameters.
	* target.h (class Target): Likewise.
This commit is contained in:
Marcin Kościelnicki 2016-02-06 01:52:00 +01:00
parent 148ec36086
commit bd8d853f77
5 changed files with 25 additions and 7 deletions

View file

@ -1,3 +1,13 @@
2016-02-06 Marcin Kościelnicki <koriakin@0x04.net>
* i386.cc (Target_i386::is_call_to_non_split): Add view and view_size
parameters.
* reloc.cc (Sized_relobj_file::split_stack_adjust_reltype): Pass view
and view_size to is_call_to_non_split.
* target.cc (Target::is_call_to_non_split): Add view and view_size
parameters.
* target.h (class Target): Likewise.
2016-02-05 Sriraman Tallam <tmsriram@google.com> 2016-02-05 Sriraman Tallam <tmsriram@google.com>
* icf.cc (get_rel_addend): New function. * icf.cc (get_rel_addend): New function.

View file

@ -500,7 +500,8 @@ class Target_i386 : public Sized_target<32, false>
// Return whether SYM is call to a non-split function. // Return whether SYM is call to a non-split function.
bool bool
do_is_call_to_non_split(const Symbol* sym, const unsigned char*) const; do_is_call_to_non_split(const Symbol* sym, const unsigned char*,
const unsigned char*, section_size_type) const;
// Adjust -fsplit-stack code which calls non-split-stack code. // Adjust -fsplit-stack code which calls non-split-stack code.
void void
@ -3916,7 +3917,9 @@ Target_i386::do_ehframe_datarel_base() const
bool bool
Target_i386::do_is_call_to_non_split(const Symbol* sym, Target_i386::do_is_call_to_non_split(const Symbol* sym,
const unsigned char*) const const unsigned char*,
const unsigned char*,
section_size_type) const
{ {
return (sym->type() == elfcpp::STT_FUNC return (sym->type() == elfcpp::STT_FUNC
&& !is_prefix_of("__i686.get_pc_thunk.", sym->name())); && !is_prefix_of("__i686.get_pc_thunk.", sym->name()));

View file

@ -1251,7 +1251,8 @@ Sized_relobj_file<size, big_endian>::split_stack_adjust_reltype(
&& gsym->source() == Symbol::FROM_OBJECT && gsym->source() == Symbol::FROM_OBJECT
&& !gsym->object()->uses_split_stack()) && !gsym->object()->uses_split_stack())
{ {
if (parameters->target().is_call_to_non_split(gsym, pr)) if (parameters->target().is_call_to_non_split(gsym, pr, view,
view_size))
{ {
Reltype reloc(pr); Reltype reloc(pr);
section_offset_type offset = section_offset_type offset =

View file

@ -152,7 +152,8 @@ Target::do_make_output_section(const char* name, elfcpp::Elf_Word type,
// whether the symbol is a function. // whether the symbol is a function.
bool bool
Target::do_is_call_to_non_split(const Symbol* sym, const unsigned char*) const Target::do_is_call_to_non_split(const Symbol* sym, const unsigned char*,
const unsigned char*, section_size_type) const
{ {
return sym->type() == elfcpp::STT_FUNC; return sym->type() == elfcpp::STT_FUNC;
} }

View file

@ -326,8 +326,10 @@ class Target
// without -fsplit-stack. SYM is known to be defined in an object // without -fsplit-stack. SYM is known to be defined in an object
// compiled without -fsplit-stack. // compiled without -fsplit-stack.
bool bool
is_call_to_non_split(const Symbol* sym, const unsigned char* preloc) const is_call_to_non_split(const Symbol* sym, const unsigned char* preloc,
{ return this->do_is_call_to_non_split(sym, preloc); } const unsigned char* view,
section_size_type view_size) const
{ return this->do_is_call_to_non_split(sym, preloc, view, view_size); }
// A function starts at OFFSET in section SHNDX in OBJECT. That // A function starts at OFFSET in section SHNDX in OBJECT. That
// function was compiled with -fsplit-stack, but it refers to a // function was compiled with -fsplit-stack, but it refers to a
@ -661,7 +663,8 @@ class Target
// default implementation is that any function not defined by the // default implementation is that any function not defined by the
// ABI is a call to a non-split function. // ABI is a call to a non-split function.
virtual bool virtual bool
do_is_call_to_non_split(const Symbol* sym, const unsigned char*) const; do_is_call_to_non_split(const Symbol* sym, const unsigned char*,
const unsigned char*, section_size_type) const;
// Virtual function which may be overridden by the child class. // Virtual function which may be overridden by the child class.
virtual void virtual void