This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Mips target in gold - revision 3 - part 1
- From: Cary Coutant <ccoutant at google dot com>
- To: Sasa Stankovic <Sasa dot Stankovic at imgtec dot com>
- Cc: Rich Fuhler <Rich dot Fuhler at imgtec dot com>, "binutils at sourceware dot org" <binutils at sourceware dot org>, "iant at google dot com" <iant at google dot com>, Petar Jovanovic <Petar dot Jovanovic at imgtec dot com>
- Date: Tue, 15 Apr 2014 12:01:21 -0700
- Subject: Re: Mips target in gold - revision 3 - part 1
- Authentication-results: sourceware.org; auth=none
- References: <7EDC79CE48A9944A88968ABABE6038EE6D41BEF5 at BADAG02 dot ba dot imgtec dot org>
2014-04-15 Sasa Stankovic <Sasa.Stankovic@imgtec.com>
gold/
* layout.cc (Layout::include_section): Allow a target to decide
whether to include a section.
* target.h (Target::should_include_section): New function.
(Target::do_should_include_section): New function.
I've committed this with a slight change. Instead of calling the
target hook from the default clause of the switch, I've added a test
to check for section types in the OS- or processor-specific ranges.
Thanks!
-cary
diff --git a/gold/layout.cc b/gold/layout.cc
index c96516c..02f691e 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -644,7 +644,13 @@ Layout::include_section(Sized_relobj_file<size,
big_endian>*, const char* name,
&& (shdr.get_sh_flags() & elfcpp::SHF_EXCLUDE))
return false;
- switch (shdr.get_sh_type())
+ elfcpp::Elf_Word sh_type = shdr.get_sh_type();
+
+ if ((sh_type >= elfcpp::SHT_LOOS && sh_type <= elfcpp::SHT_HIOS)
+ || (sh_type >= elfcpp::SHT_LOPROC && sh_type <= elfcpp::SHT_HIPROC))
+ return parameters->target().should_include_section(sh_type);
+
+ switch (sh_type)
{
case elfcpp::SHT_NULL:
case elfcpp::SHT_SYMTAB:
diff --git a/gold/target.h b/gold/target.h
index aaf4b1c..e380591 100644
--- a/gold/target.h
+++ b/gold/target.h
@@ -480,6 +480,11 @@ class Target
adjust_dyn_symbol(const Symbol* sym, unsigned char* view) const
{ this->do_adjust_dyn_symbol(sym, view); }
+ // Return whether to include the section in the link.
+ bool
+ should_include_section(elfcpp::Elf_Word sh_type) const
+ { return this->do_should_include_section(sh_type); }
+
protected:
// This struct holds the constant information for a child class. We
// use a struct to avoid the overhead of virtual function calls for
@@ -773,6 +778,11 @@ class Target
do_adjust_dyn_symbol(const Symbol*, unsigned char*) const
{ }
+ // This may be overridden by the child class.
+ virtual bool
+ do_should_include_section(elfcpp::Elf_Word) const
+ { return true; }
+
private:
// The implementations of the four do_make_elf_object virtual functions are
// almost identical except for their sizes and endianness. We use
a template.