From bd8d853f779692d3d4f8dfb65cf173f7e080f498 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marcin=20Ko=C5=9Bcielnicki?= Date: Sat, 6 Feb 2016 01:52:00 +0100 Subject: [PATCH] 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. --- gold/ChangeLog | 10 ++++++++++ gold/i386.cc | 7 +++++-- gold/reloc.cc | 3 ++- gold/target.cc | 3 ++- gold/target.h | 9 ++++++--- 5 files changed, 25 insertions(+), 7 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 501c91b2c0..c883077e44 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,13 @@ +2016-02-06 Marcin Kościelnicki + + * 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 * icf.cc (get_rel_addend): New function. diff --git a/gold/i386.cc b/gold/i386.cc index 7946cf79dc..8bcd44e5c9 100644 --- a/gold/i386.cc +++ b/gold/i386.cc @@ -500,7 +500,8 @@ class Target_i386 : public Sized_target<32, false> // Return whether SYM is call to a non-split function. 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. void @@ -3916,7 +3917,9 @@ Target_i386::do_ehframe_datarel_base() const bool 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 && !is_prefix_of("__i686.get_pc_thunk.", sym->name())); diff --git a/gold/reloc.cc b/gold/reloc.cc index b1a50e6807..ca54f153a3 100644 --- a/gold/reloc.cc +++ b/gold/reloc.cc @@ -1251,7 +1251,8 @@ Sized_relobj_file::split_stack_adjust_reltype( && gsym->source() == Symbol::FROM_OBJECT && !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); section_offset_type offset = diff --git a/gold/target.cc b/gold/target.cc index cc3765a8c0..3bae2dd525 100644 --- a/gold/target.cc +++ b/gold/target.cc @@ -152,7 +152,8 @@ Target::do_make_output_section(const char* name, elfcpp::Elf_Word type, // whether the symbol is a function. 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; } diff --git a/gold/target.h b/gold/target.h index c0f24eea79..d20044e58c 100644 --- a/gold/target.h +++ b/gold/target.h @@ -326,8 +326,10 @@ class Target // without -fsplit-stack. SYM is known to be defined in an object // compiled without -fsplit-stack. bool - is_call_to_non_split(const Symbol* sym, const unsigned char* preloc) const - { return this->do_is_call_to_non_split(sym, preloc); } + is_call_to_non_split(const Symbol* sym, const unsigned char* 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 // 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 // ABI is a call to a non-split function. 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 void -- 2.34.1