This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
gold patch committed: Code cleanup
- From: Ian Lance Taylor <iant at google dot com>
- To: binutils at sourceware dot org
- Date: Tue, 28 Jun 2011 14:17:07 -0700
- Subject: gold patch committed: Code cleanup
This patch cleans up some of the target ICF code to conform to the gold
standards. Public functions are not virtual. One of the virtual
functions could be replaced with a constant in Target_info. This patch
just shuffles some code and does not change any functionality.
Committed to mainline.
Ian
2011-06-28 Ian Lance Taylor <iant@google.com>
* target.h (Target::can_check_for_function_pointers): Rewrite.
Make non-virtual.
(Target::can_icf_inline_merge_sections): Likewise.
(Target::section_may_have_icf_unsafe_poineters): Likewise.
(Target::Target_info): Add can_icf_inline_merge_sections field.
(Target::do_can_check_for_function_pointers): New virtual
function.
(Target::do_section_may_have_icf_unsafe_pointers): Likewise.
* arm.cc (Target_arm::do_can_check_for_function_pointers): Rename
from can_check_for_function_pointers, move in file.
(Target_arm::do_section_may_have_icf_unsafe_pointers): Rename from
section_may_have_icf_unsafe_poineters, move in file.
(Target_arm::arm_info): Initialize can_icf_inline_merge_sections.
* i386.cc (Target_i386::do_can_check_for_function_pointers):
Rename from can_check_for_function_pointers, move in file.
(Target_i386::can_icf_inline_merge_sections): Remove.
(Target_i386::i386_info): Initialize
can_icf_inline_merge_sections.
* powerpc.cc (Target_powerpc::powerpc_info) [all versions]:
Initialize can_icf_inline_merge_sections.
* sparc.cc (Target_sparc::sparc_info) [both version]: Likewise.
* x86_64.cc (Target_x86_64::do_can_check_for_function_pointers):
Rename from can_check_for_function_pointers, move in file.
(Target_x86_64::can_icf_inline_merge_sections): Remove.
(Target_x86_64::x86_64_info): Initialize
can_icf_inline_merge_sections.
* testsuite/testfile.cc (Target_test::test_target_info):
Likewise.
* icf.cc (get_section_contents): Correct formatting.
Index: arm.cc
===================================================================
RCS file: /cvs/src/src/gold/arm.cc,v
retrieving revision 1.135
diff -p -u -r1.135 arm.cc
--- arm.cc 27 Jun 2011 17:53:31 -0000 1.135
+++ arm.cc 28 Jun 2011 21:11:14 -0000
@@ -1,6 +1,6 @@
// arm.cc -- arm target support for gold.
-// Copyright 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by Doug Kwan <dougkwan@google.com> based on the i386 code
// by Ian Lance Taylor <iant@google.com>.
// This file also contains borrowed and adapted code from
@@ -2182,23 +2182,6 @@ class Target_arm : public Sized_target<3
fix_cortex_a8_(false), cortex_a8_relocs_info_()
{ }
- // Virtual function which is set to return true by a target if
- // it can use relocation types to determine if a function's
- // pointer is taken.
- virtual bool
- can_check_for_function_pointers() const
- { return true; }
-
- // Whether a section called SECTION_NAME may have function pointers to
- // sections not eligible for safe ICF folding.
- virtual bool
- section_may_have_icf_unsafe_pointers(const char* section_name) const
- {
- return (!is_prefix_of(".ARM.exidx", section_name)
- && !is_prefix_of(".ARM.extab", section_name)
- && Target::section_may_have_icf_unsafe_pointers(section_name));
- }
-
// Whether we can use BLX.
bool
may_use_blx() const
@@ -2553,6 +2536,23 @@ class Target_arm : public Sized_target<3
arm_reloc_property_table = new Arm_reloc_property_table();
}
+ // Virtual function which is set to return true by a target if
+ // it can use relocation types to determine if a function's
+ // pointer is taken.
+ virtual bool
+ do_can_check_for_function_pointers() const
+ { return true; }
+
+ // Whether a section called SECTION_NAME may have function pointers to
+ // sections not eligible for safe ICF folding.
+ virtual bool
+ do_section_may_have_icf_unsafe_pointers(const char* section_name) const
+ {
+ return (!is_prefix_of(".ARM.exidx", section_name)
+ && !is_prefix_of(".ARM.extab", section_name)
+ && Target::do_section_may_have_icf_unsafe_pointers(section_name));
+ }
+
private:
// The class which scans relocations.
class Scan
@@ -2946,6 +2946,7 @@ const Target::Target_info Target_arm<big
false, // has_resolve
false, // has_code_fill
true, // is_default_stack_executable
+ false, // can_icf_inline_merge_sections
'\0', // wrap_char
"/usr/lib/libc.so.1", // dynamic_linker
0x8000, // default_text_segment_address
Index: i386.cc
===================================================================
RCS file: /cvs/src/src/gold/i386.cc,v
retrieving revision 1.128
diff -p -u -r1.128 i386.cc
--- i386.cc 24 May 2011 21:41:10 -0000 1.128
+++ i386.cc 28 Jun 2011 21:11:14 -0000
@@ -1,6 +1,6 @@
// i386.cc -- i386 target support for gold.
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
@@ -171,14 +171,6 @@ class Target_i386 : public Target_freebs
got_mod_index_offset_(-1U), tls_base_symbol_defined_(false)
{ }
- inline bool
- can_check_for_function_pointers() const
- { return true; }
-
- virtual bool
- can_icf_inline_merge_sections () const
- { return true; }
-
// Process the relocations to determine unreferenced sections for
// garbage collection.
void
@@ -291,6 +283,11 @@ class Target_i386 : public Target_freebs
do_plt_section_for_local(const Relobj*, unsigned int) const
{ return this->plt_section(); }
+ // We can tell whether we take the address of a function.
+ inline bool
+ do_can_check_for_function_pointers() const
+ { return true; }
+
// Return whether SYM is call to a non-split function.
bool
do_is_call_to_non_split(const Symbol* sym, unsigned int) const;
@@ -642,6 +639,7 @@ const Target::Target_info Target_i386::i
false, // has_resolve
true, // has_code_fill
true, // is_default_stack_executable
+ true, // can_icf_inline_merge_sections
'\0', // wrap_char
"/usr/lib/libc.so.1", // dynamic_linker
0x08048000, // default_text_segment_address
Index: icf.cc
===================================================================
RCS file: /cvs/src/src/gold/icf.cc,v
retrieving revision 1.19
diff -p -u -r1.19 icf.cc
--- icf.cc 2 Feb 2011 21:55:29 -0000 1.19
+++ icf.cc 28 Jun 2011 21:11:14 -0000
@@ -1,6 +1,6 @@
// icf.cc -- Identical Code Folding.
//
-// Copyright 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by Sriraman Tallam <tmsriram@google.com>.
// This file is part of gold.
@@ -373,7 +373,7 @@ get_section_contents(bool first_iteratio
// This reloc points to a merge section. Hash the
// contents of this section.
if ((secn_flags & elfcpp::SHF_MERGE) != 0
- && parameters->target().can_icf_inline_merge_sections ())
+ && parameters->target().can_icf_inline_merge_sections())
{
uint64_t entsize =
(it_v->first)->section_entsize(it_v->second);
Index: powerpc.cc
===================================================================
RCS file: /cvs/src/src/gold/powerpc.cc,v
retrieving revision 1.37
diff -p -u -r1.37 powerpc.cc
--- powerpc.cc 24 May 2011 21:41:10 -0000 1.37
+++ powerpc.cc 28 Jun 2011 21:11:14 -0000
@@ -1,6 +1,6 @@
// powerpc.cc -- powerpc target support for gold.
-// Copyright 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by David S. Miller <davem@davemloft.net>
// and David Edelsohn <edelsohn@gnu.org>
@@ -383,6 +383,7 @@ Target::Target_info Target_powerpc<32, t
false, // has_resolve
false, // has_code_fill
true, // is_default_stack_executable
+ false, // can_icf_inline_merge_sections
'\0', // wrap_char
"/usr/lib/ld.so.1", // dynamic_linker
0x10000000, // default_text_segment_address
@@ -406,6 +407,7 @@ Target::Target_info Target_powerpc<32, f
false, // has_resolve
false, // has_code_fill
true, // is_default_stack_executable
+ false, // can_icf_inline_merge_sections
'\0', // wrap_char
"/usr/lib/ld.so.1", // dynamic_linker
0x10000000, // default_text_segment_address
@@ -429,6 +431,7 @@ Target::Target_info Target_powerpc<64, t
false, // has_resolve
false, // has_code_fill
true, // is_default_stack_executable
+ false, // can_icf_inline_merge_sections
'\0', // wrap_char
"/usr/lib/ld.so.1", // dynamic_linker
0x10000000, // default_text_segment_address
@@ -452,6 +455,7 @@ Target::Target_info Target_powerpc<64, f
false, // has_resolve
false, // has_code_fill
true, // is_default_stack_executable
+ false, // can_icf_inline_merge_sections
'\0', // wrap_char
"/usr/lib/ld.so.1", // dynamic_linker
0x10000000, // default_text_segment_address
Index: sparc.cc
===================================================================
RCS file: /cvs/src/src/gold/sparc.cc,v
retrieving revision 1.46
diff -p -u -r1.46 sparc.cc
--- sparc.cc 24 May 2011 21:41:10 -0000 1.46
+++ sparc.cc 28 Jun 2011 21:11:14 -0000
@@ -1,6 +1,6 @@
// sparc.cc -- sparc target support for gold.
-// Copyright 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by David S. Miller <davem@davemloft.net>.
// This file is part of gold.
@@ -403,6 +403,7 @@ Target::Target_info Target_sparc<32, tru
false, // has_resolve
false, // has_code_fill
true, // is_default_stack_executable
+ false, // can_icf_inline_merge_sections
'\0', // wrap_char
"/usr/lib/ld.so.1", // dynamic_linker
0x00010000, // default_text_segment_address
@@ -426,6 +427,7 @@ Target::Target_info Target_sparc<64, tru
false, // has_resolve
false, // has_code_fill
true, // is_default_stack_executable
+ false, // can_icf_inline_merge_sections
'\0', // wrap_char
"/usr/lib/sparcv9/ld.so.1", // dynamic_linker
0x100000, // default_text_segment_address
Index: target.h
===================================================================
RCS file: /cvs/src/src/gold/target.h,v
retrieving revision 1.58
diff -p -u -r1.58 target.h
--- target.h 8 Jun 2011 03:50:11 -0000 1.58
+++ target.h 28 Jun 2011 21:11:14 -0000
@@ -1,6 +1,6 @@
// target.h -- target support for gold -*- C++ -*-
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
@@ -70,34 +70,6 @@ class Target
virtual ~Target()
{ }
- // Virtual function which is set to return true by a target if
- // it can use relocation types to determine if a function's
- // pointer is taken.
- virtual bool
- can_check_for_function_pointers() const
- { return false; }
-
- // This function is used in ICF (icf.cc). This is set to true by
- // the target if a relocation to a merged section can be processed
- // to retrieve the contents of the merged section.
- virtual bool
- can_icf_inline_merge_sections () const
- { return false; }
-
- // Whether a section called SECTION_NAME may have function pointers to
- // sections not eligible for safe ICF folding.
- virtual bool
- section_may_have_icf_unsafe_pointers(const char* section_name) const
- {
- // We recognize sections for normal vtables, construction vtables and
- // EH frames.
- return (!is_prefix_of(".rodata._ZTV", section_name)
- && !is_prefix_of(".data.rel.ro._ZTV", section_name)
- && !is_prefix_of(".rodata._ZTC", section_name)
- && !is_prefix_of(".data.rel.ro._ZTC", section_name)
- && !is_prefix_of(".eh_frame", section_name));
- }
-
// Return the bit size that this target implements. This should
// return 32 or 64.
int
@@ -286,6 +258,24 @@ class Target
plt_section_for_local(const Relobj* object, unsigned int symndx) const
{ return this->do_plt_section_for_local(object, symndx); }
+ // Return whether this target can use relocation types to determine
+ // if a function's address is taken.
+ bool
+ can_check_for_function_pointers() const
+ { return this->do_can_check_for_function_pointers(); }
+
+ // Return whether a relocation to a merged section can be processed
+ // to retrieve the contents.
+ bool
+ can_icf_inline_merge_sections () const
+ { return this->pti_->can_icf_inline_merge_sections; }
+
+ // Whether a section called SECTION_NAME may have function pointers to
+ // sections not eligible for safe ICF folding.
+ virtual bool
+ section_may_have_icf_unsafe_pointers(const char* section_name) const
+ { return this->do_section_may_have_icf_unsafe_pointers(section_name); }
+
// Return true if a reference to SYM from a reloc of type R_TYPE
// means that the current function may call an object compiled
// without -fsplit-stack. SYM is known to be defined in an object
@@ -406,6 +396,9 @@ class Target
// Whether an object file with no .note.GNU-stack sections implies
// that the stack should be executable.
bool is_default_stack_executable;
+ // Whether a relocation to a merged section can be processed to
+ // retrieve the contents.
+ bool can_icf_inline_merge_sections;
// Prefix character to strip when checking for wrapping.
char wrap_char;
// The default dynamic linker name.
@@ -497,6 +490,26 @@ class Target
do_plt_section_for_local(const Relobj*, unsigned int) const
{ gold_unreachable(); }
+ // Virtual function which may be overriden by the child class.
+ virtual bool
+ do_can_check_for_function_pointers() const
+ { return false; }
+
+ // Virtual function which may be overridden by the child class. We
+ // recognize some default sections for which we don't care whether
+ // they have function pointers.
+ virtual bool
+ do_section_may_have_icf_unsafe_pointers(const char* section_name) const
+ {
+ // We recognize sections for normal vtables, construction vtables and
+ // EH frames.
+ return (!is_prefix_of(".rodata._ZTV", section_name)
+ && !is_prefix_of(".data.rel.ro._ZTV", section_name)
+ && !is_prefix_of(".rodata._ZTC", section_name)
+ && !is_prefix_of(".data.rel.ro._ZTC", section_name)
+ && !is_prefix_of(".eh_frame", section_name));
+ }
+
// Virtual function which may be overridden by the child class. The
// default implementation is that any function not defined by the
// ABI is a call to a non-split function.
Index: x86_64.cc
===================================================================
RCS file: /cvs/src/src/gold/x86_64.cc,v
retrieving revision 1.127
diff -p -u -r1.127 x86_64.cc
--- x86_64.cc 17 Jun 2011 11:15:34 -0000 1.127
+++ x86_64.cc 28 Jun 2011 21:11:14 -0000
@@ -1,6 +1,6 @@
// x86_64.cc -- x86_64 target support for gold.
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
@@ -217,20 +217,6 @@ class Target_x86_64 : public Target_free
tls_base_symbol_defined_(false)
{ }
- // This function should be defined in targets that can use relocation
- // types to determine (implemented in local_reloc_may_be_function_pointer
- // and global_reloc_may_be_function_pointer)
- // if a function's pointer is taken. ICF uses this in safe mode to only
- // fold those functions whose pointer is defintely not taken. For x86_64
- // pie binaries, safe ICF cannot be done by looking at relocation types.
- inline bool
- can_check_for_function_pointers() const
- { return !parameters->options().pie(); }
-
- virtual bool
- can_icf_inline_merge_sections () const
- { return true; }
-
// Hook for a new output section.
void
do_new_output_section(Output_section*) const;
@@ -347,6 +333,16 @@ class Target_x86_64 : public Target_free
do_plt_section_for_local(const Relobj*, unsigned int) const
{ return this->plt_section(); }
+ // This function should be defined in targets that can use relocation
+ // types to determine (implemented in local_reloc_may_be_function_pointer
+ // and global_reloc_may_be_function_pointer)
+ // if a function's pointer is taken. ICF uses this in safe mode to only
+ // fold those functions whose pointer is defintely not taken. For x86_64
+ // pie binaries, safe ICF cannot be done by looking at relocation types.
+ bool
+ do_can_check_for_function_pointers() const
+ { return !parameters->options().pie(); }
+
// Adjust -fsplit-stack code which calls non-split-stack code.
void
do_calls_non_split(Relobj* object, unsigned int shndx,
@@ -755,6 +751,7 @@ const Target::Target_info Target_x86_64:
false, // has_resolve
true, // has_code_fill
true, // is_default_stack_executable
+ true, // can_icf_inline_merge_sections
'\0', // wrap_char
"/lib/ld64.so.1", // program interpreter
0x400000, // default_text_segment_address
Index: testsuite/testfile.cc
===================================================================
RCS file: /cvs/src/src/gold/testsuite/testfile.cc,v
retrieving revision 1.19
diff -p -u -r1.19 testfile.cc
--- testsuite/testfile.cc 24 May 2011 21:41:10 -0000 1.19
+++ testsuite/testfile.cc 28 Jun 2011 21:11:14 -0000
@@ -1,6 +1,6 @@
// testfile.cc -- Dummy ELF objects for testing purposes.
-// Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2011 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
@@ -94,6 +94,7 @@ const Target::Target_info Target_test<si
false, // has_resolve
false, // has_code_fill
false, // is_default_stack_executable
+ false, // can_icf_inline_merge_sections
'\0', // wrap_char
"/dummy", // dynamic_linker
0x08000000, // default_text_segment_address