public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [patch] Ignore non relobj files in gc
@ 2015-04-23  2:27 Rafael Espíndola
  2015-04-27 20:17 ` Cary Coutant
  0 siblings, 1 reply; 5+ messages in thread
From: Rafael Espíndola @ 2015-04-23  2:27 UTC (permalink / raw)
  To: Binutils; +Cc: Sriraman Tallam, Cary Coutant

[-- Attachment #1: Type: text/plain, Size: 1149 bytes --]

If a relocation points to a dynamic object we can ignore it, since we
cannot gc an already existing .so file.

The attached patch produces an identical chromium binary, but does so
a bit faster (see the attached perf logs).

Using Relobj also helps me in my patch for gcing parts of SHF_MERGE sections.

Cheers,
Rafael


2015-04-22  Rafael Ávila de Espíndola <rafael.espindola@gmail.com>

* gc.cc (Garbage_collection::do_transitive_closure): Use Rel_section_id.
* gc.h (Garbage_collection): Use Rel_section_id.
(is_section_garbage): Use Relobj.
(add_cident_section): Use Relobj.
(add_reference): Use Relobj and Rel_section_id.
(gc_process_relocs): Ignore non Relobj objects.
* object.cc (do_layout): Use Rel_section_id.
* object.h (Rel_section_id): New.
* powerpc.cc (Powerpc_relobj): Use Rel_section_id.
(add_reference): Use Relobj and Rel_section_id.
(do_gc_add_reference): Use Relobj.
(gc_process_relocs): Use Relobj.
(do_gc_mark_symbol): Use Rel_section_id.
* symtab.cc (gc_mark_symbol): Use Rel_section_id.
* symtab.h (relobj): New.
* target.h (gc_add_reference): Use Relobj.
(do_gc_add_reference): Use Relobj.

[-- Attachment #2: t.patch --]
[-- Type: text/x-patch, Size: 10251 bytes --]

diff --git a/gold/gc.cc b/gold/gc.cc
index 08a2bba..eff4968 100644
--- a/gold/gc.cc
+++ b/gold/gc.cc
@@ -38,7 +38,7 @@ Garbage_collection::do_transitive_closure()
     {
       // Add elements from the work list to the referenced list
       // one by one.
-      Section_id entry = this->worklist().back();
+      Rel_section_id entry = this->worklist().back();
       this->worklist().pop_back();
       if (!this->referenced_list().insert(entry).second)
         continue;
diff --git a/gold/gc.h b/gold/gc.h
index bf4023d..9723e3f 100644
--- a/gold/gc.h
+++ b/gold/gc.h
@@ -49,9 +49,9 @@ class Garbage_collection
 {
  public:
 
-  typedef Unordered_set<Section_id, Section_id_hash> Sections_reachable;
-  typedef std::map<Section_id, Sections_reachable> Section_ref;
-  typedef std::vector<Section_id> Worklist_type;
+  typedef Unordered_set<Rel_section_id, Section_id_hash> Sections_reachable;
+  typedef std::map<Rel_section_id, Sections_reachable> Section_ref;
+  typedef std::vector<Rel_section_id> Worklist_type;
   // This maps the name of the section which can be represented as a C
   // identifier (cident) to the list of sections that have that name.
   // Different object files can have cident sections with the same name.
@@ -87,8 +87,8 @@ class Garbage_collection
   do_transitive_closure();
 
   bool
-  is_section_garbage(Object* obj, unsigned int shndx)
-  { return (this->referenced_list().find(Section_id(obj, shndx))
+  is_section_garbage(Relobj* obj, unsigned int shndx)
+  { return (this->referenced_list().find(Rel_section_id(obj, shndx))
             == this->referenced_list().end()); }
 
   Cident_section_map*
@@ -97,17 +97,17 @@ class Garbage_collection
 
   void
   add_cident_section(std::string section_name,
-		     Section_id secn)
+		     Rel_section_id secn)
   { this->cident_sections_[section_name].insert(secn); }
 
   // Add a reference from the SRC_SHNDX-th section of SRC_OBJECT to
   // DST_SHNDX-th section of DST_OBJECT.
   void
-  add_reference(Object* src_object, unsigned int src_shndx,
-		Object* dst_object, unsigned int dst_shndx)
+  add_reference(Relobj* src_object, unsigned int src_shndx,
+		Relobj* dst_object, unsigned int dst_shndx)
   {
-    Section_id src_id(src_object, src_shndx);
-    Section_id dst_id(dst_object, dst_shndx);
+    Rel_section_id src_id(src_object, src_shndx);
+    Rel_section_id dst_id(dst_object, dst_shndx);
     Sections_reachable& reachable = this->section_reloc_map_[src_id];
     reachable.insert(dst_id);
   }
@@ -229,7 +229,7 @@ gc_process_relocs(
       unsigned int r_type = elfcpp::elf_r_type<size>(r_info);
       typename elfcpp::Elf_types<size>::Elf_Swxword addend =
       Reloc_types<sh_type, size, big_endian>::get_reloc_addend_noerror(&reloc);
-      Object* dst_obj;
+      Relobj* dst_obj;
       unsigned int dst_indx;
       typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
       Address dst_off;
@@ -291,7 +291,7 @@ gc_process_relocs(
           bool is_ordinary = false;
           if (gsym->source() == Symbol::FROM_OBJECT)
             {
-              dst_obj = gsym->object();
+              dst_obj = gsym->relobj();
               dst_indx = gsym->shndx(&is_ordinary);
             }
 	  dst_off = static_cast<const Sized_symbol<size>*>(gsym)->value();
@@ -340,7 +340,7 @@ gc_process_relocs(
                                                          src_obj));
 	    }
 
-          if (gsym->source() != Symbol::FROM_OBJECT)
+          if (dst_obj == NULL)
             continue;
           if (!is_ordinary)
             continue;
@@ -357,7 +357,7 @@ gc_process_relocs(
                 symtab->gc()->cident_sections()->find(std::string(cident_section_name));
               if (ele == symtab->gc()->cident_sections()->end())
                 continue;
-	      Section_id src_id(src_obj, src_indx);
+	      Rel_section_id src_id(src_obj, src_indx);
               Garbage_collection::Sections_reachable&
                 v(symtab->gc()->section_reloc_map()[src_id]);
               Garbage_collection::Sections_reachable& cident_secn(ele->second);
diff --git a/gold/object.cc b/gold/object.cc
index 18c6670..a2bad83 100644
--- a/gold/object.cc
+++ b/gold/object.cc
@@ -1602,7 +1602,7 @@ Sized_relobj_file<size, big_endian>::do_layout(Symbol_table* symtab,
 	      || shdr.get_sh_type() == elfcpp::SHT_INIT_ARRAY
 	      || shdr.get_sh_type() == elfcpp::SHT_FINI_ARRAY)
 	    {
-	      symtab->gc()->worklist().push_back(Section_id(this, i));
+	      symtab->gc()->worklist().push_back(Rel_section_id(this, i));
 	    }
 	  // If the section name XXX can be represented as a C identifier
 	  // it cannot be discarded if there are references to
@@ -1610,7 +1610,7 @@ Sized_relobj_file<size, big_endian>::do_layout(Symbol_table* symtab,
 	  // specially handled.
 	  if (is_cident(name))
 	    {
-	      symtab->gc()->add_cident_section(name, Section_id(this, i));
+	      symtab->gc()->add_cident_section(name, Rel_section_id(this, i));
 	    }
 	}
 
diff --git a/gold/object.h b/gold/object.h
index fc93abd..29376f2 100644
--- a/gold/object.h
+++ b/gold/object.h
@@ -2865,6 +2865,8 @@ struct Relocate_info
 // key type for various section maps.
 typedef std::pair<Object*, unsigned int> Section_id;
 
+typedef std::pair<Relobj*, unsigned int> Rel_section_id;
+
 // This is similar to Section_id but is used when the section
 // pointers are const.
 typedef std::pair<const Object*, unsigned int> Const_section_id;
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index fddf3fa..57e0082 100644
--- a/gold/powerpc.cc
+++ b/gold/powerpc.cc
@@ -79,7 +79,7 @@ class Powerpc_relobj : public Sized_relobj_file<size, big_endian>
 {
 public:
   typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
-  typedef Unordered_set<Section_id, Section_id_hash> Section_refs;
+  typedef Unordered_set<Rel_section_id, Section_id_hash> Section_refs;
   typedef Unordered_map<Address, Section_refs> Access_from;
 
   Powerpc_relobj(const std::string& name, Input_file* input_file, off_t offset,
@@ -212,11 +212,11 @@ public:
   // Add a reference from SRC_OBJ, SRC_INDX to this object's .opd
   // section at DST_OFF.
   void
-  add_reference(Object* src_obj,
+  add_reference(Relobj* src_obj,
 		unsigned int src_indx,
 		typename elfcpp::Elf_types<size>::Elf_Addr dst_off)
   {
-    Section_id src_id(src_obj, src_indx);
+    Rel_section_id src_id(src_obj, src_indx);
     this->access_from_map_[dst_off].insert(src_id);
   }
 
@@ -238,7 +238,7 @@ public:
       if (this->opd_ent_[i].gc_mark)
 	{
 	  unsigned int shndx = this->opd_ent_[i].shndx;
-	  symtab->gc()->worklist().push_back(Section_id(this, shndx));
+	  symtab->gc()->worklist().push_back(Rel_section_id(this, shndx));
 	}
   }
 
@@ -780,9 +780,9 @@ class Target_powerpc : public Sized_target<size, big_endian>
   // section of a function descriptor.
   void
   do_gc_add_reference(Symbol_table* symtab,
-		      Object* src_obj,
+		      Relobj* src_obj,
 		      unsigned int src_shndx,
-		      Object* dst_obj,
+		      Relobj* dst_obj,
 		      unsigned int dst_shndx,
 		      Address dst_off) const;
 
@@ -6347,7 +6347,7 @@ Target_powerpc<size, big_endian>::gc_process_relocs(
 	  typename Powerpc_relobj<size, big_endian>::Section_refs::iterator s;
 	  for (s = p->second.begin(); s != p->second.end(); ++s)
 	    {
-	      Object* src_obj = s->first;
+	      Relobj* src_obj = s->first;
 	      unsigned int src_indx = s->second;
 	      symtab->gc()->add_reference(src_obj, src_indx,
 					  ppc_object, dst_indx);
@@ -6384,9 +6384,9 @@ template<int size, bool big_endian>
 void
 Target_powerpc<size, big_endian>::do_gc_add_reference(
     Symbol_table* symtab,
-    Object* src_obj,
+    Relobj* src_obj,
     unsigned int src_shndx,
-    Object* dst_obj,
+    Relobj* dst_obj,
     unsigned int dst_shndx,
     Address dst_off) const
 {
@@ -6434,8 +6434,8 @@ Target_powerpc<size, big_endian>::do_gc_mark_symbol(
 	  if (ppc_object->opd_valid())
 	    {
 	      unsigned int dst_indx = ppc_object->get_opd_ent(dst_off);
-	      symtab->gc()->worklist().push_back(Section_id(ppc_object,
-                                                            dst_indx));
+	      symtab->gc()->worklist().push_back(Rel_section_id(ppc_object,
+                                                                dst_indx));
 	    }
 	  else
 	    ppc_object->add_gc_mark(dst_off);
diff --git a/gold/symtab.cc b/gold/symtab.cc
index c197221..385024f 100644
--- a/gold/symtab.cc
+++ b/gold/symtab.cc
@@ -653,7 +653,7 @@ Symbol_table::gc_mark_symbol(Symbol* sym)
   if (is_ordinary && shndx != elfcpp::SHN_UNDEF)
     {
       gold_assert(this->gc_!= NULL);
-      this->gc_->worklist().push_back(Section_id(sym->object(), shndx));
+      this->gc_->worklist().push_back(Rel_section_id(sym->relobj(), shndx));
     }
   parameters->target().gc_mark_symbol(this, sym);
 }
diff --git a/gold/symtab.h b/gold/symtab.h
index 9413360..4144aef 100644
--- a/gold/symtab.h
+++ b/gold/symtab.h
@@ -157,6 +157,17 @@ class Symbol
     return this->u_.from_object.object;
   }
 
+  Relobj*
+  relobj() const
+  {
+    if (this->source_ != FROM_OBJECT)
+      return NULL;
+    Object *r = this->u_.from_object.object;
+    if (r->is_dynamic() || r->pluginobj() != NULL)
+      return NULL;
+    return static_cast<Relobj*>(r);
+  }
+
   // Return the index of the section in the input relocatable or
   // dynamic object file.
   unsigned int
diff --git a/gold/target.h b/gold/target.h
index 95bc57e..dfbc5ee 100644
--- a/gold/target.h
+++ b/gold/target.h
@@ -1056,9 +1056,9 @@ class Sized_target : public Target
   // and DST_OFF.
   void
   gc_add_reference(Symbol_table* symtab,
-		   Object* src_obj,
+		   Relobj* src_obj,
 		   unsigned int src_shndx,
-		   Object* dst_obj,
+		   Relobj* dst_obj,
 		   unsigned int dst_shndx,
 		   typename elfcpp::Elf_types<size>::Elf_Addr dst_off) const
   {
@@ -1080,8 +1080,8 @@ class Sized_target : public Target
 
   // Handle target specific gc actions when adding a gc reference.
   virtual void
-  do_gc_add_reference(Symbol_table*, Object*, unsigned int,
-		      Object*, unsigned int,
+  do_gc_add_reference(Symbol_table*, Relobj*, unsigned int,
+		      Relobj*, unsigned int,
 		      typename elfcpp::Elf_types<size>::Elf_Addr) const
   { }
 

[-- Attachment #3: master.log --]
[-- Type: text/x-log, Size: 22754 bytes --]


 Performance counter stats for '/home/espindola/binutils/ld-master -pie --hash-style=gnu --no-add-needed --build-id --gc-sections --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o chrome /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/Scrt1.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtbeginS.o -L. -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../.. -L/home/espindola/llvm/build-227431/bin/../lib -L/lib -L/usr/lib -z now -z relro --fatal-warnings -z defs -z noexecstack --disable-new-dtags --export-dynamic -uIsHeapProfilerRunning -uProfilerStart -u_Z21InitialMallocHook_NewPKvj -u_Z22InitialMallocHook_MMapPKvS0_jiiix -u_Z22InitialMallocHook_SbrkPKvi -u_Z21InitialMallocHook_NewPKvm -u_Z22InitialMallocHook_MMapPKvS0_miiil -u_Z22InitialMallocHook_SbrkPKvl -u_ZN15HeapLeakChecker12IgnoreObjectEPKv -u_ZN15HeapLeakChecker14UnIgnoreObjectEPKv -O1 --as-needed --start-group obj/chrome/app/chrome_initial.chrome_exe_main_aura.o obj/content/public/common/chrome_initial.content_switches.o obj/chrome/app/chrome_initial.chrome_main.o obj/chrome/app/chrome_initial.chrome_main_delegate.o obj/chrome/libcommon.a obj/chrome/libbrowser.a obj/chrome/libdebugger.a obj/ppapi/libppapi_host.a obj/printing/libprinting.a obj/chrome/libservice.a obj/chrome/libplugin.a obj/chrome/librenderer.a obj/chrome/libutility.a obj/content/libcontent_gpu.a obj/content/libcontent_ppapi_plugin.a obj/components/nacl/renderer/plugin/libnacl_trusted_plugin.a obj/remoting/libremoting_client_plugin.a obj/content/libcontent_app_both.a obj/chrome/libinstaller_util.a obj/base/allocator/liballocator.a obj/components/libstartup_metric_utils.a obj/chrome/libcommon_net.a obj/base/libbase.a obj/base/libbase_static.a obj/base/allocator/liballocator_extension_thunks.a obj/third_party/modp_b64/libmodp_b64.a obj/base/third_party/dynamic_annotations/libdynamic_annotations.a obj/base/libsymbolize.a obj/base/libxdg_mime.a obj/third_party/libevent/libevent.a obj/components/libnetwork_hints_common.a obj/components/liberror_page_common.a obj/url/liburl_lib.a obj/third_party/icu/libicui18n.a obj/third_party/icu/libicuuc.a obj/third_party/icu/libicudata.a obj/crypto/libcrcrypto.a obj/net/third_party/nss/libcrssl.a obj/net/libnet.a obj/base/libbase_i18n.a obj/base/libbase_prefs.a obj/sdch/libsdch.a obj/third_party/zlib/libchrome_zlib.a obj/third_party/zlib/libzlib_x86_simd.a obj/build/linux/libgio.a obj/ui/base/libui_base.a obj/skia/libskia_library.a obj/skia/libskia_opts.a obj/skia/libskia_opts_ssse3.a obj/skia/libskia_opts_sse41.a obj/third_party/sfntly/libsfntly.a obj/skia/libskia_chrome.a obj/skia/libskia_chrome_opts.a obj/ui/events/libevents.a obj/ui/gfx/libgfx.a obj/third_party/libpng/libpng.a obj/ui/gfx/libgfx_geometry.a obj/third_party/libjpeg_turbo/libjpeg_turbo.a obj/ui/gfx/x/libgfx_x11.a obj/ui/events/libdom4_keycode_converter.a obj/ui/events/libevents_base.a obj/ui/events/libgesture_detection.a obj/ui/events/devices/libevents_devices.a obj/ui/events/platform/libevents_platform.a obj/ui/events/platform/x11/libx11_events_platform.a obj/gpu/libgpu_ipc.a obj/gpu/libcommand_buffer_common.a obj/gpu/command_buffer/libgles2_utils.a obj/ipc/libipc.a obj/chrome/libsafe_browsing_proto.a obj/third_party/protobuf/libprotobuf_lite.a obj/chrome/libcommon_constants.a obj/components/libbookmarks_common.a obj/components/libnacl_switches.a obj/components/libcloud_devices_common.a obj/google_apis/libgoogle_apis.a obj/third_party/libxml/libxml2.a obj/components/libcomponent_updater.a obj/components/libupdate_client.a obj/courgette/libcourgette_lib.a obj/third_party/lzma_sdk/liblzma_sdk.a obj/third_party/zlib/google/libzip.a obj/third_party/zlib/libminizip.a obj/components/libcrx_file.a obj/components/libcontent_settings_core_common.a obj/components/libjson_schema.a obj/third_party/re2/libre2.a obj/components/libmetrics.a obj/components/libcomponent_metrics_proto.a obj/components/libvariations.a obj/third_party/mt19937ar/libmt19937ar.a obj/components/libpolicy_component_common.a obj/components/libcloud_policy_proto.a obj/components/libpolicy.a obj/components/libcloud_policy_proto_generated_compile.a obj/components/libtranslate_core_common.a obj/content/libcontent_common.a obj/components/libtracing.a obj/ui/accessibility/libaccessibility.a obj/ui/accessibility/libax_gen.a obj/tools/json_schema_compiler/libapi_gen_util.a obj/ui/events/ipc/libevents_ipc.a obj/ui/gfx/ipc/libgfx_ipc.a obj/ui/shell_dialogs/libshell_dialogs.a obj/ui/aura/libaura.a obj/ui/compositor/libcompositor.a obj/cc/libcc.a obj/gpu/libcommand_buffer_client.a obj/gpu/libcommand_buffer_service.a obj/gpu/libdisk_cache_proto.a obj/third_party/smhasher/libcityhash.a obj/ui/gl/libgl_wrapper.a obj/third_party/angle/src/libtranslator.a obj/third_party/angle/src/libtranslator_lib.a obj/third_party/angle/src/libpreprocessor.a obj/third_party/angle/src/libangle_common.a obj/gpu/libgles2_cmd_helper.a obj/gpu/libgpu_config.a obj/build/linux/libpci.a obj/third_party/libXNVCtrl/libXNVCtrl.a obj/media/libmedia.a libyuv.a obj/third_party/opus/libopus.a obj/media/libshared_memory_support.a obj/third_party/ffmpeg/libffmpeg.a obj/third_party/libvpx/libvpx.a obj/third_party/libvpx/libvpx_intrinsics_mmx.a obj/third_party/libvpx/libvpx_intrinsics_sse2.a obj/third_party/libvpx/libvpx_intrinsics_ssse3.a obj/third_party/libvpx/libvpx_intrinsics_sse4_1.a obj/third_party/libvpx/libvpx_intrinsics_avx2.a obj/media/libmedia_asm.a obj/media/libmedia_sse2.a obj/cc/libcc_surfaces.a obj/gpu/blink/libgpu_blink.a obj/gpu/libgles2_c_lib.a obj/gpu/libgles2_implementation.a obj/gpu/libgl_in_process_context.a obj/gpu/skia_bindings/libgpu_skia_bindings.a obj/third_party/WebKit/Source/platform/libblink_common.a obj/third_party/WebKit/Source/wtf/libwtf.a obj/ipc/mojo/libipc_mojo.a obj/mojo/libmojo_environment_chromium.a obj/mojo/libmojo_environment_chromium_impl.a obj/mojo/libmojo_common_lib.a obj/third_party/mojo/libmojo_cpp_bindings.a obj/third_party/mojo/libmojo_system_impl.a obj/storage/libstorage_common.a obj/third_party/WebKit/Source/platform/libblink_platform.a obj/third_party/WebKit/Source/platform/libblink_heap_asm_stubs.a obj/third_party/libwebp/libwebp_dec.a obj/third_party/libwebp/libwebp_dsp.a obj/third_party/libwebp/libwebp_utils.a obj/third_party/libwebp/libwebp_demux.a obj/third_party/libwebp/libwebp_enc.a obj/third_party/ots/libots.a obj/third_party/brotli/libbrotli.a obj/third_party/qcms/libqcms.a obj/v8/tools/gyp/libv8_base.a obj/v8/tools/gyp/libv8_libbase.a obj/v8/tools/gyp/libv8_external_snapshot.a obj/third_party/iccjpeg/libiccjpeg.a obj/third_party/WebKit/Source/web/libblink_web.a obj/third_party/WebKit/Source/core/libwebcore_dom.a obj/third_party/libxslt/libxslt.a obj/third_party/sqlite/libsqlite3.a obj/third_party/WebKit/Source/core/libwebcore_html.a obj/third_party/WebKit/Source/core/libwebcore_remaining.a obj/third_party/WebKit/Source/core/libwebcore_rendering.a obj/third_party/WebKit/Source/core/libwebcore_svg.a obj/third_party/WebKit/Source/core/libwebcore_generated.a obj/gin/libgin.a obj/third_party/snappy/libsnappy.a obj/third_party/WebKit/Source/modules/libmodules.a obj/third_party/mojo/libmojo_application_bindings.a obj/webkit/common/gpu/libwebkit_gpu.a obj/ppapi/libppapi_shared.a obj/ui/surface/libsurface.a obj/third_party/libjingle/libjingle.a obj/third_party/webrtc/base/librtc_base.a obj/third_party/webrtc/base/librtc_base_approved.a obj/third_party/webrtc/libjingle/xmllite/librtc_xmllite.a obj/third_party/libjingle/libjingle_p2p_constants.a obj/device/usb/libdevice_usb.a obj/third_party/libusb/libusb.a obj/device/udev_linux/libudev_linux.a obj/build/linux/libudev.a obj/chrome/common/extensions/api/libchrome_api.a obj/extensions/common/api/libextensions_api.a obj/extensions/libextensions_common.a obj/components/liburl_matcher.a obj/device/bluetooth/libdevice_bluetooth.a obj/extensions/libextensions_common_constants.a obj/media/cast/libcast_net.a obj/media/cast/libcast_base.a obj/media/cast/libcast_logging_proto.a obj/components/libautofill_core_common.a obj/components/libautofill_content_common.a obj/components/libpassword_manager_core_common.a obj/components/libpassword_manager_content_common.a obj/components/libsignin_core_common.a obj/components/libtranslate_content_common.a obj/components/libtranslate_core_language_detection.a obj/components/libvisitedlink_common.a obj/components/libnacl_common.a obj/components/libprinting_common.a obj/chrome/libbrowser_ui.a obj/chrome/libcert_logger_proto.a obj/chrome/libbrowser_ui_views.a obj/ash/libash.a obj/components/libuser_manager.a obj/components/libwallpaper.a obj/content/libcontent_browser.a obj/device/vibration/libdevice_vibration.a obj/device/vibration/libdevice_vibration_mojo_bindings.a obj/device/battery/libdevice_battery.a obj/device/battery/libdevice_battery_mojo_bindings.a obj/dbus/libdbus.a obj/sql/libsql.a obj/ui/snapshot/libsnapshot.a obj/content/browser/service_worker/libservice_worker_proto.a obj/content/browser/speech/proto/libspeech_proto.a obj/content/libcontent_common_mojo_bindings.a obj/net/libhttp_server.a obj/storage/libstorage.a obj/third_party/leveldatabase/libleveldatabase.a obj/third_party/mojo/libmojo_js_bindings.a obj/ui/touch_selection/libui_touch_selection.a obj/sandbox/libsandbox_services.a obj/sandbox/libsuid_sandbox_client.a obj/sandbox/libseccomp_bpf.a obj/sandbox/libseccomp_bpf_helpers.a obj/jingle/libjingle_glue.a obj/third_party/libjingle/libjingle_webrtc.a obj/third_party/libjingle/libjingle_webrtc_common.a obj/third_party/libsrtp/libsrtp.a obj/third_party/webrtc/modules/libmedia_file.a obj/third_party/webrtc/system_wrappers/libsystem_wrappers.a obj/third_party/webrtc/modules/libvideo_capture_module_impl.a obj/third_party/webrtc/modules/libvideo_capture_module.a obj/third_party/webrtc/modules/libwebrtc_utility.a obj/third_party/webrtc/modules/libaudio_coding_module.a obj/third_party/webrtc/modules/libCNG.a obj/third_party/webrtc/common_audio/libcommon_audio.a obj/third_party/openmax_dl/dl/libopenmax_dl.a obj/third_party/webrtc/common_audio/libcommon_audio_sse2.a obj/third_party/webrtc/modules/libaudio_encoder_interface.a obj/third_party/webrtc/modules/libG711.a obj/third_party/webrtc/modules/libG722.a obj/third_party/webrtc/modules/libiLBC.a obj/third_party/webrtc/modules/libiSAC.a obj/third_party/webrtc/modules/libaudio_decoder_interface.a obj/third_party/webrtc/modules/libiSACFix.a obj/third_party/webrtc/modules/libPCM16B.a obj/third_party/webrtc/modules/libred.a obj/third_party/webrtc/modules/libwebrtc_opus.a obj/third_party/webrtc/modules/libneteq.a obj/third_party/webrtc/modules/libwebrtc_video_coding.a obj/third_party/webrtc/modules/libwebrtc_i420.a obj/third_party/webrtc/common_video/libcommon_video.a obj/third_party/webrtc/modules/video_coding/utility/libvideo_coding_utility.a obj/third_party/webrtc/modules/video_coding/codecs/vp8/libwebrtc_vp8.a obj/third_party/webrtc/modules/video_coding/codecs/vp9/libwebrtc_vp9.a obj/third_party/webrtc/modules/libvideo_render_module_impl.a obj/third_party/webrtc/modules/libvideo_render_module.a obj/third_party/usrsctp/libusrsctplib.a obj/third_party/webrtc/modules/libaudio_processing.a obj/third_party/webrtc/modules/libaudioproc_debug_proto.a obj/third_party/webrtc/modules/libaudio_processing_sse2.a obj/third_party/webrtc/modules/libdesktop_capture.a obj/third_party/webrtc/modules/libdesktop_capture_differ_sse2.a obj/sandbox/libc_urandom_override.a obj/ppapi/libppapi_ipc.a obj/third_party/flac/libflac.a obj/third_party/speex/libspeex.a obj/content/libcontent_child.a obj/content/libcontent_plugin.a obj/content/libcontent_renderer.a obj/cc/blink/libcc_blink.a obj/media/blink/libmedia_blink.a obj/third_party/mojo/libmojo_js_lib.a obj/ui/native_theme/libnative_theme.a obj/third_party/libjingle/libpeerconnection.a obj/third_party/webrtc/voice_engine/libvoice_engine.a obj/third_party/webrtc/modules/libaudio_conference_mixer.a obj/third_party/webrtc/modules/libaudio_device.a obj/third_party/webrtc/modules/libbitrate_controller.a obj/third_party/webrtc/modules/librtp_rtcp.a obj/third_party/webrtc/modules/libpaced_sender.a obj/third_party/webrtc/modules/libremote_bitrate_estimator.a obj/third_party/webrtc/libwebrtc.a obj/third_party/webrtc/libwebrtc_common.a obj/third_party/webrtc/video_engine/libvideo_engine_core.a obj/third_party/webrtc/modules/libvideo_processing.a obj/third_party/webrtc/modules/libvideo_processing_sse2.a obj/ppapi/libppapi_proxy.a obj/content/libcontent_utility.a obj/ui/accelerometer/libui_accelerometer.a obj/ui/app_list/libapp_list.a obj/components/libkeyed_service_core.a obj/ui/wm/libwm.a obj/ui/views/libviews.a obj/ui/display/libdisplay_util.a obj/ui/keyboard/libkeyboard.a obj/ui/message_center/libmessage_center.a obj/ui/views/controls/webview/libwebview.a obj/ui/content_accelerators/libui_content_accelerators.a obj/ui/web_dialogs/libweb_dialogs.a obj/components/libauto_login_parser.a obj/components/libdom_distiller_core.a obj/sync/libsync_core.a obj/sync/libattachment_store_proto.a obj/sync/libsync_proto.a obj/third_party/dom_distiller_js/libdom_distiller_js_proto.a obj/components/libleveldb_proto.a obj/components/libdistilled_page_proto.a obj/components/libpref_registry.a obj/components/libdom_distiller_webui.a obj/components/libfeedback_proto.a obj/components/libhistory_core_browser_proto.a obj/components/libinvalidation.a obj/jingle/libnotifier.a obj/third_party/cacheinvalidation/libcacheinvalidation.a obj/third_party/cacheinvalidation/libcacheinvalidation_proto_cpp.a obj/components/libgcm_driver.a obj/components/libos_crypt.a obj/google_apis/gcm/libgcm.a obj/components/libsignin_core_browser.a obj/components/libcontent_settings_core_browser.a obj/components/libwebdata_common.a obj/components/libonc_component.a obj/components/libpassword_manager_core_browser.a obj/components/libpassword_manager_core_browser_proto.a obj/components/libui_zoom.a obj/components/libapp_modal.a obj/components/libautofill_content_risk_proto.a obj/net/libnet_with_v8.a obj/native_client/src/trusted/service_runtime/libsel.a obj/native_client/src/trusted/service_runtime/libenv_cleanser.a obj/native_client/src/trusted/service_runtime/libnacl_error_code.a obj/native_client/src/shared/gio/libgio.a obj/native_client/src/shared/platform/libplatform.a obj/native_client/src/shared/srpc/libnonnacl_srpc.a obj/native_client/src/trusted/debug_stub/libdebug_stub.a obj/native_client/src/trusted/desc/libnrd_xfer.a obj/native_client/src/trusted/desc/libdesc_wrapper.a obj/native_client/src/shared/imc/libimc.a obj/native_client/src/trusted/nacl_base/libnacl_base.a obj/native_client/src/trusted/desc_cacheability/libdesc_cacheability.a obj/native_client/src/trusted/fault_injection/libnacl_fault_inject.a obj/native_client/src/trusted/interval_multiset/libnacl_interval.a obj/native_client/src/trusted/perf_counter/libnacl_perf_counter.a obj/native_client/src/trusted/platform_qualify/libplatform_qual_lib.a obj/native_client/src/trusted/cpu_features/libcpu_features.a obj/native_client/src/trusted/simple_service/libsimple_service.a obj/native_client/src/trusted/threading/libthread_interface.a obj/native_client/src/trusted/validator/libvalidation_cache.a obj/native_client/src/trusted/validator/libvalidators.a obj/native_client/src/trusted/service_runtime/arch/x86/libservice_runtime_x86_common.a obj/native_client/src/trusted/validator_ragel/libdfa_validate_x86_64.a obj/native_client/src/trusted/service_runtime/arch/x86_64/libservice_runtime_x86_64.a obj/native_client/src/trusted/validator_x86/libnccopy_x86_64.a obj/native_client/src/trusted/service_runtime/libnacl_signal.a obj/chrome/libsafe_browsing_chunk_proto.a obj/chrome/libsafe_browsing_report_proto.a obj/ash/libash_with_content.a obj/components/libconstrained_window.a obj/components/libweb_modal.a obj/extensions/components/libnative_app_window.a obj/extensions/libextensions_browser.a obj/components/libcopresence_endpoints.a obj/components/libkeyed_service_content.a obj/components/libuser_prefs.a obj/components/libsessions_content.a obj/components/libstorage_monitor.a obj/device/media_transfer_protocol/libdevice_media_transfer_protocol.a obj/device/media_transfer_protocol/libmtp_file_entry_proto.a obj/device/media_transfer_protocol/libmtp_storage_info_proto.a obj/components/libweb_cache_browser.a obj/components/libweb_cache_common.a obj/device/serial/libdevice_serial.a obj/extensions/browser/api/libextensions_api_registration.a obj/extensions/common/api/libcast_channel_proto.a obj/chrome/browser/ui/libgtk2ui/libgtk2ui.a obj/third_party/libaddressinput/libaddressinput.a obj/third_party/libaddressinput/libaddressinput_util.a obj/chrome/libbrowser_extensions.a obj/chrome/browser/extensions/api/libchrome_api_registration.a obj/components/libcopresence_proto.a obj/components/libcopresence.a obj/components/libproximity_auth.a obj/device/hid/libdevice_hid.a obj/device/core/libdevice_core.a obj/third_party/hunspell/libhunspell.a obj/extensions/components/libjavascript_dialog_extensions_client.a obj/chrome/libprobe_message_proto.a obj/components/libautofill_core_browser.a obj/third_party/fips181/libfips181.a obj/third_party/libphonenumber/libphonenumber.a obj/third_party/libphonenumber/libphonenumber_without_metadata.a obj/components/libinfobars_core.a obj/components/libbookmarks_browser.a obj/components/libfavicon_base.a obj/components/libquery_parser.a obj/components/libcaptive_portal.a obj/components/libdata_reduction_proxy_core_browser.a obj/components/libdata_reduction_proxy_core_common.a obj/components/libdomain_reliability.a obj/components/libenhanced_bookmarks.a obj/components/libenhanced_bookmarks_proto.a obj/components/libfavicon_core.a obj/components/libfeedback_component.a obj/components/libgoogle_core_browser.a obj/components/liburl_fixer.a obj/components/libhistory_core_browser.a obj/components/libhistory_core_common.a obj/components/libmetrics_gpu.a obj/components/libmetrics_net.a obj/components/libmetrics_profiler.a obj/components/libnavigation_metrics.a obj/components/libnetwork_time.a obj/components/libomnibox.a obj/components/libsearch.a obj/components/libsearch_engines.a obj/components/librappor.a obj/components/search_engines/libprepopulated_engines.a obj/components/libvariations_http_provider.a obj/components/libpolicy_component_browser.a obj/components/libprecache_core.a obj/components/libprecache_core_proto.a obj/components/librenderer_context_menu.a obj/components/libsearch_provider_logos.a obj/components/libsuggestions.a obj/components/libsync_driver.a obj/components/libtranslate_core_browser.a obj/components/liblanguage_usage_metrics.a obj/components/libwebdata_services.a obj/chrome/libapps.a obj/components/libautofill_content_browser.a obj/components/libdom_distiller_content.a obj/components/libhistory_content_browser.a obj/components/libnavigation_interception.a obj/components/libpacked_ct_ev_whitelist.a obj/components/libpassword_manager_content_browser.a obj/components/libpower.a obj/components/libprecache_content.a obj/components/libtranslate_content_browser.a obj/components/libvisitedlink_browser.a obj/components/libweb_resource.a obj/net/libnet_extras.a obj/testing/perf/libperf_test.a obj/chrome/libsync_file_system_drive_proto.a obj/components/libcryptauth.a obj/components/libcryptauth_proto.a obj/components/libnacl_browser.a obj/chrome/libpolicy_path_parser.a obj/components/libpdf_browser.a obj/components/libpdf_common.a obj/chrome/libsafe_browsing_metadata_proto.a obj/build/linux/libspeechd.a obj/components/libbreakpad_host.a obj/components/libcrash_component.a obj/components/libcrash_component_lib.a obj/breakpad/libbreakpad_client.a obj/components/libautofill_content_renderer.a obj/components/libcdm_renderer.a obj/components/libcdm_common.a obj/components/libnetwork_hints_renderer.a obj/components/liberror_page_renderer.a obj/components/libpassword_manager_content_renderer.a obj/components/libplugins_renderer.a obj/components/libtranslate_content_renderer.a obj/components/libvisitedlink_renderer.a obj/components/libweb_cache_renderer.a obj/components/libnacl.a obj/mojo/libmonacl_syscall.a obj/components/libnacl_renderer.a obj/native_client/src/trusted/nonnacl_util/libsel_ldr_launcher_base.a obj/native_client/src/shared/serialization/libserialization.a obj/ppapi/libppapi_cpp_objects.a obj/ppapi/libppapi_internal_module.a obj/third_party/jsoncpp/libjsoncpp.a obj/components/libpdf_renderer.a obj/third_party/smhasher/libmurmurhash3.a obj/extensions/libextensions_renderer.a obj/media/cast/libcast_sender.a obj/components/libprinting_renderer.a obj/extensions/libextensions_utility.a obj/third_party/cld_2/libcld2_static.a obj/remoting/libremoting_base.a obj/remoting/proto/libchromotocol_proto_lib.a obj/remoting/libremoting_client.a obj/remoting/libremoting_protocol.a --end-group -lrt -ldl -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -lsmime3 -lnss3 -lnssutil3 -lplds4 -lplc4 -lnspr4 -lpthread -lgconf-2 -lgio-2.0 -lresolv -lfontconfig -lfreetype -lpangocairo-1.0 -lcairo -lpangoft2-1.0 -lpango-1.0 -lharfbuzz -lX11 -lXi -lXcursor -lXext -lXfixes -lXrender -lXss -lXcomposite -lasound -lm -lXdamage -lXtst -lXrandr -lexpat -lcups -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lz -lcrypt -ldbus-1 -lcap -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lstdc++ -lm -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtendS.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crtn.o' (30 runs):

       6410.666507      task-clock (msec)         #    0.999 CPUs utilized            ( +-  0.20% )
                 3      context-switches          #    0.000 K/sec                    ( +-  6.07% )
                 0      cpu-migrations            #    0.000 K/sec                  
           266,965      page-faults               #    0.042 M/sec                  
    19,501,602,507      cycles                    #    3.042 GHz                      ( +-  0.04% )
     9,079,633,434      stalled-cycles-frontend   #   46.56% frontend cycles idle     ( +-  0.09% )
                 0      stalled-cycles-backend    #    0.00% backend  cycles idle   
    27,918,003,360      instructions              #    1.43  insns per cycle        
                                                  #    0.33  stalled cycles per insn  ( +-  0.00% )
     5,534,244,864      branches                  #  863.287 M/sec                    ( +-  0.00% )
        81,205,896      branch-misses             #    1.47% of all branches          ( +-  0.00% )

       6.415159106 seconds time elapsed                                          ( +-  0.20% )


[-- Attachment #4: patch.log --]
[-- Type: text/x-log, Size: 22753 bytes --]


 Performance counter stats for '/home/espindola/binutils/ld-patch -pie --hash-style=gnu --no-add-needed --build-id --gc-sections --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o chrome /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/Scrt1.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtbeginS.o -L. -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../.. -L/home/espindola/llvm/build-227431/bin/../lib -L/lib -L/usr/lib -z now -z relro --fatal-warnings -z defs -z noexecstack --disable-new-dtags --export-dynamic -uIsHeapProfilerRunning -uProfilerStart -u_Z21InitialMallocHook_NewPKvj -u_Z22InitialMallocHook_MMapPKvS0_jiiix -u_Z22InitialMallocHook_SbrkPKvi -u_Z21InitialMallocHook_NewPKvm -u_Z22InitialMallocHook_MMapPKvS0_miiil -u_Z22InitialMallocHook_SbrkPKvl -u_ZN15HeapLeakChecker12IgnoreObjectEPKv -u_ZN15HeapLeakChecker14UnIgnoreObjectEPKv -O1 --as-needed --start-group obj/chrome/app/chrome_initial.chrome_exe_main_aura.o obj/content/public/common/chrome_initial.content_switches.o obj/chrome/app/chrome_initial.chrome_main.o obj/chrome/app/chrome_initial.chrome_main_delegate.o obj/chrome/libcommon.a obj/chrome/libbrowser.a obj/chrome/libdebugger.a obj/ppapi/libppapi_host.a obj/printing/libprinting.a obj/chrome/libservice.a obj/chrome/libplugin.a obj/chrome/librenderer.a obj/chrome/libutility.a obj/content/libcontent_gpu.a obj/content/libcontent_ppapi_plugin.a obj/components/nacl/renderer/plugin/libnacl_trusted_plugin.a obj/remoting/libremoting_client_plugin.a obj/content/libcontent_app_both.a obj/chrome/libinstaller_util.a obj/base/allocator/liballocator.a obj/components/libstartup_metric_utils.a obj/chrome/libcommon_net.a obj/base/libbase.a obj/base/libbase_static.a obj/base/allocator/liballocator_extension_thunks.a obj/third_party/modp_b64/libmodp_b64.a obj/base/third_party/dynamic_annotations/libdynamic_annotations.a obj/base/libsymbolize.a obj/base/libxdg_mime.a obj/third_party/libevent/libevent.a obj/components/libnetwork_hints_common.a obj/components/liberror_page_common.a obj/url/liburl_lib.a obj/third_party/icu/libicui18n.a obj/third_party/icu/libicuuc.a obj/third_party/icu/libicudata.a obj/crypto/libcrcrypto.a obj/net/third_party/nss/libcrssl.a obj/net/libnet.a obj/base/libbase_i18n.a obj/base/libbase_prefs.a obj/sdch/libsdch.a obj/third_party/zlib/libchrome_zlib.a obj/third_party/zlib/libzlib_x86_simd.a obj/build/linux/libgio.a obj/ui/base/libui_base.a obj/skia/libskia_library.a obj/skia/libskia_opts.a obj/skia/libskia_opts_ssse3.a obj/skia/libskia_opts_sse41.a obj/third_party/sfntly/libsfntly.a obj/skia/libskia_chrome.a obj/skia/libskia_chrome_opts.a obj/ui/events/libevents.a obj/ui/gfx/libgfx.a obj/third_party/libpng/libpng.a obj/ui/gfx/libgfx_geometry.a obj/third_party/libjpeg_turbo/libjpeg_turbo.a obj/ui/gfx/x/libgfx_x11.a obj/ui/events/libdom4_keycode_converter.a obj/ui/events/libevents_base.a obj/ui/events/libgesture_detection.a obj/ui/events/devices/libevents_devices.a obj/ui/events/platform/libevents_platform.a obj/ui/events/platform/x11/libx11_events_platform.a obj/gpu/libgpu_ipc.a obj/gpu/libcommand_buffer_common.a obj/gpu/command_buffer/libgles2_utils.a obj/ipc/libipc.a obj/chrome/libsafe_browsing_proto.a obj/third_party/protobuf/libprotobuf_lite.a obj/chrome/libcommon_constants.a obj/components/libbookmarks_common.a obj/components/libnacl_switches.a obj/components/libcloud_devices_common.a obj/google_apis/libgoogle_apis.a obj/third_party/libxml/libxml2.a obj/components/libcomponent_updater.a obj/components/libupdate_client.a obj/courgette/libcourgette_lib.a obj/third_party/lzma_sdk/liblzma_sdk.a obj/third_party/zlib/google/libzip.a obj/third_party/zlib/libminizip.a obj/components/libcrx_file.a obj/components/libcontent_settings_core_common.a obj/components/libjson_schema.a obj/third_party/re2/libre2.a obj/components/libmetrics.a obj/components/libcomponent_metrics_proto.a obj/components/libvariations.a obj/third_party/mt19937ar/libmt19937ar.a obj/components/libpolicy_component_common.a obj/components/libcloud_policy_proto.a obj/components/libpolicy.a obj/components/libcloud_policy_proto_generated_compile.a obj/components/libtranslate_core_common.a obj/content/libcontent_common.a obj/components/libtracing.a obj/ui/accessibility/libaccessibility.a obj/ui/accessibility/libax_gen.a obj/tools/json_schema_compiler/libapi_gen_util.a obj/ui/events/ipc/libevents_ipc.a obj/ui/gfx/ipc/libgfx_ipc.a obj/ui/shell_dialogs/libshell_dialogs.a obj/ui/aura/libaura.a obj/ui/compositor/libcompositor.a obj/cc/libcc.a obj/gpu/libcommand_buffer_client.a obj/gpu/libcommand_buffer_service.a obj/gpu/libdisk_cache_proto.a obj/third_party/smhasher/libcityhash.a obj/ui/gl/libgl_wrapper.a obj/third_party/angle/src/libtranslator.a obj/third_party/angle/src/libtranslator_lib.a obj/third_party/angle/src/libpreprocessor.a obj/third_party/angle/src/libangle_common.a obj/gpu/libgles2_cmd_helper.a obj/gpu/libgpu_config.a obj/build/linux/libpci.a obj/third_party/libXNVCtrl/libXNVCtrl.a obj/media/libmedia.a libyuv.a obj/third_party/opus/libopus.a obj/media/libshared_memory_support.a obj/third_party/ffmpeg/libffmpeg.a obj/third_party/libvpx/libvpx.a obj/third_party/libvpx/libvpx_intrinsics_mmx.a obj/third_party/libvpx/libvpx_intrinsics_sse2.a obj/third_party/libvpx/libvpx_intrinsics_ssse3.a obj/third_party/libvpx/libvpx_intrinsics_sse4_1.a obj/third_party/libvpx/libvpx_intrinsics_avx2.a obj/media/libmedia_asm.a obj/media/libmedia_sse2.a obj/cc/libcc_surfaces.a obj/gpu/blink/libgpu_blink.a obj/gpu/libgles2_c_lib.a obj/gpu/libgles2_implementation.a obj/gpu/libgl_in_process_context.a obj/gpu/skia_bindings/libgpu_skia_bindings.a obj/third_party/WebKit/Source/platform/libblink_common.a obj/third_party/WebKit/Source/wtf/libwtf.a obj/ipc/mojo/libipc_mojo.a obj/mojo/libmojo_environment_chromium.a obj/mojo/libmojo_environment_chromium_impl.a obj/mojo/libmojo_common_lib.a obj/third_party/mojo/libmojo_cpp_bindings.a obj/third_party/mojo/libmojo_system_impl.a obj/storage/libstorage_common.a obj/third_party/WebKit/Source/platform/libblink_platform.a obj/third_party/WebKit/Source/platform/libblink_heap_asm_stubs.a obj/third_party/libwebp/libwebp_dec.a obj/third_party/libwebp/libwebp_dsp.a obj/third_party/libwebp/libwebp_utils.a obj/third_party/libwebp/libwebp_demux.a obj/third_party/libwebp/libwebp_enc.a obj/third_party/ots/libots.a obj/third_party/brotli/libbrotli.a obj/third_party/qcms/libqcms.a obj/v8/tools/gyp/libv8_base.a obj/v8/tools/gyp/libv8_libbase.a obj/v8/tools/gyp/libv8_external_snapshot.a obj/third_party/iccjpeg/libiccjpeg.a obj/third_party/WebKit/Source/web/libblink_web.a obj/third_party/WebKit/Source/core/libwebcore_dom.a obj/third_party/libxslt/libxslt.a obj/third_party/sqlite/libsqlite3.a obj/third_party/WebKit/Source/core/libwebcore_html.a obj/third_party/WebKit/Source/core/libwebcore_remaining.a obj/third_party/WebKit/Source/core/libwebcore_rendering.a obj/third_party/WebKit/Source/core/libwebcore_svg.a obj/third_party/WebKit/Source/core/libwebcore_generated.a obj/gin/libgin.a obj/third_party/snappy/libsnappy.a obj/third_party/WebKit/Source/modules/libmodules.a obj/third_party/mojo/libmojo_application_bindings.a obj/webkit/common/gpu/libwebkit_gpu.a obj/ppapi/libppapi_shared.a obj/ui/surface/libsurface.a obj/third_party/libjingle/libjingle.a obj/third_party/webrtc/base/librtc_base.a obj/third_party/webrtc/base/librtc_base_approved.a obj/third_party/webrtc/libjingle/xmllite/librtc_xmllite.a obj/third_party/libjingle/libjingle_p2p_constants.a obj/device/usb/libdevice_usb.a obj/third_party/libusb/libusb.a obj/device/udev_linux/libudev_linux.a obj/build/linux/libudev.a obj/chrome/common/extensions/api/libchrome_api.a obj/extensions/common/api/libextensions_api.a obj/extensions/libextensions_common.a obj/components/liburl_matcher.a obj/device/bluetooth/libdevice_bluetooth.a obj/extensions/libextensions_common_constants.a obj/media/cast/libcast_net.a obj/media/cast/libcast_base.a obj/media/cast/libcast_logging_proto.a obj/components/libautofill_core_common.a obj/components/libautofill_content_common.a obj/components/libpassword_manager_core_common.a obj/components/libpassword_manager_content_common.a obj/components/libsignin_core_common.a obj/components/libtranslate_content_common.a obj/components/libtranslate_core_language_detection.a obj/components/libvisitedlink_common.a obj/components/libnacl_common.a obj/components/libprinting_common.a obj/chrome/libbrowser_ui.a obj/chrome/libcert_logger_proto.a obj/chrome/libbrowser_ui_views.a obj/ash/libash.a obj/components/libuser_manager.a obj/components/libwallpaper.a obj/content/libcontent_browser.a obj/device/vibration/libdevice_vibration.a obj/device/vibration/libdevice_vibration_mojo_bindings.a obj/device/battery/libdevice_battery.a obj/device/battery/libdevice_battery_mojo_bindings.a obj/dbus/libdbus.a obj/sql/libsql.a obj/ui/snapshot/libsnapshot.a obj/content/browser/service_worker/libservice_worker_proto.a obj/content/browser/speech/proto/libspeech_proto.a obj/content/libcontent_common_mojo_bindings.a obj/net/libhttp_server.a obj/storage/libstorage.a obj/third_party/leveldatabase/libleveldatabase.a obj/third_party/mojo/libmojo_js_bindings.a obj/ui/touch_selection/libui_touch_selection.a obj/sandbox/libsandbox_services.a obj/sandbox/libsuid_sandbox_client.a obj/sandbox/libseccomp_bpf.a obj/sandbox/libseccomp_bpf_helpers.a obj/jingle/libjingle_glue.a obj/third_party/libjingle/libjingle_webrtc.a obj/third_party/libjingle/libjingle_webrtc_common.a obj/third_party/libsrtp/libsrtp.a obj/third_party/webrtc/modules/libmedia_file.a obj/third_party/webrtc/system_wrappers/libsystem_wrappers.a obj/third_party/webrtc/modules/libvideo_capture_module_impl.a obj/third_party/webrtc/modules/libvideo_capture_module.a obj/third_party/webrtc/modules/libwebrtc_utility.a obj/third_party/webrtc/modules/libaudio_coding_module.a obj/third_party/webrtc/modules/libCNG.a obj/third_party/webrtc/common_audio/libcommon_audio.a obj/third_party/openmax_dl/dl/libopenmax_dl.a obj/third_party/webrtc/common_audio/libcommon_audio_sse2.a obj/third_party/webrtc/modules/libaudio_encoder_interface.a obj/third_party/webrtc/modules/libG711.a obj/third_party/webrtc/modules/libG722.a obj/third_party/webrtc/modules/libiLBC.a obj/third_party/webrtc/modules/libiSAC.a obj/third_party/webrtc/modules/libaudio_decoder_interface.a obj/third_party/webrtc/modules/libiSACFix.a obj/third_party/webrtc/modules/libPCM16B.a obj/third_party/webrtc/modules/libred.a obj/third_party/webrtc/modules/libwebrtc_opus.a obj/third_party/webrtc/modules/libneteq.a obj/third_party/webrtc/modules/libwebrtc_video_coding.a obj/third_party/webrtc/modules/libwebrtc_i420.a obj/third_party/webrtc/common_video/libcommon_video.a obj/third_party/webrtc/modules/video_coding/utility/libvideo_coding_utility.a obj/third_party/webrtc/modules/video_coding/codecs/vp8/libwebrtc_vp8.a obj/third_party/webrtc/modules/video_coding/codecs/vp9/libwebrtc_vp9.a obj/third_party/webrtc/modules/libvideo_render_module_impl.a obj/third_party/webrtc/modules/libvideo_render_module.a obj/third_party/usrsctp/libusrsctplib.a obj/third_party/webrtc/modules/libaudio_processing.a obj/third_party/webrtc/modules/libaudioproc_debug_proto.a obj/third_party/webrtc/modules/libaudio_processing_sse2.a obj/third_party/webrtc/modules/libdesktop_capture.a obj/third_party/webrtc/modules/libdesktop_capture_differ_sse2.a obj/sandbox/libc_urandom_override.a obj/ppapi/libppapi_ipc.a obj/third_party/flac/libflac.a obj/third_party/speex/libspeex.a obj/content/libcontent_child.a obj/content/libcontent_plugin.a obj/content/libcontent_renderer.a obj/cc/blink/libcc_blink.a obj/media/blink/libmedia_blink.a obj/third_party/mojo/libmojo_js_lib.a obj/ui/native_theme/libnative_theme.a obj/third_party/libjingle/libpeerconnection.a obj/third_party/webrtc/voice_engine/libvoice_engine.a obj/third_party/webrtc/modules/libaudio_conference_mixer.a obj/third_party/webrtc/modules/libaudio_device.a obj/third_party/webrtc/modules/libbitrate_controller.a obj/third_party/webrtc/modules/librtp_rtcp.a obj/third_party/webrtc/modules/libpaced_sender.a obj/third_party/webrtc/modules/libremote_bitrate_estimator.a obj/third_party/webrtc/libwebrtc.a obj/third_party/webrtc/libwebrtc_common.a obj/third_party/webrtc/video_engine/libvideo_engine_core.a obj/third_party/webrtc/modules/libvideo_processing.a obj/third_party/webrtc/modules/libvideo_processing_sse2.a obj/ppapi/libppapi_proxy.a obj/content/libcontent_utility.a obj/ui/accelerometer/libui_accelerometer.a obj/ui/app_list/libapp_list.a obj/components/libkeyed_service_core.a obj/ui/wm/libwm.a obj/ui/views/libviews.a obj/ui/display/libdisplay_util.a obj/ui/keyboard/libkeyboard.a obj/ui/message_center/libmessage_center.a obj/ui/views/controls/webview/libwebview.a obj/ui/content_accelerators/libui_content_accelerators.a obj/ui/web_dialogs/libweb_dialogs.a obj/components/libauto_login_parser.a obj/components/libdom_distiller_core.a obj/sync/libsync_core.a obj/sync/libattachment_store_proto.a obj/sync/libsync_proto.a obj/third_party/dom_distiller_js/libdom_distiller_js_proto.a obj/components/libleveldb_proto.a obj/components/libdistilled_page_proto.a obj/components/libpref_registry.a obj/components/libdom_distiller_webui.a obj/components/libfeedback_proto.a obj/components/libhistory_core_browser_proto.a obj/components/libinvalidation.a obj/jingle/libnotifier.a obj/third_party/cacheinvalidation/libcacheinvalidation.a obj/third_party/cacheinvalidation/libcacheinvalidation_proto_cpp.a obj/components/libgcm_driver.a obj/components/libos_crypt.a obj/google_apis/gcm/libgcm.a obj/components/libsignin_core_browser.a obj/components/libcontent_settings_core_browser.a obj/components/libwebdata_common.a obj/components/libonc_component.a obj/components/libpassword_manager_core_browser.a obj/components/libpassword_manager_core_browser_proto.a obj/components/libui_zoom.a obj/components/libapp_modal.a obj/components/libautofill_content_risk_proto.a obj/net/libnet_with_v8.a obj/native_client/src/trusted/service_runtime/libsel.a obj/native_client/src/trusted/service_runtime/libenv_cleanser.a obj/native_client/src/trusted/service_runtime/libnacl_error_code.a obj/native_client/src/shared/gio/libgio.a obj/native_client/src/shared/platform/libplatform.a obj/native_client/src/shared/srpc/libnonnacl_srpc.a obj/native_client/src/trusted/debug_stub/libdebug_stub.a obj/native_client/src/trusted/desc/libnrd_xfer.a obj/native_client/src/trusted/desc/libdesc_wrapper.a obj/native_client/src/shared/imc/libimc.a obj/native_client/src/trusted/nacl_base/libnacl_base.a obj/native_client/src/trusted/desc_cacheability/libdesc_cacheability.a obj/native_client/src/trusted/fault_injection/libnacl_fault_inject.a obj/native_client/src/trusted/interval_multiset/libnacl_interval.a obj/native_client/src/trusted/perf_counter/libnacl_perf_counter.a obj/native_client/src/trusted/platform_qualify/libplatform_qual_lib.a obj/native_client/src/trusted/cpu_features/libcpu_features.a obj/native_client/src/trusted/simple_service/libsimple_service.a obj/native_client/src/trusted/threading/libthread_interface.a obj/native_client/src/trusted/validator/libvalidation_cache.a obj/native_client/src/trusted/validator/libvalidators.a obj/native_client/src/trusted/service_runtime/arch/x86/libservice_runtime_x86_common.a obj/native_client/src/trusted/validator_ragel/libdfa_validate_x86_64.a obj/native_client/src/trusted/service_runtime/arch/x86_64/libservice_runtime_x86_64.a obj/native_client/src/trusted/validator_x86/libnccopy_x86_64.a obj/native_client/src/trusted/service_runtime/libnacl_signal.a obj/chrome/libsafe_browsing_chunk_proto.a obj/chrome/libsafe_browsing_report_proto.a obj/ash/libash_with_content.a obj/components/libconstrained_window.a obj/components/libweb_modal.a obj/extensions/components/libnative_app_window.a obj/extensions/libextensions_browser.a obj/components/libcopresence_endpoints.a obj/components/libkeyed_service_content.a obj/components/libuser_prefs.a obj/components/libsessions_content.a obj/components/libstorage_monitor.a obj/device/media_transfer_protocol/libdevice_media_transfer_protocol.a obj/device/media_transfer_protocol/libmtp_file_entry_proto.a obj/device/media_transfer_protocol/libmtp_storage_info_proto.a obj/components/libweb_cache_browser.a obj/components/libweb_cache_common.a obj/device/serial/libdevice_serial.a obj/extensions/browser/api/libextensions_api_registration.a obj/extensions/common/api/libcast_channel_proto.a obj/chrome/browser/ui/libgtk2ui/libgtk2ui.a obj/third_party/libaddressinput/libaddressinput.a obj/third_party/libaddressinput/libaddressinput_util.a obj/chrome/libbrowser_extensions.a obj/chrome/browser/extensions/api/libchrome_api_registration.a obj/components/libcopresence_proto.a obj/components/libcopresence.a obj/components/libproximity_auth.a obj/device/hid/libdevice_hid.a obj/device/core/libdevice_core.a obj/third_party/hunspell/libhunspell.a obj/extensions/components/libjavascript_dialog_extensions_client.a obj/chrome/libprobe_message_proto.a obj/components/libautofill_core_browser.a obj/third_party/fips181/libfips181.a obj/third_party/libphonenumber/libphonenumber.a obj/third_party/libphonenumber/libphonenumber_without_metadata.a obj/components/libinfobars_core.a obj/components/libbookmarks_browser.a obj/components/libfavicon_base.a obj/components/libquery_parser.a obj/components/libcaptive_portal.a obj/components/libdata_reduction_proxy_core_browser.a obj/components/libdata_reduction_proxy_core_common.a obj/components/libdomain_reliability.a obj/components/libenhanced_bookmarks.a obj/components/libenhanced_bookmarks_proto.a obj/components/libfavicon_core.a obj/components/libfeedback_component.a obj/components/libgoogle_core_browser.a obj/components/liburl_fixer.a obj/components/libhistory_core_browser.a obj/components/libhistory_core_common.a obj/components/libmetrics_gpu.a obj/components/libmetrics_net.a obj/components/libmetrics_profiler.a obj/components/libnavigation_metrics.a obj/components/libnetwork_time.a obj/components/libomnibox.a obj/components/libsearch.a obj/components/libsearch_engines.a obj/components/librappor.a obj/components/search_engines/libprepopulated_engines.a obj/components/libvariations_http_provider.a obj/components/libpolicy_component_browser.a obj/components/libprecache_core.a obj/components/libprecache_core_proto.a obj/components/librenderer_context_menu.a obj/components/libsearch_provider_logos.a obj/components/libsuggestions.a obj/components/libsync_driver.a obj/components/libtranslate_core_browser.a obj/components/liblanguage_usage_metrics.a obj/components/libwebdata_services.a obj/chrome/libapps.a obj/components/libautofill_content_browser.a obj/components/libdom_distiller_content.a obj/components/libhistory_content_browser.a obj/components/libnavigation_interception.a obj/components/libpacked_ct_ev_whitelist.a obj/components/libpassword_manager_content_browser.a obj/components/libpower.a obj/components/libprecache_content.a obj/components/libtranslate_content_browser.a obj/components/libvisitedlink_browser.a obj/components/libweb_resource.a obj/net/libnet_extras.a obj/testing/perf/libperf_test.a obj/chrome/libsync_file_system_drive_proto.a obj/components/libcryptauth.a obj/components/libcryptauth_proto.a obj/components/libnacl_browser.a obj/chrome/libpolicy_path_parser.a obj/components/libpdf_browser.a obj/components/libpdf_common.a obj/chrome/libsafe_browsing_metadata_proto.a obj/build/linux/libspeechd.a obj/components/libbreakpad_host.a obj/components/libcrash_component.a obj/components/libcrash_component_lib.a obj/breakpad/libbreakpad_client.a obj/components/libautofill_content_renderer.a obj/components/libcdm_renderer.a obj/components/libcdm_common.a obj/components/libnetwork_hints_renderer.a obj/components/liberror_page_renderer.a obj/components/libpassword_manager_content_renderer.a obj/components/libplugins_renderer.a obj/components/libtranslate_content_renderer.a obj/components/libvisitedlink_renderer.a obj/components/libweb_cache_renderer.a obj/components/libnacl.a obj/mojo/libmonacl_syscall.a obj/components/libnacl_renderer.a obj/native_client/src/trusted/nonnacl_util/libsel_ldr_launcher_base.a obj/native_client/src/shared/serialization/libserialization.a obj/ppapi/libppapi_cpp_objects.a obj/ppapi/libppapi_internal_module.a obj/third_party/jsoncpp/libjsoncpp.a obj/components/libpdf_renderer.a obj/third_party/smhasher/libmurmurhash3.a obj/extensions/libextensions_renderer.a obj/media/cast/libcast_sender.a obj/components/libprinting_renderer.a obj/extensions/libextensions_utility.a obj/third_party/cld_2/libcld2_static.a obj/remoting/libremoting_base.a obj/remoting/proto/libchromotocol_proto_lib.a obj/remoting/libremoting_client.a obj/remoting/libremoting_protocol.a --end-group -lrt -ldl -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -lsmime3 -lnss3 -lnssutil3 -lplds4 -lplc4 -lnspr4 -lpthread -lgconf-2 -lgio-2.0 -lresolv -lfontconfig -lfreetype -lpangocairo-1.0 -lcairo -lpangoft2-1.0 -lpango-1.0 -lharfbuzz -lX11 -lXi -lXcursor -lXext -lXfixes -lXrender -lXss -lXcomposite -lasound -lm -lXdamage -lXtst -lXrandr -lexpat -lcups -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lz -lcrypt -ldbus-1 -lcap -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lstdc++ -lm -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtendS.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crtn.o' (30 runs):

       6401.969857      task-clock (msec)         #    0.999 CPUs utilized            ( +-  0.19% )
                 3      context-switches          #    0.000 K/sec                    ( +-  5.68% )
                 0      cpu-migrations            #    0.000 K/sec                  
           265,300      page-faults               #    0.041 M/sec                  
    19,477,104,133      cycles                    #    3.042 GHz                      ( +-  0.04% )
     8,945,865,937      stalled-cycles-frontend   #   45.93% frontend cycles idle     ( +-  0.09% )
                 0      stalled-cycles-backend    #    0.00% backend  cycles idle   
    27,808,410,820      instructions              #    1.43  insns per cycle        
                                                  #    0.32  stalled cycles per insn  ( +-  0.00% )
     5,499,248,193      branches                  #  858.993 M/sec                    ( +-  0.00% )
        81,882,483      branch-misses             #    1.49% of all branches          ( +-  0.00% )

       6.406455897 seconds time elapsed                                          ( +-  0.19% )


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [patch] Ignore non relobj files in gc
  2015-04-23  2:27 [patch] Ignore non relobj files in gc Rafael Espíndola
@ 2015-04-27 20:17 ` Cary Coutant
  2015-04-27 22:03   ` Rafael Espíndola
  2015-04-28 18:16   ` Sriraman Tallam
  0 siblings, 2 replies; 5+ messages in thread
From: Cary Coutant @ 2015-04-27 20:17 UTC (permalink / raw)
  To: Rafael Espíndola; +Cc: Binutils, Sriraman Tallam

[-- Attachment #1: Type: text/plain, Size: 2233 bytes --]

> If a relocation points to a dynamic object we can ignore it, since we
> cannot gc an already existing .so file.
>
> The attached patch produces an identical chromium binary, but does so
> a bit faster (see the attached perf logs).

I'd think the one-line patch below accomplishes the same result with
much less disruption:

@@ -340,7 +341,7 @@ gc_process_relocs(
                                                          src_obj));
            }

-          if (gsym->source() != Symbol::FROM_OBJECT)
+          if (dst_obj == NULL || dst_obj->is_dynamic())
             continue;
           if (!is_ordinary)
             continue;

> Using Relobj also helps me in my patch for gcing parts of SHF_MERGE sections.

If that's the case, let's move those changes to a separate patch.
Nevertheless, I think it would be cleaner to change Section_id to use
a Relobj* directly. That has some cascading effects, but doesn't
affect quite as much target-independent code, and we really never need
a Section_id that refers to a non-relocatable object. The attached
patch does that.

Sri, would you mind taking a look to make sure I haven't done anything
in the attached patch that might break --icf? Here's the only place
where we might have created a Section_id with a pointer to a Dynobj,
but I don't think that makes sense:

@@ -324,8 +326,11 @@ gc_process_relocs(
           if (is_icf_tracked)
             {
              Address symvalue = dst_off - addend;
-              if (is_ordinary && gsym->source() == Symbol::FROM_OBJECT)
-               (*secvec).push_back(Section_id(dst_obj, dst_indx));
+              if (is_ordinary
+                 && gsym->source() == Symbol::FROM_OBJECT
+                 && !dst_obj->is_dynamic())
+               (*secvec).push_back(Section_id(static_cast<Relobj*>(dst_obj),
+                                              dst_indx));
              else
                 (*secvec).push_back(Section_id(NULL, 0));
               (*symvec).push_back(gsym);

Perhaps it does make sense here to track a relocation pointing into a
dynamic object, but in this case, the static_cast might still be OK,
since I think at this point, we're only using the object pointer as an
opaque ID for the object.

-cary

[-- Attachment #2: gold-section-id.patch --]
[-- Type: application/octet-stream, Size: 13511 bytes --]

diff --git a/gold/gc.h b/gold/gc.h
index bf4023d..4db101a 100644
--- a/gold/gc.h
+++ b/gold/gc.h
@@ -87,7 +87,7 @@ class Garbage_collection
   do_transitive_closure();
 
   bool
-  is_section_garbage(Object* obj, unsigned int shndx)
+  is_section_garbage(Relobj* obj, unsigned int shndx)
   { return (this->referenced_list().find(Section_id(obj, shndx))
             == this->referenced_list().end()); }
 
@@ -103,8 +103,8 @@ class Garbage_collection
   // Add a reference from the SRC_SHNDX-th section of SRC_OBJECT to
   // DST_SHNDX-th section of DST_OBJECT.
   void
-  add_reference(Object* src_object, unsigned int src_shndx,
-		Object* dst_object, unsigned int dst_shndx)
+  add_reference(Relobj* src_object, unsigned int src_shndx,
+		Relobj* dst_object, unsigned int dst_shndx)
   {
     Section_id src_id(src_object, src_shndx);
     Section_id dst_id(dst_object, dst_shndx);
@@ -249,7 +249,7 @@ gc_process_relocs(
             {
 	      Address symvalue = dst_off - addend;
 	      if (is_ordinary) 
-		(*secvec).push_back(Section_id(dst_obj, dst_indx));
+		(*secvec).push_back(Section_id(src_obj, dst_indx));
 	      else
                 (*secvec).push_back(Section_id(NULL, 0));
               (*symvec).push_back(NULL);
@@ -301,12 +301,14 @@ gc_process_relocs(
 	  // of a function pointer being taken.
 	  if (gsym->source() == Symbol::FROM_OBJECT
               && check_section_for_function_pointers
-              && gsym->type() != elfcpp::STT_OBJECT
+              && dst_obj != NULL
+              && !dst_obj->is_dynamic()
               && (!is_ordinary
                   || scan.global_reloc_may_be_function_pointer(
                        symtab, NULL, NULL, src_obj, src_indx, NULL, reloc,
                        r_type, gsym)))
-            symtab->icf()->set_section_has_function_pointers(dst_obj, dst_indx);
+            symtab->icf()->set_section_has_function_pointers(
+		static_cast<Relobj*>(dst_obj), dst_indx);
 
           // If the symbol name matches '__start_XXX' then the section with
           // the C identifier like name 'XXX' should not be garbage collected.
@@ -324,8 +326,11 @@ gc_process_relocs(
           if (is_icf_tracked)
             {
 	      Address symvalue = dst_off - addend;
-              if (is_ordinary && gsym->source() == Symbol::FROM_OBJECT)
-		(*secvec).push_back(Section_id(dst_obj, dst_indx));
+              if (is_ordinary
+		  && gsym->source() == Symbol::FROM_OBJECT
+		  && !dst_obj->is_dynamic())
+		(*secvec).push_back(Section_id(static_cast<Relobj*>(dst_obj),
+					       dst_indx));
 	      else
                 (*secvec).push_back(Section_id(NULL, 0));
               (*symvec).push_back(gsym);
@@ -340,17 +345,19 @@ gc_process_relocs(
                                                          src_obj));
 	    }
 
-          if (gsym->source() != Symbol::FROM_OBJECT)
+          if (dst_obj == NULL || dst_obj->is_dynamic())
             continue;
           if (!is_ordinary)
             continue;
         }
       if (parameters->options().gc_sections())
         {
-	  symtab->gc()->add_reference(src_obj, src_indx, dst_obj, dst_indx);
+	  symtab->gc()->add_reference(src_obj, src_indx,
+				      static_cast<Relobj*>(dst_obj), dst_indx);
 	  parameters->sized_target<size, big_endian>()
 	    ->gc_add_reference(symtab, src_obj, src_indx,
-			       dst_obj, dst_indx, dst_off);
+			       static_cast<Relobj*>(dst_obj),
+			       dst_indx, dst_off);
           if (cident_section_name != NULL)
             {
               Garbage_collection::Cident_section_map::iterator ele =
diff --git a/gold/icf.cc b/gold/icf.cc
index 8de6386..96b7f2d 100644
--- a/gold/icf.cc
+++ b/gold/icf.cc
@@ -787,7 +787,7 @@ Icf::find_identical_sections(const Input_objects* input_objects,
       else if (sym->source() == Symbol::FROM_OBJECT 
                && !sym->object()->is_dynamic())
         {
-          Object* obj = sym->object();
+          Relobj* obj = static_cast<Relobj*>(sym->object());
           bool is_ordinary;
           unsigned int shndx = sym->shndx(&is_ordinary);
           if (is_ordinary)
@@ -804,7 +804,7 @@ Icf::find_identical_sections(const Input_objects* input_objects,
 // Unfolds the section denoted by OBJ and SHNDX if folded.
 
 void
-Icf::unfold_section(Object* obj, unsigned int shndx)
+Icf::unfold_section(Relobj* obj, unsigned int shndx)
 {
   Section_id secn(obj, shndx);
   Uniq_secn_id_map::iterator it = this->section_id_.find(secn);
@@ -821,7 +821,7 @@ Icf::unfold_section(Object* obj, unsigned int shndx)
 // is different from this section.
 
 bool
-Icf::is_section_folded(Object* obj, unsigned int shndx)
+Icf::is_section_folded(Relobj* obj, unsigned int shndx)
 {
   Section_id secn(obj, shndx);
   Uniq_secn_id_map::iterator it = this->section_id_.find(secn);
@@ -835,7 +835,7 @@ Icf::is_section_folded(Object* obj, unsigned int shndx)
 // This function returns the folded section for the given section.
 
 Section_id
-Icf::get_folded_section(Object* dup_obj, unsigned int dup_shndx)
+Icf::get_folded_section(Relobj* dup_obj, unsigned int dup_shndx)
 {
   Section_id dup_secn(dup_obj, dup_shndx);
   Uniq_secn_id_map::iterator it = this->section_id_.find(dup_secn);
diff --git a/gold/icf.h b/gold/icf.h
index d343fa5..7faf816 100644
--- a/gold/icf.h
+++ b/gold/icf.h
@@ -74,7 +74,7 @@ class Icf
   // Returns the kept folded identical section corresponding to
   // dup_obj and dup_shndx.
   Section_id
-  get_folded_section(Object* dup_obj, unsigned int dup_shndx);
+  get_folded_section(Relobj* dup_obj, unsigned int dup_shndx);
 
   // Forms groups of identical sections where the first member
   // of each group is the kept section during folding.
@@ -95,17 +95,17 @@ class Icf
 
   // Unfolds the section denoted by OBJ and SHNDX if folded.
   void
-  unfold_section(Object* obj, unsigned int shndx);
+  unfold_section(Relobj* obj, unsigned int shndx);
 
   // Returns the kept section corresponding to the
   // given section.
   bool
-  is_section_folded(Object* obj, unsigned int shndx);
+  is_section_folded(Relobj* obj, unsigned int shndx);
 
   // Given an object and a section index, this returns true if the
   // pointer of the function defined in this section is taken.
   bool
-  section_has_function_pointers(Object* obj, unsigned int shndx)
+  section_has_function_pointers(Relobj* obj, unsigned int shndx)
   {
     return (this->fptr_section_id_.find(Section_id(obj, shndx))
             != this->fptr_section_id_.end());
@@ -114,7 +114,7 @@ class Icf
   // Records that a pointer of the function defined in this section
   // is taken.
   void
-  set_section_has_function_pointers(Object* obj, unsigned int shndx)
+  set_section_has_function_pointers(Relobj* obj, unsigned int shndx)
   {
     this->fptr_section_id_.insert(Section_id(obj, shndx));
   }
diff --git a/gold/object.h b/gold/object.h
index fc93abd..a3d5d0e 100644
--- a/gold/object.h
+++ b/gold/object.h
@@ -2863,11 +2863,11 @@ struct Relocate_info
 
 // This is used to represent a section in an object and is used as the
 // key type for various section maps.
-typedef std::pair<Object*, unsigned int> Section_id;
+typedef std::pair<Relobj*, unsigned int> Section_id;
 
 // This is similar to Section_id but is used when the section
 // pointers are const.
-typedef std::pair<const Object*, unsigned int> Const_section_id;
+typedef std::pair<const Relobj*, unsigned int> Const_section_id;
 
 // The hash value is based on the address of an object in memory during
 // linking.  It is okay to use this for looking up sections but never use
diff --git a/gold/output.cc b/gold/output.cc
index ee6c475..781fbfb 100644
--- a/gold/output.cc
+++ b/gold/output.cc
@@ -3501,7 +3501,7 @@ Output_section::update_section_layout(
       if (p->is_input_section()
 	  || p->is_relaxed_input_section())
 	{
-	  Object* obj = (p->is_input_section()
+	  Relobj* obj = (p->is_input_section()
 			 ? p->relobj()
 			 : p->relaxed_input_section()->relobj());
 	  unsigned int shndx = p->shndx();
diff --git a/gold/output.h b/gold/output.h
index 318af36..be72965 100644
--- a/gold/output.h
+++ b/gold/output.h
@@ -2904,7 +2904,7 @@ class Output_section_lookup_maps
 
   // Find a relaxed input section of OBJECT with index SHNDX.
   Output_relaxed_input_section*
-  find_relaxed_input_section(const Object* object, unsigned int shndx) const
+  find_relaxed_input_section(const Relobj* object, unsigned int shndx) const
   {
     gold_assert(this->is_valid_);
     Relaxed_input_sections_by_id::const_iterator p =
diff --git a/gold/plugin.cc b/gold/plugin.cc
index 68da8e3..1588f34 100644
--- a/gold/plugin.cc
+++ b/gold/plugin.cc
@@ -1731,10 +1731,10 @@ update_section_order(const struct ld_plugin_section* section_list,
     {
       Object* obj = parameters->options().plugins()->get_elf_object(
           section_list[i].handle);
-      if (obj == NULL)
+      if (obj == NULL || obj->is_dynamic())
 	return LDPS_BAD_HANDLE;
       unsigned int shndx = section_list[i].shndx;
-      Section_id secn_id(obj, shndx);
+      Section_id secn_id(static_cast<Relobj*>(obj), shndx);
       (*order_map)[secn_id] = i + 1;
     }
 
@@ -1800,10 +1800,10 @@ unique_segment_for_sections(const char* segment_name,
     {
       Object* obj = parameters->options().plugins()->get_elf_object(
           section_list[i].handle);
-      if (obj == NULL)
+      if (obj == NULL || obj->is_dynamic())
 	return LDPS_BAD_HANDLE;
       unsigned int shndx = section_list[i].shndx;
-      Const_section_id secn_id(obj, shndx);
+      Const_section_id secn_id(static_cast<Relobj*>(obj), shndx);
       layout->insert_section_segment_map(secn_id, s);
     }
 
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index fddf3fa..29abd5e 100644
--- a/gold/powerpc.cc
+++ b/gold/powerpc.cc
@@ -212,7 +212,7 @@ public:
   // Add a reference from SRC_OBJ, SRC_INDX to this object's .opd
   // section at DST_OFF.
   void
-  add_reference(Object* src_obj,
+  add_reference(Relobj* src_obj,
 		unsigned int src_indx,
 		typename elfcpp::Elf_types<size>::Elf_Addr dst_off)
   {
@@ -780,9 +780,9 @@ class Target_powerpc : public Sized_target<size, big_endian>
   // section of a function descriptor.
   void
   do_gc_add_reference(Symbol_table* symtab,
-		      Object* src_obj,
+		      Relobj* src_obj,
 		      unsigned int src_shndx,
-		      Object* dst_obj,
+		      Relobj* dst_obj,
 		      unsigned int dst_shndx,
 		      Address dst_off) const;
 
@@ -6347,7 +6347,7 @@ Target_powerpc<size, big_endian>::gc_process_relocs(
 	  typename Powerpc_relobj<size, big_endian>::Section_refs::iterator s;
 	  for (s = p->second.begin(); s != p->second.end(); ++s)
 	    {
-	      Object* src_obj = s->first;
+	      Relobj* src_obj = s->first;
 	      unsigned int src_indx = s->second;
 	      symtab->gc()->add_reference(src_obj, src_indx,
 					  ppc_object, dst_indx);
@@ -6384,9 +6384,9 @@ template<int size, bool big_endian>
 void
 Target_powerpc<size, big_endian>::do_gc_add_reference(
     Symbol_table* symtab,
-    Object* src_obj,
+    Relobj* src_obj,
     unsigned int src_shndx,
-    Object* dst_obj,
+    Relobj* dst_obj,
     unsigned int dst_shndx,
     Address dst_off) const
 {
diff --git a/gold/symtab.cc b/gold/symtab.cc
index d2ed352..925296a 100644
--- a/gold/symtab.cc
+++ b/gold/symtab.cc
@@ -585,7 +585,7 @@ Symbol_table::Symbol_table_eq::operator()(const Symbol_table_key& k1,
 }
 
 bool
-Symbol_table::is_section_folded(Object* obj, unsigned int shndx) const
+Symbol_table::is_section_folded(Relobj* obj, unsigned int shndx) const
 {
   return (parameters->options().icf_enabled()
           && this->icf_->is_section_folded(obj, shndx));
@@ -650,10 +650,11 @@ Symbol_table::gc_mark_symbol(Symbol* sym)
   // Add the object and section to the work list.
   bool is_ordinary;
   unsigned int shndx = sym->shndx(&is_ordinary);
-  if (is_ordinary && shndx != elfcpp::SHN_UNDEF)
+  if (is_ordinary && shndx != elfcpp::SHN_UNDEF && !sym->object()->is_dynamic())
     {
       gold_assert(this->gc_!= NULL);
-      this->gc_->worklist().push_back(Section_id(sym->object(), shndx));
+      Relobj* relobj = static_cast<Relobj*>(sym->object());
+      this->gc_->worklist().push_back(Section_id(relobj, shndx));
     }
   parameters->target().gc_mark_symbol(this, sym);
 }
diff --git a/gold/symtab.h b/gold/symtab.h
index 6f47c5e..f6c0ac6 100644
--- a/gold/symtab.h
+++ b/gold/symtab.h
@@ -1372,7 +1372,7 @@ class Symbol_table
  
   // Returns true if ICF determined that this is a duplicate section. 
   bool
-  is_section_folded(Object* obj, unsigned int shndx) const;
+  is_section_folded(Relobj* obj, unsigned int shndx) const;
 
   void
   set_gc(Garbage_collection* gc)
diff --git a/gold/target.h b/gold/target.h
index 95bc57e..dfbc5ee 100644
--- a/gold/target.h
+++ b/gold/target.h
@@ -1056,9 +1056,9 @@ class Sized_target : public Target
   // and DST_OFF.
   void
   gc_add_reference(Symbol_table* symtab,
-		   Object* src_obj,
+		   Relobj* src_obj,
 		   unsigned int src_shndx,
-		   Object* dst_obj,
+		   Relobj* dst_obj,
 		   unsigned int dst_shndx,
 		   typename elfcpp::Elf_types<size>::Elf_Addr dst_off) const
   {
@@ -1080,8 +1080,8 @@ class Sized_target : public Target
 
   // Handle target specific gc actions when adding a gc reference.
   virtual void
-  do_gc_add_reference(Symbol_table*, Object*, unsigned int,
-		      Object*, unsigned int,
+  do_gc_add_reference(Symbol_table*, Relobj*, unsigned int,
+		      Relobj*, unsigned int,
 		      typename elfcpp::Elf_types<size>::Elf_Addr) const
   { }
 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [patch] Ignore non relobj files in gc
  2015-04-27 20:17 ` Cary Coutant
@ 2015-04-27 22:03   ` Rafael Espíndola
  2015-05-02 15:49     ` Cary Coutant
  2015-04-28 18:16   ` Sriraman Tallam
  1 sibling, 1 reply; 5+ messages in thread
From: Rafael Espíndola @ 2015-04-27 22:03 UTC (permalink / raw)
  To: Cary Coutant; +Cc: Binutils, Sriraman Tallam

[-- Attachment #1: Type: text/plain, Size: 1547 bytes --]

On 27 April 2015 at 16:17, Cary Coutant <ccoutant@gmail.com> wrote:
>> If a relocation points to a dynamic object we can ignore it, since we
>> cannot gc an already existing .so file.
>>
>> The attached patch produces an identical chromium binary, but does so
>> a bit faster (see the attached perf logs).
>
> I'd think the one-line patch below accomplishes the same result with
> much less disruption:
>
> @@ -340,7 +341,7 @@ gc_process_relocs(
>                                                           src_obj));
>             }
>
> -          if (gsym->source() != Symbol::FROM_OBJECT)
> +          if (dst_obj == NULL || dst_obj->is_dynamic())
>              continue;
>            if (!is_ordinary)
>              continue;

What about the attached compromise patch? It changes the type of just
the local variable.


>> Using Relobj also helps me in my patch for gcing parts of SHF_MERGE sections.
>
> If that's the case, let's move those changes to a separate patch.
> Nevertheless, I think it would be cleaner to change Section_id to use
> a Relobj* directly. That has some cascading effects, but doesn't
> affect quite as much target-independent code, and we really never need
> a Section_id that refers to a non-relocatable object. The attached
> patch does that.

It is nicer. I started the patch trying it, hit the icf code and
backed out a bit.

Cheers,
Rafael

2015-04-27  Rafael Ávila de Espíndola <rafael.espindola@gmail.com>

* gc.h (gc_process_relocs): Ignore non relobj files in gc.

[-- Attachment #2: t.patch --]
[-- Type: text/x-patch, Size: 1282 bytes --]

diff --git a/gold/gc.h b/gold/gc.h
index bf4023d..8f47e9c 100644
--- a/gold/gc.h
+++ b/gold/gc.h
@@ -229,7 +229,7 @@ gc_process_relocs(
       unsigned int r_type = elfcpp::elf_r_type<size>(r_info);
       typename elfcpp::Elf_types<size>::Elf_Swxword addend =
       Reloc_types<sh_type, size, big_endian>::get_reloc_addend_noerror(&reloc);
-      Object* dst_obj;
+      Relobj* dst_obj;
       unsigned int dst_indx;
       typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
       Address dst_off;
@@ -291,7 +291,10 @@ gc_process_relocs(
           bool is_ordinary = false;
           if (gsym->source() == Symbol::FROM_OBJECT)
             {
-              dst_obj = gsym->object();
+              Object* obj = gsym->object();
+              dst_obj = (obj && !obj->is_dynamic())
+                ? static_cast<Relobj*>(obj)
+                : NULL;
               dst_indx = gsym->shndx(&is_ordinary);
             }
 	  dst_off = static_cast<const Sized_symbol<size>*>(gsym)->value();
@@ -340,7 +343,7 @@ gc_process_relocs(
                                                          src_obj));
 	    }
 
-          if (gsym->source() != Symbol::FROM_OBJECT)
+          if (dst_obj == NULL)
             continue;
           if (!is_ordinary)
             continue;

[-- Attachment #3: master.log --]
[-- Type: text/x-log, Size: 22754 bytes --]


 Performance counter stats for '/home/espindola/binutils/ld-master -pie --hash-style=gnu --no-add-needed --build-id --gc-sections --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o chrome /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/Scrt1.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtbeginS.o -L. -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../.. -L/home/espindola/llvm/build-227431/bin/../lib -L/lib -L/usr/lib -z now -z relro --fatal-warnings -z defs -z noexecstack --disable-new-dtags --export-dynamic -uIsHeapProfilerRunning -uProfilerStart -u_Z21InitialMallocHook_NewPKvj -u_Z22InitialMallocHook_MMapPKvS0_jiiix -u_Z22InitialMallocHook_SbrkPKvi -u_Z21InitialMallocHook_NewPKvm -u_Z22InitialMallocHook_MMapPKvS0_miiil -u_Z22InitialMallocHook_SbrkPKvl -u_ZN15HeapLeakChecker12IgnoreObjectEPKv -u_ZN15HeapLeakChecker14UnIgnoreObjectEPKv -O1 --as-needed --start-group obj/chrome/app/chrome_initial.chrome_exe_main_aura.o obj/content/public/common/chrome_initial.content_switches.o obj/chrome/app/chrome_initial.chrome_main.o obj/chrome/app/chrome_initial.chrome_main_delegate.o obj/chrome/libcommon.a obj/chrome/libbrowser.a obj/chrome/libdebugger.a obj/ppapi/libppapi_host.a obj/printing/libprinting.a obj/chrome/libservice.a obj/chrome/libplugin.a obj/chrome/librenderer.a obj/chrome/libutility.a obj/content/libcontent_gpu.a obj/content/libcontent_ppapi_plugin.a obj/components/nacl/renderer/plugin/libnacl_trusted_plugin.a obj/remoting/libremoting_client_plugin.a obj/content/libcontent_app_both.a obj/chrome/libinstaller_util.a obj/base/allocator/liballocator.a obj/components/libstartup_metric_utils.a obj/chrome/libcommon_net.a obj/base/libbase.a obj/base/libbase_static.a obj/base/allocator/liballocator_extension_thunks.a obj/third_party/modp_b64/libmodp_b64.a obj/base/third_party/dynamic_annotations/libdynamic_annotations.a obj/base/libsymbolize.a obj/base/libxdg_mime.a obj/third_party/libevent/libevent.a obj/components/libnetwork_hints_common.a obj/components/liberror_page_common.a obj/url/liburl_lib.a obj/third_party/icu/libicui18n.a obj/third_party/icu/libicuuc.a obj/third_party/icu/libicudata.a obj/crypto/libcrcrypto.a obj/net/third_party/nss/libcrssl.a obj/net/libnet.a obj/base/libbase_i18n.a obj/base/libbase_prefs.a obj/sdch/libsdch.a obj/third_party/zlib/libchrome_zlib.a obj/third_party/zlib/libzlib_x86_simd.a obj/build/linux/libgio.a obj/ui/base/libui_base.a obj/skia/libskia_library.a obj/skia/libskia_opts.a obj/skia/libskia_opts_ssse3.a obj/skia/libskia_opts_sse41.a obj/third_party/sfntly/libsfntly.a obj/skia/libskia_chrome.a obj/skia/libskia_chrome_opts.a obj/ui/events/libevents.a obj/ui/gfx/libgfx.a obj/third_party/libpng/libpng.a obj/ui/gfx/libgfx_geometry.a obj/third_party/libjpeg_turbo/libjpeg_turbo.a obj/ui/gfx/x/libgfx_x11.a obj/ui/events/libdom4_keycode_converter.a obj/ui/events/libevents_base.a obj/ui/events/libgesture_detection.a obj/ui/events/devices/libevents_devices.a obj/ui/events/platform/libevents_platform.a obj/ui/events/platform/x11/libx11_events_platform.a obj/gpu/libgpu_ipc.a obj/gpu/libcommand_buffer_common.a obj/gpu/command_buffer/libgles2_utils.a obj/ipc/libipc.a obj/chrome/libsafe_browsing_proto.a obj/third_party/protobuf/libprotobuf_lite.a obj/chrome/libcommon_constants.a obj/components/libbookmarks_common.a obj/components/libnacl_switches.a obj/components/libcloud_devices_common.a obj/google_apis/libgoogle_apis.a obj/third_party/libxml/libxml2.a obj/components/libcomponent_updater.a obj/components/libupdate_client.a obj/courgette/libcourgette_lib.a obj/third_party/lzma_sdk/liblzma_sdk.a obj/third_party/zlib/google/libzip.a obj/third_party/zlib/libminizip.a obj/components/libcrx_file.a obj/components/libcontent_settings_core_common.a obj/components/libjson_schema.a obj/third_party/re2/libre2.a obj/components/libmetrics.a obj/components/libcomponent_metrics_proto.a obj/components/libvariations.a obj/third_party/mt19937ar/libmt19937ar.a obj/components/libpolicy_component_common.a obj/components/libcloud_policy_proto.a obj/components/libpolicy.a obj/components/libcloud_policy_proto_generated_compile.a obj/components/libtranslate_core_common.a obj/content/libcontent_common.a obj/components/libtracing.a obj/ui/accessibility/libaccessibility.a obj/ui/accessibility/libax_gen.a obj/tools/json_schema_compiler/libapi_gen_util.a obj/ui/events/ipc/libevents_ipc.a obj/ui/gfx/ipc/libgfx_ipc.a obj/ui/shell_dialogs/libshell_dialogs.a obj/ui/aura/libaura.a obj/ui/compositor/libcompositor.a obj/cc/libcc.a obj/gpu/libcommand_buffer_client.a obj/gpu/libcommand_buffer_service.a obj/gpu/libdisk_cache_proto.a obj/third_party/smhasher/libcityhash.a obj/ui/gl/libgl_wrapper.a obj/third_party/angle/src/libtranslator.a obj/third_party/angle/src/libtranslator_lib.a obj/third_party/angle/src/libpreprocessor.a obj/third_party/angle/src/libangle_common.a obj/gpu/libgles2_cmd_helper.a obj/gpu/libgpu_config.a obj/build/linux/libpci.a obj/third_party/libXNVCtrl/libXNVCtrl.a obj/media/libmedia.a libyuv.a obj/third_party/opus/libopus.a obj/media/libshared_memory_support.a obj/third_party/ffmpeg/libffmpeg.a obj/third_party/libvpx/libvpx.a obj/third_party/libvpx/libvpx_intrinsics_mmx.a obj/third_party/libvpx/libvpx_intrinsics_sse2.a obj/third_party/libvpx/libvpx_intrinsics_ssse3.a obj/third_party/libvpx/libvpx_intrinsics_sse4_1.a obj/third_party/libvpx/libvpx_intrinsics_avx2.a obj/media/libmedia_asm.a obj/media/libmedia_sse2.a obj/cc/libcc_surfaces.a obj/gpu/blink/libgpu_blink.a obj/gpu/libgles2_c_lib.a obj/gpu/libgles2_implementation.a obj/gpu/libgl_in_process_context.a obj/gpu/skia_bindings/libgpu_skia_bindings.a obj/third_party/WebKit/Source/platform/libblink_common.a obj/third_party/WebKit/Source/wtf/libwtf.a obj/ipc/mojo/libipc_mojo.a obj/mojo/libmojo_environment_chromium.a obj/mojo/libmojo_environment_chromium_impl.a obj/mojo/libmojo_common_lib.a obj/third_party/mojo/libmojo_cpp_bindings.a obj/third_party/mojo/libmojo_system_impl.a obj/storage/libstorage_common.a obj/third_party/WebKit/Source/platform/libblink_platform.a obj/third_party/WebKit/Source/platform/libblink_heap_asm_stubs.a obj/third_party/libwebp/libwebp_dec.a obj/third_party/libwebp/libwebp_dsp.a obj/third_party/libwebp/libwebp_utils.a obj/third_party/libwebp/libwebp_demux.a obj/third_party/libwebp/libwebp_enc.a obj/third_party/ots/libots.a obj/third_party/brotli/libbrotli.a obj/third_party/qcms/libqcms.a obj/v8/tools/gyp/libv8_base.a obj/v8/tools/gyp/libv8_libbase.a obj/v8/tools/gyp/libv8_external_snapshot.a obj/third_party/iccjpeg/libiccjpeg.a obj/third_party/WebKit/Source/web/libblink_web.a obj/third_party/WebKit/Source/core/libwebcore_dom.a obj/third_party/libxslt/libxslt.a obj/third_party/sqlite/libsqlite3.a obj/third_party/WebKit/Source/core/libwebcore_html.a obj/third_party/WebKit/Source/core/libwebcore_remaining.a obj/third_party/WebKit/Source/core/libwebcore_rendering.a obj/third_party/WebKit/Source/core/libwebcore_svg.a obj/third_party/WebKit/Source/core/libwebcore_generated.a obj/gin/libgin.a obj/third_party/snappy/libsnappy.a obj/third_party/WebKit/Source/modules/libmodules.a obj/third_party/mojo/libmojo_application_bindings.a obj/webkit/common/gpu/libwebkit_gpu.a obj/ppapi/libppapi_shared.a obj/ui/surface/libsurface.a obj/third_party/libjingle/libjingle.a obj/third_party/webrtc/base/librtc_base.a obj/third_party/webrtc/base/librtc_base_approved.a obj/third_party/webrtc/libjingle/xmllite/librtc_xmllite.a obj/third_party/libjingle/libjingle_p2p_constants.a obj/device/usb/libdevice_usb.a obj/third_party/libusb/libusb.a obj/device/udev_linux/libudev_linux.a obj/build/linux/libudev.a obj/chrome/common/extensions/api/libchrome_api.a obj/extensions/common/api/libextensions_api.a obj/extensions/libextensions_common.a obj/components/liburl_matcher.a obj/device/bluetooth/libdevice_bluetooth.a obj/extensions/libextensions_common_constants.a obj/media/cast/libcast_net.a obj/media/cast/libcast_base.a obj/media/cast/libcast_logging_proto.a obj/components/libautofill_core_common.a obj/components/libautofill_content_common.a obj/components/libpassword_manager_core_common.a obj/components/libpassword_manager_content_common.a obj/components/libsignin_core_common.a obj/components/libtranslate_content_common.a obj/components/libtranslate_core_language_detection.a obj/components/libvisitedlink_common.a obj/components/libnacl_common.a obj/components/libprinting_common.a obj/chrome/libbrowser_ui.a obj/chrome/libcert_logger_proto.a obj/chrome/libbrowser_ui_views.a obj/ash/libash.a obj/components/libuser_manager.a obj/components/libwallpaper.a obj/content/libcontent_browser.a obj/device/vibration/libdevice_vibration.a obj/device/vibration/libdevice_vibration_mojo_bindings.a obj/device/battery/libdevice_battery.a obj/device/battery/libdevice_battery_mojo_bindings.a obj/dbus/libdbus.a obj/sql/libsql.a obj/ui/snapshot/libsnapshot.a obj/content/browser/service_worker/libservice_worker_proto.a obj/content/browser/speech/proto/libspeech_proto.a obj/content/libcontent_common_mojo_bindings.a obj/net/libhttp_server.a obj/storage/libstorage.a obj/third_party/leveldatabase/libleveldatabase.a obj/third_party/mojo/libmojo_js_bindings.a obj/ui/touch_selection/libui_touch_selection.a obj/sandbox/libsandbox_services.a obj/sandbox/libsuid_sandbox_client.a obj/sandbox/libseccomp_bpf.a obj/sandbox/libseccomp_bpf_helpers.a obj/jingle/libjingle_glue.a obj/third_party/libjingle/libjingle_webrtc.a obj/third_party/libjingle/libjingle_webrtc_common.a obj/third_party/libsrtp/libsrtp.a obj/third_party/webrtc/modules/libmedia_file.a obj/third_party/webrtc/system_wrappers/libsystem_wrappers.a obj/third_party/webrtc/modules/libvideo_capture_module_impl.a obj/third_party/webrtc/modules/libvideo_capture_module.a obj/third_party/webrtc/modules/libwebrtc_utility.a obj/third_party/webrtc/modules/libaudio_coding_module.a obj/third_party/webrtc/modules/libCNG.a obj/third_party/webrtc/common_audio/libcommon_audio.a obj/third_party/openmax_dl/dl/libopenmax_dl.a obj/third_party/webrtc/common_audio/libcommon_audio_sse2.a obj/third_party/webrtc/modules/libaudio_encoder_interface.a obj/third_party/webrtc/modules/libG711.a obj/third_party/webrtc/modules/libG722.a obj/third_party/webrtc/modules/libiLBC.a obj/third_party/webrtc/modules/libiSAC.a obj/third_party/webrtc/modules/libaudio_decoder_interface.a obj/third_party/webrtc/modules/libiSACFix.a obj/third_party/webrtc/modules/libPCM16B.a obj/third_party/webrtc/modules/libred.a obj/third_party/webrtc/modules/libwebrtc_opus.a obj/third_party/webrtc/modules/libneteq.a obj/third_party/webrtc/modules/libwebrtc_video_coding.a obj/third_party/webrtc/modules/libwebrtc_i420.a obj/third_party/webrtc/common_video/libcommon_video.a obj/third_party/webrtc/modules/video_coding/utility/libvideo_coding_utility.a obj/third_party/webrtc/modules/video_coding/codecs/vp8/libwebrtc_vp8.a obj/third_party/webrtc/modules/video_coding/codecs/vp9/libwebrtc_vp9.a obj/third_party/webrtc/modules/libvideo_render_module_impl.a obj/third_party/webrtc/modules/libvideo_render_module.a obj/third_party/usrsctp/libusrsctplib.a obj/third_party/webrtc/modules/libaudio_processing.a obj/third_party/webrtc/modules/libaudioproc_debug_proto.a obj/third_party/webrtc/modules/libaudio_processing_sse2.a obj/third_party/webrtc/modules/libdesktop_capture.a obj/third_party/webrtc/modules/libdesktop_capture_differ_sse2.a obj/sandbox/libc_urandom_override.a obj/ppapi/libppapi_ipc.a obj/third_party/flac/libflac.a obj/third_party/speex/libspeex.a obj/content/libcontent_child.a obj/content/libcontent_plugin.a obj/content/libcontent_renderer.a obj/cc/blink/libcc_blink.a obj/media/blink/libmedia_blink.a obj/third_party/mojo/libmojo_js_lib.a obj/ui/native_theme/libnative_theme.a obj/third_party/libjingle/libpeerconnection.a obj/third_party/webrtc/voice_engine/libvoice_engine.a obj/third_party/webrtc/modules/libaudio_conference_mixer.a obj/third_party/webrtc/modules/libaudio_device.a obj/third_party/webrtc/modules/libbitrate_controller.a obj/third_party/webrtc/modules/librtp_rtcp.a obj/third_party/webrtc/modules/libpaced_sender.a obj/third_party/webrtc/modules/libremote_bitrate_estimator.a obj/third_party/webrtc/libwebrtc.a obj/third_party/webrtc/libwebrtc_common.a obj/third_party/webrtc/video_engine/libvideo_engine_core.a obj/third_party/webrtc/modules/libvideo_processing.a obj/third_party/webrtc/modules/libvideo_processing_sse2.a obj/ppapi/libppapi_proxy.a obj/content/libcontent_utility.a obj/ui/accelerometer/libui_accelerometer.a obj/ui/app_list/libapp_list.a obj/components/libkeyed_service_core.a obj/ui/wm/libwm.a obj/ui/views/libviews.a obj/ui/display/libdisplay_util.a obj/ui/keyboard/libkeyboard.a obj/ui/message_center/libmessage_center.a obj/ui/views/controls/webview/libwebview.a obj/ui/content_accelerators/libui_content_accelerators.a obj/ui/web_dialogs/libweb_dialogs.a obj/components/libauto_login_parser.a obj/components/libdom_distiller_core.a obj/sync/libsync_core.a obj/sync/libattachment_store_proto.a obj/sync/libsync_proto.a obj/third_party/dom_distiller_js/libdom_distiller_js_proto.a obj/components/libleveldb_proto.a obj/components/libdistilled_page_proto.a obj/components/libpref_registry.a obj/components/libdom_distiller_webui.a obj/components/libfeedback_proto.a obj/components/libhistory_core_browser_proto.a obj/components/libinvalidation.a obj/jingle/libnotifier.a obj/third_party/cacheinvalidation/libcacheinvalidation.a obj/third_party/cacheinvalidation/libcacheinvalidation_proto_cpp.a obj/components/libgcm_driver.a obj/components/libos_crypt.a obj/google_apis/gcm/libgcm.a obj/components/libsignin_core_browser.a obj/components/libcontent_settings_core_browser.a obj/components/libwebdata_common.a obj/components/libonc_component.a obj/components/libpassword_manager_core_browser.a obj/components/libpassword_manager_core_browser_proto.a obj/components/libui_zoom.a obj/components/libapp_modal.a obj/components/libautofill_content_risk_proto.a obj/net/libnet_with_v8.a obj/native_client/src/trusted/service_runtime/libsel.a obj/native_client/src/trusted/service_runtime/libenv_cleanser.a obj/native_client/src/trusted/service_runtime/libnacl_error_code.a obj/native_client/src/shared/gio/libgio.a obj/native_client/src/shared/platform/libplatform.a obj/native_client/src/shared/srpc/libnonnacl_srpc.a obj/native_client/src/trusted/debug_stub/libdebug_stub.a obj/native_client/src/trusted/desc/libnrd_xfer.a obj/native_client/src/trusted/desc/libdesc_wrapper.a obj/native_client/src/shared/imc/libimc.a obj/native_client/src/trusted/nacl_base/libnacl_base.a obj/native_client/src/trusted/desc_cacheability/libdesc_cacheability.a obj/native_client/src/trusted/fault_injection/libnacl_fault_inject.a obj/native_client/src/trusted/interval_multiset/libnacl_interval.a obj/native_client/src/trusted/perf_counter/libnacl_perf_counter.a obj/native_client/src/trusted/platform_qualify/libplatform_qual_lib.a obj/native_client/src/trusted/cpu_features/libcpu_features.a obj/native_client/src/trusted/simple_service/libsimple_service.a obj/native_client/src/trusted/threading/libthread_interface.a obj/native_client/src/trusted/validator/libvalidation_cache.a obj/native_client/src/trusted/validator/libvalidators.a obj/native_client/src/trusted/service_runtime/arch/x86/libservice_runtime_x86_common.a obj/native_client/src/trusted/validator_ragel/libdfa_validate_x86_64.a obj/native_client/src/trusted/service_runtime/arch/x86_64/libservice_runtime_x86_64.a obj/native_client/src/trusted/validator_x86/libnccopy_x86_64.a obj/native_client/src/trusted/service_runtime/libnacl_signal.a obj/chrome/libsafe_browsing_chunk_proto.a obj/chrome/libsafe_browsing_report_proto.a obj/ash/libash_with_content.a obj/components/libconstrained_window.a obj/components/libweb_modal.a obj/extensions/components/libnative_app_window.a obj/extensions/libextensions_browser.a obj/components/libcopresence_endpoints.a obj/components/libkeyed_service_content.a obj/components/libuser_prefs.a obj/components/libsessions_content.a obj/components/libstorage_monitor.a obj/device/media_transfer_protocol/libdevice_media_transfer_protocol.a obj/device/media_transfer_protocol/libmtp_file_entry_proto.a obj/device/media_transfer_protocol/libmtp_storage_info_proto.a obj/components/libweb_cache_browser.a obj/components/libweb_cache_common.a obj/device/serial/libdevice_serial.a obj/extensions/browser/api/libextensions_api_registration.a obj/extensions/common/api/libcast_channel_proto.a obj/chrome/browser/ui/libgtk2ui/libgtk2ui.a obj/third_party/libaddressinput/libaddressinput.a obj/third_party/libaddressinput/libaddressinput_util.a obj/chrome/libbrowser_extensions.a obj/chrome/browser/extensions/api/libchrome_api_registration.a obj/components/libcopresence_proto.a obj/components/libcopresence.a obj/components/libproximity_auth.a obj/device/hid/libdevice_hid.a obj/device/core/libdevice_core.a obj/third_party/hunspell/libhunspell.a obj/extensions/components/libjavascript_dialog_extensions_client.a obj/chrome/libprobe_message_proto.a obj/components/libautofill_core_browser.a obj/third_party/fips181/libfips181.a obj/third_party/libphonenumber/libphonenumber.a obj/third_party/libphonenumber/libphonenumber_without_metadata.a obj/components/libinfobars_core.a obj/components/libbookmarks_browser.a obj/components/libfavicon_base.a obj/components/libquery_parser.a obj/components/libcaptive_portal.a obj/components/libdata_reduction_proxy_core_browser.a obj/components/libdata_reduction_proxy_core_common.a obj/components/libdomain_reliability.a obj/components/libenhanced_bookmarks.a obj/components/libenhanced_bookmarks_proto.a obj/components/libfavicon_core.a obj/components/libfeedback_component.a obj/components/libgoogle_core_browser.a obj/components/liburl_fixer.a obj/components/libhistory_core_browser.a obj/components/libhistory_core_common.a obj/components/libmetrics_gpu.a obj/components/libmetrics_net.a obj/components/libmetrics_profiler.a obj/components/libnavigation_metrics.a obj/components/libnetwork_time.a obj/components/libomnibox.a obj/components/libsearch.a obj/components/libsearch_engines.a obj/components/librappor.a obj/components/search_engines/libprepopulated_engines.a obj/components/libvariations_http_provider.a obj/components/libpolicy_component_browser.a obj/components/libprecache_core.a obj/components/libprecache_core_proto.a obj/components/librenderer_context_menu.a obj/components/libsearch_provider_logos.a obj/components/libsuggestions.a obj/components/libsync_driver.a obj/components/libtranslate_core_browser.a obj/components/liblanguage_usage_metrics.a obj/components/libwebdata_services.a obj/chrome/libapps.a obj/components/libautofill_content_browser.a obj/components/libdom_distiller_content.a obj/components/libhistory_content_browser.a obj/components/libnavigation_interception.a obj/components/libpacked_ct_ev_whitelist.a obj/components/libpassword_manager_content_browser.a obj/components/libpower.a obj/components/libprecache_content.a obj/components/libtranslate_content_browser.a obj/components/libvisitedlink_browser.a obj/components/libweb_resource.a obj/net/libnet_extras.a obj/testing/perf/libperf_test.a obj/chrome/libsync_file_system_drive_proto.a obj/components/libcryptauth.a obj/components/libcryptauth_proto.a obj/components/libnacl_browser.a obj/chrome/libpolicy_path_parser.a obj/components/libpdf_browser.a obj/components/libpdf_common.a obj/chrome/libsafe_browsing_metadata_proto.a obj/build/linux/libspeechd.a obj/components/libbreakpad_host.a obj/components/libcrash_component.a obj/components/libcrash_component_lib.a obj/breakpad/libbreakpad_client.a obj/components/libautofill_content_renderer.a obj/components/libcdm_renderer.a obj/components/libcdm_common.a obj/components/libnetwork_hints_renderer.a obj/components/liberror_page_renderer.a obj/components/libpassword_manager_content_renderer.a obj/components/libplugins_renderer.a obj/components/libtranslate_content_renderer.a obj/components/libvisitedlink_renderer.a obj/components/libweb_cache_renderer.a obj/components/libnacl.a obj/mojo/libmonacl_syscall.a obj/components/libnacl_renderer.a obj/native_client/src/trusted/nonnacl_util/libsel_ldr_launcher_base.a obj/native_client/src/shared/serialization/libserialization.a obj/ppapi/libppapi_cpp_objects.a obj/ppapi/libppapi_internal_module.a obj/third_party/jsoncpp/libjsoncpp.a obj/components/libpdf_renderer.a obj/third_party/smhasher/libmurmurhash3.a obj/extensions/libextensions_renderer.a obj/media/cast/libcast_sender.a obj/components/libprinting_renderer.a obj/extensions/libextensions_utility.a obj/third_party/cld_2/libcld2_static.a obj/remoting/libremoting_base.a obj/remoting/proto/libchromotocol_proto_lib.a obj/remoting/libremoting_client.a obj/remoting/libremoting_protocol.a --end-group -lrt -ldl -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -lsmime3 -lnss3 -lnssutil3 -lplds4 -lplc4 -lnspr4 -lpthread -lgconf-2 -lgio-2.0 -lresolv -lfontconfig -lfreetype -lpangocairo-1.0 -lcairo -lpangoft2-1.0 -lpango-1.0 -lharfbuzz -lX11 -lXi -lXcursor -lXext -lXfixes -lXrender -lXss -lXcomposite -lasound -lm -lXdamage -lXtst -lXrandr -lexpat -lcups -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lz -lcrypt -ldbus-1 -lcap -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lstdc++ -lm -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtendS.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crtn.o' (30 runs):

       6266.418053      task-clock (msec)         #    0.999 CPUs utilized            ( +-  0.14% )
                 3      context-switches          #    0.001 K/sec                    ( +-  5.67% )
                 0      cpu-migrations            #    0.000 K/sec                  
           266,961      page-faults               #    0.043 M/sec                  
    18,991,193,057      cycles                    #    3.031 GHz                      ( +-  0.03% )
     8,754,914,020      stalled-cycles-frontend   #   46.10% frontend cycles idle     ( +-  0.07% )
                 0      stalled-cycles-backend    #    0.00% backend  cycles idle   
    26,661,647,167      instructions              #    1.40  insns per cycle        
                                                  #    0.33  stalled cycles per insn  ( +-  0.00% )
     5,352,541,077      branches                  #  854.163 M/sec                    ( +-  0.00% )
        83,395,775      branch-misses             #    1.56% of all branches          ( +-  0.00% )

       6.270806416 seconds time elapsed                                          ( +-  0.14% )


[-- Attachment #4: patch.log --]
[-- Type: text/x-log, Size: 22768 bytes --]


 Performance counter stats for '/home/espindola/binutils/ld-patch -pie --hash-style=gnu --no-add-needed --build-id --gc-sections --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o chrome /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/Scrt1.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtbeginS.o -L. -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../.. -L/home/espindola/llvm/build-227431/bin/../lib -L/lib -L/usr/lib -z now -z relro --fatal-warnings -z defs -z noexecstack --disable-new-dtags --export-dynamic -uIsHeapProfilerRunning -uProfilerStart -u_Z21InitialMallocHook_NewPKvj -u_Z22InitialMallocHook_MMapPKvS0_jiiix -u_Z22InitialMallocHook_SbrkPKvi -u_Z21InitialMallocHook_NewPKvm -u_Z22InitialMallocHook_MMapPKvS0_miiil -u_Z22InitialMallocHook_SbrkPKvl -u_ZN15HeapLeakChecker12IgnoreObjectEPKv -u_ZN15HeapLeakChecker14UnIgnoreObjectEPKv -O1 --as-needed --start-group obj/chrome/app/chrome_initial.chrome_exe_main_aura.o obj/content/public/common/chrome_initial.content_switches.o obj/chrome/app/chrome_initial.chrome_main.o obj/chrome/app/chrome_initial.chrome_main_delegate.o obj/chrome/libcommon.a obj/chrome/libbrowser.a obj/chrome/libdebugger.a obj/ppapi/libppapi_host.a obj/printing/libprinting.a obj/chrome/libservice.a obj/chrome/libplugin.a obj/chrome/librenderer.a obj/chrome/libutility.a obj/content/libcontent_gpu.a obj/content/libcontent_ppapi_plugin.a obj/components/nacl/renderer/plugin/libnacl_trusted_plugin.a obj/remoting/libremoting_client_plugin.a obj/content/libcontent_app_both.a obj/chrome/libinstaller_util.a obj/base/allocator/liballocator.a obj/components/libstartup_metric_utils.a obj/chrome/libcommon_net.a obj/base/libbase.a obj/base/libbase_static.a obj/base/allocator/liballocator_extension_thunks.a obj/third_party/modp_b64/libmodp_b64.a obj/base/third_party/dynamic_annotations/libdynamic_annotations.a obj/base/libsymbolize.a obj/base/libxdg_mime.a obj/third_party/libevent/libevent.a obj/components/libnetwork_hints_common.a obj/components/liberror_page_common.a obj/url/liburl_lib.a obj/third_party/icu/libicui18n.a obj/third_party/icu/libicuuc.a obj/third_party/icu/libicudata.a obj/crypto/libcrcrypto.a obj/net/third_party/nss/libcrssl.a obj/net/libnet.a obj/base/libbase_i18n.a obj/base/libbase_prefs.a obj/sdch/libsdch.a obj/third_party/zlib/libchrome_zlib.a obj/third_party/zlib/libzlib_x86_simd.a obj/build/linux/libgio.a obj/ui/base/libui_base.a obj/skia/libskia_library.a obj/skia/libskia_opts.a obj/skia/libskia_opts_ssse3.a obj/skia/libskia_opts_sse41.a obj/third_party/sfntly/libsfntly.a obj/skia/libskia_chrome.a obj/skia/libskia_chrome_opts.a obj/ui/events/libevents.a obj/ui/gfx/libgfx.a obj/third_party/libpng/libpng.a obj/ui/gfx/libgfx_geometry.a obj/third_party/libjpeg_turbo/libjpeg_turbo.a obj/ui/gfx/x/libgfx_x11.a obj/ui/events/libdom4_keycode_converter.a obj/ui/events/libevents_base.a obj/ui/events/libgesture_detection.a obj/ui/events/devices/libevents_devices.a obj/ui/events/platform/libevents_platform.a obj/ui/events/platform/x11/libx11_events_platform.a obj/gpu/libgpu_ipc.a obj/gpu/libcommand_buffer_common.a obj/gpu/command_buffer/libgles2_utils.a obj/ipc/libipc.a obj/chrome/libsafe_browsing_proto.a obj/third_party/protobuf/libprotobuf_lite.a obj/chrome/libcommon_constants.a obj/components/libbookmarks_common.a obj/components/libnacl_switches.a obj/components/libcloud_devices_common.a obj/google_apis/libgoogle_apis.a obj/third_party/libxml/libxml2.a obj/components/libcomponent_updater.a obj/components/libupdate_client.a obj/courgette/libcourgette_lib.a obj/third_party/lzma_sdk/liblzma_sdk.a obj/third_party/zlib/google/libzip.a obj/third_party/zlib/libminizip.a obj/components/libcrx_file.a obj/components/libcontent_settings_core_common.a obj/components/libjson_schema.a obj/third_party/re2/libre2.a obj/components/libmetrics.a obj/components/libcomponent_metrics_proto.a obj/components/libvariations.a obj/third_party/mt19937ar/libmt19937ar.a obj/components/libpolicy_component_common.a obj/components/libcloud_policy_proto.a obj/components/libpolicy.a obj/components/libcloud_policy_proto_generated_compile.a obj/components/libtranslate_core_common.a obj/content/libcontent_common.a obj/components/libtracing.a obj/ui/accessibility/libaccessibility.a obj/ui/accessibility/libax_gen.a obj/tools/json_schema_compiler/libapi_gen_util.a obj/ui/events/ipc/libevents_ipc.a obj/ui/gfx/ipc/libgfx_ipc.a obj/ui/shell_dialogs/libshell_dialogs.a obj/ui/aura/libaura.a obj/ui/compositor/libcompositor.a obj/cc/libcc.a obj/gpu/libcommand_buffer_client.a obj/gpu/libcommand_buffer_service.a obj/gpu/libdisk_cache_proto.a obj/third_party/smhasher/libcityhash.a obj/ui/gl/libgl_wrapper.a obj/third_party/angle/src/libtranslator.a obj/third_party/angle/src/libtranslator_lib.a obj/third_party/angle/src/libpreprocessor.a obj/third_party/angle/src/libangle_common.a obj/gpu/libgles2_cmd_helper.a obj/gpu/libgpu_config.a obj/build/linux/libpci.a obj/third_party/libXNVCtrl/libXNVCtrl.a obj/media/libmedia.a libyuv.a obj/third_party/opus/libopus.a obj/media/libshared_memory_support.a obj/third_party/ffmpeg/libffmpeg.a obj/third_party/libvpx/libvpx.a obj/third_party/libvpx/libvpx_intrinsics_mmx.a obj/third_party/libvpx/libvpx_intrinsics_sse2.a obj/third_party/libvpx/libvpx_intrinsics_ssse3.a obj/third_party/libvpx/libvpx_intrinsics_sse4_1.a obj/third_party/libvpx/libvpx_intrinsics_avx2.a obj/media/libmedia_asm.a obj/media/libmedia_sse2.a obj/cc/libcc_surfaces.a obj/gpu/blink/libgpu_blink.a obj/gpu/libgles2_c_lib.a obj/gpu/libgles2_implementation.a obj/gpu/libgl_in_process_context.a obj/gpu/skia_bindings/libgpu_skia_bindings.a obj/third_party/WebKit/Source/platform/libblink_common.a obj/third_party/WebKit/Source/wtf/libwtf.a obj/ipc/mojo/libipc_mojo.a obj/mojo/libmojo_environment_chromium.a obj/mojo/libmojo_environment_chromium_impl.a obj/mojo/libmojo_common_lib.a obj/third_party/mojo/libmojo_cpp_bindings.a obj/third_party/mojo/libmojo_system_impl.a obj/storage/libstorage_common.a obj/third_party/WebKit/Source/platform/libblink_platform.a obj/third_party/WebKit/Source/platform/libblink_heap_asm_stubs.a obj/third_party/libwebp/libwebp_dec.a obj/third_party/libwebp/libwebp_dsp.a obj/third_party/libwebp/libwebp_utils.a obj/third_party/libwebp/libwebp_demux.a obj/third_party/libwebp/libwebp_enc.a obj/third_party/ots/libots.a obj/third_party/brotli/libbrotli.a obj/third_party/qcms/libqcms.a obj/v8/tools/gyp/libv8_base.a obj/v8/tools/gyp/libv8_libbase.a obj/v8/tools/gyp/libv8_external_snapshot.a obj/third_party/iccjpeg/libiccjpeg.a obj/third_party/WebKit/Source/web/libblink_web.a obj/third_party/WebKit/Source/core/libwebcore_dom.a obj/third_party/libxslt/libxslt.a obj/third_party/sqlite/libsqlite3.a obj/third_party/WebKit/Source/core/libwebcore_html.a obj/third_party/WebKit/Source/core/libwebcore_remaining.a obj/third_party/WebKit/Source/core/libwebcore_rendering.a obj/third_party/WebKit/Source/core/libwebcore_svg.a obj/third_party/WebKit/Source/core/libwebcore_generated.a obj/gin/libgin.a obj/third_party/snappy/libsnappy.a obj/third_party/WebKit/Source/modules/libmodules.a obj/third_party/mojo/libmojo_application_bindings.a obj/webkit/common/gpu/libwebkit_gpu.a obj/ppapi/libppapi_shared.a obj/ui/surface/libsurface.a obj/third_party/libjingle/libjingle.a obj/third_party/webrtc/base/librtc_base.a obj/third_party/webrtc/base/librtc_base_approved.a obj/third_party/webrtc/libjingle/xmllite/librtc_xmllite.a obj/third_party/libjingle/libjingle_p2p_constants.a obj/device/usb/libdevice_usb.a obj/third_party/libusb/libusb.a obj/device/udev_linux/libudev_linux.a obj/build/linux/libudev.a obj/chrome/common/extensions/api/libchrome_api.a obj/extensions/common/api/libextensions_api.a obj/extensions/libextensions_common.a obj/components/liburl_matcher.a obj/device/bluetooth/libdevice_bluetooth.a obj/extensions/libextensions_common_constants.a obj/media/cast/libcast_net.a obj/media/cast/libcast_base.a obj/media/cast/libcast_logging_proto.a obj/components/libautofill_core_common.a obj/components/libautofill_content_common.a obj/components/libpassword_manager_core_common.a obj/components/libpassword_manager_content_common.a obj/components/libsignin_core_common.a obj/components/libtranslate_content_common.a obj/components/libtranslate_core_language_detection.a obj/components/libvisitedlink_common.a obj/components/libnacl_common.a obj/components/libprinting_common.a obj/chrome/libbrowser_ui.a obj/chrome/libcert_logger_proto.a obj/chrome/libbrowser_ui_views.a obj/ash/libash.a obj/components/libuser_manager.a obj/components/libwallpaper.a obj/content/libcontent_browser.a obj/device/vibration/libdevice_vibration.a obj/device/vibration/libdevice_vibration_mojo_bindings.a obj/device/battery/libdevice_battery.a obj/device/battery/libdevice_battery_mojo_bindings.a obj/dbus/libdbus.a obj/sql/libsql.a obj/ui/snapshot/libsnapshot.a obj/content/browser/service_worker/libservice_worker_proto.a obj/content/browser/speech/proto/libspeech_proto.a obj/content/libcontent_common_mojo_bindings.a obj/net/libhttp_server.a obj/storage/libstorage.a obj/third_party/leveldatabase/libleveldatabase.a obj/third_party/mojo/libmojo_js_bindings.a obj/ui/touch_selection/libui_touch_selection.a obj/sandbox/libsandbox_services.a obj/sandbox/libsuid_sandbox_client.a obj/sandbox/libseccomp_bpf.a obj/sandbox/libseccomp_bpf_helpers.a obj/jingle/libjingle_glue.a obj/third_party/libjingle/libjingle_webrtc.a obj/third_party/libjingle/libjingle_webrtc_common.a obj/third_party/libsrtp/libsrtp.a obj/third_party/webrtc/modules/libmedia_file.a obj/third_party/webrtc/system_wrappers/libsystem_wrappers.a obj/third_party/webrtc/modules/libvideo_capture_module_impl.a obj/third_party/webrtc/modules/libvideo_capture_module.a obj/third_party/webrtc/modules/libwebrtc_utility.a obj/third_party/webrtc/modules/libaudio_coding_module.a obj/third_party/webrtc/modules/libCNG.a obj/third_party/webrtc/common_audio/libcommon_audio.a obj/third_party/openmax_dl/dl/libopenmax_dl.a obj/third_party/webrtc/common_audio/libcommon_audio_sse2.a obj/third_party/webrtc/modules/libaudio_encoder_interface.a obj/third_party/webrtc/modules/libG711.a obj/third_party/webrtc/modules/libG722.a obj/third_party/webrtc/modules/libiLBC.a obj/third_party/webrtc/modules/libiSAC.a obj/third_party/webrtc/modules/libaudio_decoder_interface.a obj/third_party/webrtc/modules/libiSACFix.a obj/third_party/webrtc/modules/libPCM16B.a obj/third_party/webrtc/modules/libred.a obj/third_party/webrtc/modules/libwebrtc_opus.a obj/third_party/webrtc/modules/libneteq.a obj/third_party/webrtc/modules/libwebrtc_video_coding.a obj/third_party/webrtc/modules/libwebrtc_i420.a obj/third_party/webrtc/common_video/libcommon_video.a obj/third_party/webrtc/modules/video_coding/utility/libvideo_coding_utility.a obj/third_party/webrtc/modules/video_coding/codecs/vp8/libwebrtc_vp8.a obj/third_party/webrtc/modules/video_coding/codecs/vp9/libwebrtc_vp9.a obj/third_party/webrtc/modules/libvideo_render_module_impl.a obj/third_party/webrtc/modules/libvideo_render_module.a obj/third_party/usrsctp/libusrsctplib.a obj/third_party/webrtc/modules/libaudio_processing.a obj/third_party/webrtc/modules/libaudioproc_debug_proto.a obj/third_party/webrtc/modules/libaudio_processing_sse2.a obj/third_party/webrtc/modules/libdesktop_capture.a obj/third_party/webrtc/modules/libdesktop_capture_differ_sse2.a obj/sandbox/libc_urandom_override.a obj/ppapi/libppapi_ipc.a obj/third_party/flac/libflac.a obj/third_party/speex/libspeex.a obj/content/libcontent_child.a obj/content/libcontent_plugin.a obj/content/libcontent_renderer.a obj/cc/blink/libcc_blink.a obj/media/blink/libmedia_blink.a obj/third_party/mojo/libmojo_js_lib.a obj/ui/native_theme/libnative_theme.a obj/third_party/libjingle/libpeerconnection.a obj/third_party/webrtc/voice_engine/libvoice_engine.a obj/third_party/webrtc/modules/libaudio_conference_mixer.a obj/third_party/webrtc/modules/libaudio_device.a obj/third_party/webrtc/modules/libbitrate_controller.a obj/third_party/webrtc/modules/librtp_rtcp.a obj/third_party/webrtc/modules/libpaced_sender.a obj/third_party/webrtc/modules/libremote_bitrate_estimator.a obj/third_party/webrtc/libwebrtc.a obj/third_party/webrtc/libwebrtc_common.a obj/third_party/webrtc/video_engine/libvideo_engine_core.a obj/third_party/webrtc/modules/libvideo_processing.a obj/third_party/webrtc/modules/libvideo_processing_sse2.a obj/ppapi/libppapi_proxy.a obj/content/libcontent_utility.a obj/ui/accelerometer/libui_accelerometer.a obj/ui/app_list/libapp_list.a obj/components/libkeyed_service_core.a obj/ui/wm/libwm.a obj/ui/views/libviews.a obj/ui/display/libdisplay_util.a obj/ui/keyboard/libkeyboard.a obj/ui/message_center/libmessage_center.a obj/ui/views/controls/webview/libwebview.a obj/ui/content_accelerators/libui_content_accelerators.a obj/ui/web_dialogs/libweb_dialogs.a obj/components/libauto_login_parser.a obj/components/libdom_distiller_core.a obj/sync/libsync_core.a obj/sync/libattachment_store_proto.a obj/sync/libsync_proto.a obj/third_party/dom_distiller_js/libdom_distiller_js_proto.a obj/components/libleveldb_proto.a obj/components/libdistilled_page_proto.a obj/components/libpref_registry.a obj/components/libdom_distiller_webui.a obj/components/libfeedback_proto.a obj/components/libhistory_core_browser_proto.a obj/components/libinvalidation.a obj/jingle/libnotifier.a obj/third_party/cacheinvalidation/libcacheinvalidation.a obj/third_party/cacheinvalidation/libcacheinvalidation_proto_cpp.a obj/components/libgcm_driver.a obj/components/libos_crypt.a obj/google_apis/gcm/libgcm.a obj/components/libsignin_core_browser.a obj/components/libcontent_settings_core_browser.a obj/components/libwebdata_common.a obj/components/libonc_component.a obj/components/libpassword_manager_core_browser.a obj/components/libpassword_manager_core_browser_proto.a obj/components/libui_zoom.a obj/components/libapp_modal.a obj/components/libautofill_content_risk_proto.a obj/net/libnet_with_v8.a obj/native_client/src/trusted/service_runtime/libsel.a obj/native_client/src/trusted/service_runtime/libenv_cleanser.a obj/native_client/src/trusted/service_runtime/libnacl_error_code.a obj/native_client/src/shared/gio/libgio.a obj/native_client/src/shared/platform/libplatform.a obj/native_client/src/shared/srpc/libnonnacl_srpc.a obj/native_client/src/trusted/debug_stub/libdebug_stub.a obj/native_client/src/trusted/desc/libnrd_xfer.a obj/native_client/src/trusted/desc/libdesc_wrapper.a obj/native_client/src/shared/imc/libimc.a obj/native_client/src/trusted/nacl_base/libnacl_base.a obj/native_client/src/trusted/desc_cacheability/libdesc_cacheability.a obj/native_client/src/trusted/fault_injection/libnacl_fault_inject.a obj/native_client/src/trusted/interval_multiset/libnacl_interval.a obj/native_client/src/trusted/perf_counter/libnacl_perf_counter.a obj/native_client/src/trusted/platform_qualify/libplatform_qual_lib.a obj/native_client/src/trusted/cpu_features/libcpu_features.a obj/native_client/src/trusted/simple_service/libsimple_service.a obj/native_client/src/trusted/threading/libthread_interface.a obj/native_client/src/trusted/validator/libvalidation_cache.a obj/native_client/src/trusted/validator/libvalidators.a obj/native_client/src/trusted/service_runtime/arch/x86/libservice_runtime_x86_common.a obj/native_client/src/trusted/validator_ragel/libdfa_validate_x86_64.a obj/native_client/src/trusted/service_runtime/arch/x86_64/libservice_runtime_x86_64.a obj/native_client/src/trusted/validator_x86/libnccopy_x86_64.a obj/native_client/src/trusted/service_runtime/libnacl_signal.a obj/chrome/libsafe_browsing_chunk_proto.a obj/chrome/libsafe_browsing_report_proto.a obj/ash/libash_with_content.a obj/components/libconstrained_window.a obj/components/libweb_modal.a obj/extensions/components/libnative_app_window.a obj/extensions/libextensions_browser.a obj/components/libcopresence_endpoints.a obj/components/libkeyed_service_content.a obj/components/libuser_prefs.a obj/components/libsessions_content.a obj/components/libstorage_monitor.a obj/device/media_transfer_protocol/libdevice_media_transfer_protocol.a obj/device/media_transfer_protocol/libmtp_file_entry_proto.a obj/device/media_transfer_protocol/libmtp_storage_info_proto.a obj/components/libweb_cache_browser.a obj/components/libweb_cache_common.a obj/device/serial/libdevice_serial.a obj/extensions/browser/api/libextensions_api_registration.a obj/extensions/common/api/libcast_channel_proto.a obj/chrome/browser/ui/libgtk2ui/libgtk2ui.a obj/third_party/libaddressinput/libaddressinput.a obj/third_party/libaddressinput/libaddressinput_util.a obj/chrome/libbrowser_extensions.a obj/chrome/browser/extensions/api/libchrome_api_registration.a obj/components/libcopresence_proto.a obj/components/libcopresence.a obj/components/libproximity_auth.a obj/device/hid/libdevice_hid.a obj/device/core/libdevice_core.a obj/third_party/hunspell/libhunspell.a obj/extensions/components/libjavascript_dialog_extensions_client.a obj/chrome/libprobe_message_proto.a obj/components/libautofill_core_browser.a obj/third_party/fips181/libfips181.a obj/third_party/libphonenumber/libphonenumber.a obj/third_party/libphonenumber/libphonenumber_without_metadata.a obj/components/libinfobars_core.a obj/components/libbookmarks_browser.a obj/components/libfavicon_base.a obj/components/libquery_parser.a obj/components/libcaptive_portal.a obj/components/libdata_reduction_proxy_core_browser.a obj/components/libdata_reduction_proxy_core_common.a obj/components/libdomain_reliability.a obj/components/libenhanced_bookmarks.a obj/components/libenhanced_bookmarks_proto.a obj/components/libfavicon_core.a obj/components/libfeedback_component.a obj/components/libgoogle_core_browser.a obj/components/liburl_fixer.a obj/components/libhistory_core_browser.a obj/components/libhistory_core_common.a obj/components/libmetrics_gpu.a obj/components/libmetrics_net.a obj/components/libmetrics_profiler.a obj/components/libnavigation_metrics.a obj/components/libnetwork_time.a obj/components/libomnibox.a obj/components/libsearch.a obj/components/libsearch_engines.a obj/components/librappor.a obj/components/search_engines/libprepopulated_engines.a obj/components/libvariations_http_provider.a obj/components/libpolicy_component_browser.a obj/components/libprecache_core.a obj/components/libprecache_core_proto.a obj/components/librenderer_context_menu.a obj/components/libsearch_provider_logos.a obj/components/libsuggestions.a obj/components/libsync_driver.a obj/components/libtranslate_core_browser.a obj/components/liblanguage_usage_metrics.a obj/components/libwebdata_services.a obj/chrome/libapps.a obj/components/libautofill_content_browser.a obj/components/libdom_distiller_content.a obj/components/libhistory_content_browser.a obj/components/libnavigation_interception.a obj/components/libpacked_ct_ev_whitelist.a obj/components/libpassword_manager_content_browser.a obj/components/libpower.a obj/components/libprecache_content.a obj/components/libtranslate_content_browser.a obj/components/libvisitedlink_browser.a obj/components/libweb_resource.a obj/net/libnet_extras.a obj/testing/perf/libperf_test.a obj/chrome/libsync_file_system_drive_proto.a obj/components/libcryptauth.a obj/components/libcryptauth_proto.a obj/components/libnacl_browser.a obj/chrome/libpolicy_path_parser.a obj/components/libpdf_browser.a obj/components/libpdf_common.a obj/chrome/libsafe_browsing_metadata_proto.a obj/build/linux/libspeechd.a obj/components/libbreakpad_host.a obj/components/libcrash_component.a obj/components/libcrash_component_lib.a obj/breakpad/libbreakpad_client.a obj/components/libautofill_content_renderer.a obj/components/libcdm_renderer.a obj/components/libcdm_common.a obj/components/libnetwork_hints_renderer.a obj/components/liberror_page_renderer.a obj/components/libpassword_manager_content_renderer.a obj/components/libplugins_renderer.a obj/components/libtranslate_content_renderer.a obj/components/libvisitedlink_renderer.a obj/components/libweb_cache_renderer.a obj/components/libnacl.a obj/mojo/libmonacl_syscall.a obj/components/libnacl_renderer.a obj/native_client/src/trusted/nonnacl_util/libsel_ldr_launcher_base.a obj/native_client/src/shared/serialization/libserialization.a obj/ppapi/libppapi_cpp_objects.a obj/ppapi/libppapi_internal_module.a obj/third_party/jsoncpp/libjsoncpp.a obj/components/libpdf_renderer.a obj/third_party/smhasher/libmurmurhash3.a obj/extensions/libextensions_renderer.a obj/media/cast/libcast_sender.a obj/components/libprinting_renderer.a obj/extensions/libextensions_utility.a obj/third_party/cld_2/libcld2_static.a obj/remoting/libremoting_base.a obj/remoting/proto/libchromotocol_proto_lib.a obj/remoting/libremoting_client.a obj/remoting/libremoting_protocol.a --end-group -lrt -ldl -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -lsmime3 -lnss3 -lnssutil3 -lplds4 -lplc4 -lnspr4 -lpthread -lgconf-2 -lgio-2.0 -lresolv -lfontconfig -lfreetype -lpangocairo-1.0 -lcairo -lpangoft2-1.0 -lpango-1.0 -lharfbuzz -lX11 -lXi -lXcursor -lXext -lXfixes -lXrender -lXss -lXcomposite -lasound -lm -lXdamage -lXtst -lXrandr -lexpat -lcups -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lz -lcrypt -ldbus-1 -lcap -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lstdc++ -lm -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtendS.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crtn.o' (30 runs):

       6107.134141      task-clock (msec)         #    0.999 CPUs utilized            ( +-  0.17% )
                 3      context-switches          #    0.000 K/sec                    ( +-  6.02% )
                 0      cpu-migrations            #    0.000 K/sec                    ( +-100.00% )
           265,306      page-faults               #    0.043 M/sec                  
    18,526,275,665      cycles                    #    3.034 GHz                      ( +-  0.04% )
     8,848,225,267      stalled-cycles-frontend   #   47.76% frontend cycles idle     ( +-  0.08% )
                 0      stalled-cycles-backend    #    0.00% backend  cycles idle   
    26,469,971,796      instructions              #    1.43  insns per cycle        
                                                  #    0.33  stalled cycles per insn  ( +-  0.00% )
     5,300,395,447      branches                  #  867.902 M/sec                    ( +-  0.00% )
        68,369,538      branch-misses             #    1.29% of all branches          ( +-  0.00% )

       6.111418219 seconds time elapsed                                          ( +-  0.17% )


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [patch] Ignore non relobj files in gc
  2015-04-27 20:17 ` Cary Coutant
  2015-04-27 22:03   ` Rafael Espíndola
@ 2015-04-28 18:16   ` Sriraman Tallam
  1 sibling, 0 replies; 5+ messages in thread
From: Sriraman Tallam @ 2015-04-28 18:16 UTC (permalink / raw)
  To: Cary Coutant; +Cc: Rafael Espíndola, Binutils

On Mon, Apr 27, 2015 at 1:17 PM, Cary Coutant <ccoutant@gmail.com> wrote:
>> If a relocation points to a dynamic object we can ignore it, since we
>> cannot gc an already existing .so file.
>>
>> The attached patch produces an identical chromium binary, but does so
>> a bit faster (see the attached perf logs).
>
> I'd think the one-line patch below accomplishes the same result with
> much less disruption:
>
> @@ -340,7 +341,7 @@ gc_process_relocs(
>                                                           src_obj));
>             }
>
> -          if (gsym->source() != Symbol::FROM_OBJECT)
> +          if (dst_obj == NULL || dst_obj->is_dynamic())
>              continue;
>            if (!is_ordinary)
>              continue;
>
>> Using Relobj also helps me in my patch for gcing parts of SHF_MERGE sections.
>
> If that's the case, let's move those changes to a separate patch.
> Nevertheless, I think it would be cleaner to change Section_id to use
> a Relobj* directly. That has some cascading effects, but doesn't
> affect quite as much target-independent code, and we really never need
> a Section_id that refers to a non-relocatable object. The attached
> patch does that.
>
> Sri, would you mind taking a look to make sure I haven't done anything
> in the attached patch that might break --icf? Here's the only place
> where we might have created a Section_id with a pointer to a Dynobj,
> but I don't think that makes sense:
>
> @@ -324,8 +326,11 @@ gc_process_relocs(
>            if (is_icf_tracked)
>              {
>               Address symvalue = dst_off - addend;
> -              if (is_ordinary && gsym->source() == Symbol::FROM_OBJECT)
> -               (*secvec).push_back(Section_id(dst_obj, dst_indx));
> +              if (is_ordinary
> +                 && gsym->source() == Symbol::FROM_OBJECT
> +                 && !dst_obj->is_dynamic())
> +               (*secvec).push_back(Section_id(static_cast<Relobj*>(dst_obj),
> +                                              dst_indx));
>               else
>                  (*secvec).push_back(Section_id(NULL, 0));
>                (*symvec).push_back(gsym);

You have two sections that are mostly identical except a call
instruction that is calling two different functions in two different
shared objects, you are not tracking that anymore. We are tracking the
symbol name in the following line by pushing gsym onto symvec, so this
seems fine.  If there is ever a case where a symbol corresponding to a
relocation to a dynamic object has a NULL name, we could be in trouble
but I cannot think of anything like that.

Thanks
Sri

>
> Perhaps it does make sense here to track a relocation pointing into a
> dynamic object, but in this case, the static_cast might still be OK,
> since I think at this point, we're only using the object pointer as an
> opaque ID for the object.
>
> -cary

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [patch] Ignore non relobj files in gc
  2015-04-27 22:03   ` Rafael Espíndola
@ 2015-05-02 15:49     ` Cary Coutant
  0 siblings, 0 replies; 5+ messages in thread
From: Cary Coutant @ 2015-05-02 15:49 UTC (permalink / raw)
  To: Rafael Espíndola; +Cc: Binutils, Sriraman Tallam

[-- Attachment #1: Type: text/plain, Size: 2701 bytes --]

> What about the attached compromise patch? It changes the type of just
> the local variable.
>
>>> Using Relobj also helps me in my patch for gcing parts of SHF_MERGE sections.
>>
>> If that's the case, let's move those changes to a separate patch.
>> Nevertheless, I think it would be cleaner to change Section_id to use
>> a Relobj* directly. That has some cascading effects, but doesn't
>> affect quite as much target-independent code, and we really never need
>> a Section_id that refers to a non-relocatable object. The attached
>> patch does that.
>
> It is nicer. I started the patch trying it, hit the icf code and
> backed out a bit.

I've committed the attached patch to change Object* to Relobj* in
Section_id and to propagate that change as necessary.

-cary


Change Section_id type to use Relobj* instead of Object*.

2015-04-29  Cary Coutant  <cary@google.com>
            Rafael Ávila de Espíndola <rafael.espindola@gmail.com>

gold/
        * gc.h (Garbage_collection::is_section_garbage): Change Object*
        to Relobj*.
        (Garbage_collection::add_reference): Likewise.
        (Garbage_collection::gc_process_relocs): Likewise. Don't push
        object/shndx pair onto *secvec for dynamic objects. Don't follow
        relocations pointing to dynamic objects for GC.
        * icf.cc (Icf::find_identical_sections): Change Object* to Relobj*.
        (Icf::unfold_section): Likewise.
        (Icf::is_section_folded): Likewise.
        (Icf::get_folded_section): Likewise.
        * icf.h: (Icf::get_folded_section): Likewise.
        (Icf::unfold_section): Likewise.
        (Icf::is_section_folded): Likewise.
        (Icf::section_has_function_pointers): Likewise.
        (Icf::set_section_has_function_pointers): Likewise.
        * object.h (Section_id): Likewise.
        (Const_section_id): Likewise.
        * output.cc (Output_section::update_section_layout): Likewise.
        * output.h: (Output_section_lookup_maps::find_relaxed_input_section):
        Likewise.
        * plugin.cc (update_section_order): Likewise.
        (unique_segment_for_sections): Likewise.
        * powerpc.cc (Powerpc_relobj::add_reference): Likewise.
        (Target_powerpc::do_gc_add_reference): Likewise.
        (Target_powerpc::gc_process_relocs): Likewise.
        (Target_powerpc::do_gc_add_reference): Likewise.
        * symtab.cc (Symbol_table::is_section_folded): Likewise.
        (Symbol_table::gc_mark_symbol): Likewise.
        * symtab.h: (Symbol_table::is_section_folded): Likewise.
        * target.h: (Sized_target::gc_add_reference): Likewise.
        (Sized_target::do_gc_add_reference): Likewise.

[-- Attachment #2: gold-section-id.patch --]
[-- Type: application/octet-stream, Size: 15351 bytes --]

Change Section_id type to use Relobj* instead of Object*.

2015-04-29  Cary Coutant  <cary@google.com>
	    Rafael Ávila de Espíndola <rafael.espindola@gmail.com>

gold/
	* gc.h (Garbage_collection::is_section_garbage): Change Object*
	to Relobj*.
	(Garbage_collection::add_reference): Likewise.
	(Garbage_collection::gc_process_relocs): Likewise. Don't push
	object/shndx pair onto *secvec for dynamic objects. Don't follow
	relocations pointing to dynamic objects for GC.
	* icf.cc (Icf::find_identical_sections): Change Object* to Relobj*.
	(Icf::unfold_section): Likewise.
	(Icf::is_section_folded): Likewise.
	(Icf::get_folded_section): Likewise.
	* icf.h: (Icf::get_folded_section): Likewise.
	(Icf::unfold_section): Likewise.
	(Icf::is_section_folded): Likewise.
	(Icf::section_has_function_pointers): Likewise.
	(Icf::set_section_has_function_pointers): Likewise.
	* object.h (Section_id): Likewise.
	(Const_section_id): Likewise.
	* output.cc (Output_section::update_section_layout): Likewise.
	* output.h: (Output_section_lookup_maps::find_relaxed_input_section):
	Likewise.
	* plugin.cc (update_section_order): Likewise.
	(unique_segment_for_sections): Likewise.
	* powerpc.cc (Powerpc_relobj::add_reference): Likewise.
	(Target_powerpc::do_gc_add_reference): Likewise.
	(Target_powerpc::gc_process_relocs): Likewise.
	(Target_powerpc::do_gc_add_reference): Likewise.
	* symtab.cc (Symbol_table::is_section_folded): Likewise.
	(Symbol_table::gc_mark_symbol): Likewise.
	* symtab.h: (Symbol_table::is_section_folded): Likewise.
	* target.h: (Sized_target::gc_add_reference): Likewise.
	(Sized_target::do_gc_add_reference): Likewise.


diff --git a/gold/gc.h b/gold/gc.h
index bf4023d..c43fcbe 100644
--- a/gold/gc.h
+++ b/gold/gc.h
@@ -87,7 +87,7 @@ class Garbage_collection
   do_transitive_closure();
 
   bool
-  is_section_garbage(Object* obj, unsigned int shndx)
+  is_section_garbage(Relobj* obj, unsigned int shndx)
   { return (this->referenced_list().find(Section_id(obj, shndx))
             == this->referenced_list().end()); }
 
@@ -103,8 +103,8 @@ class Garbage_collection
   // Add a reference from the SRC_SHNDX-th section of SRC_OBJECT to
   // DST_SHNDX-th section of DST_OBJECT.
   void
-  add_reference(Object* src_object, unsigned int src_shndx,
-		Object* dst_object, unsigned int dst_shndx)
+  add_reference(Relobj* src_object, unsigned int src_shndx,
+		Relobj* dst_object, unsigned int dst_shndx)
   {
     Section_id src_id(src_object, src_shndx);
     Section_id dst_id(dst_object, dst_shndx);
@@ -229,7 +229,7 @@ gc_process_relocs(
       unsigned int r_type = elfcpp::elf_r_type<size>(r_info);
       typename elfcpp::Elf_types<size>::Elf_Swxword addend =
       Reloc_types<sh_type, size, big_endian>::get_reloc_addend_noerror(&reloc);
-      Object* dst_obj;
+      Relobj* dst_obj;
       unsigned int dst_indx;
       typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
       Address dst_off;
@@ -249,7 +249,7 @@ gc_process_relocs(
             {
 	      Address symvalue = dst_off - addend;
 	      if (is_ordinary) 
-		(*secvec).push_back(Section_id(dst_obj, dst_indx));
+		(*secvec).push_back(Section_id(src_obj, dst_indx));
 	      else
                 (*secvec).push_back(Section_id(NULL, 0));
               (*symvec).push_back(NULL);
@@ -289,9 +289,10 @@ gc_process_relocs(
           dst_obj = NULL;
           dst_indx = 0;
           bool is_ordinary = false;
-          if (gsym->source() == Symbol::FROM_OBJECT)
+          if (gsym->source() == Symbol::FROM_OBJECT
+	      && !gsym->object()->is_dynamic())
             {
-              dst_obj = gsym->object();
+              dst_obj = static_cast<Relobj*>(gsym->object());
               dst_indx = gsym->shndx(&is_ordinary);
             }
 	  dst_off = static_cast<const Sized_symbol<size>*>(gsym)->value();
@@ -301,7 +302,7 @@ gc_process_relocs(
 	  // of a function pointer being taken.
 	  if (gsym->source() == Symbol::FROM_OBJECT
               && check_section_for_function_pointers
-              && gsym->type() != elfcpp::STT_OBJECT
+              && dst_obj != NULL
               && (!is_ordinary
                   || scan.global_reloc_may_be_function_pointer(
                        symtab, NULL, NULL, src_obj, src_indx, NULL, reloc,
@@ -324,7 +325,7 @@ gc_process_relocs(
           if (is_icf_tracked)
             {
 	      Address symvalue = dst_off - addend;
-              if (is_ordinary && gsym->source() == Symbol::FROM_OBJECT)
+              if (is_ordinary && dst_obj != NULL)
 		(*secvec).push_back(Section_id(dst_obj, dst_indx));
 	      else
                 (*secvec).push_back(Section_id(NULL, 0));
@@ -340,7 +341,7 @@ gc_process_relocs(
                                                          src_obj));
 	    }
 
-          if (gsym->source() != Symbol::FROM_OBJECT)
+          if (dst_obj == NULL)
             continue;
           if (!is_ordinary)
             continue;
@@ -349,8 +350,8 @@ gc_process_relocs(
         {
 	  symtab->gc()->add_reference(src_obj, src_indx, dst_obj, dst_indx);
 	  parameters->sized_target<size, big_endian>()
-	    ->gc_add_reference(symtab, src_obj, src_indx,
-			       dst_obj, dst_indx, dst_off);
+	    ->gc_add_reference(symtab, src_obj, src_indx, dst_obj, dst_indx,
+			       dst_off);
           if (cident_section_name != NULL)
             {
               Garbage_collection::Cident_section_map::iterator ele =
diff --git a/gold/icf.cc b/gold/icf.cc
index 8de6386..96b7f2d 100644
--- a/gold/icf.cc
+++ b/gold/icf.cc
@@ -787,7 +787,7 @@ Icf::find_identical_sections(const Input_objects* input_objects,
       else if (sym->source() == Symbol::FROM_OBJECT 
                && !sym->object()->is_dynamic())
         {
-          Object* obj = sym->object();
+          Relobj* obj = static_cast<Relobj*>(sym->object());
           bool is_ordinary;
           unsigned int shndx = sym->shndx(&is_ordinary);
           if (is_ordinary)
@@ -804,7 +804,7 @@ Icf::find_identical_sections(const Input_objects* input_objects,
 // Unfolds the section denoted by OBJ and SHNDX if folded.
 
 void
-Icf::unfold_section(Object* obj, unsigned int shndx)
+Icf::unfold_section(Relobj* obj, unsigned int shndx)
 {
   Section_id secn(obj, shndx);
   Uniq_secn_id_map::iterator it = this->section_id_.find(secn);
@@ -821,7 +821,7 @@ Icf::unfold_section(Object* obj, unsigned int shndx)
 // is different from this section.
 
 bool
-Icf::is_section_folded(Object* obj, unsigned int shndx)
+Icf::is_section_folded(Relobj* obj, unsigned int shndx)
 {
   Section_id secn(obj, shndx);
   Uniq_secn_id_map::iterator it = this->section_id_.find(secn);
@@ -835,7 +835,7 @@ Icf::is_section_folded(Object* obj, unsigned int shndx)
 // This function returns the folded section for the given section.
 
 Section_id
-Icf::get_folded_section(Object* dup_obj, unsigned int dup_shndx)
+Icf::get_folded_section(Relobj* dup_obj, unsigned int dup_shndx)
 {
   Section_id dup_secn(dup_obj, dup_shndx);
   Uniq_secn_id_map::iterator it = this->section_id_.find(dup_secn);
diff --git a/gold/icf.h b/gold/icf.h
index d343fa5..7faf816 100644
--- a/gold/icf.h
+++ b/gold/icf.h
@@ -74,7 +74,7 @@ class Icf
   // Returns the kept folded identical section corresponding to
   // dup_obj and dup_shndx.
   Section_id
-  get_folded_section(Object* dup_obj, unsigned int dup_shndx);
+  get_folded_section(Relobj* dup_obj, unsigned int dup_shndx);
 
   // Forms groups of identical sections where the first member
   // of each group is the kept section during folding.
@@ -95,17 +95,17 @@ class Icf
 
   // Unfolds the section denoted by OBJ and SHNDX if folded.
   void
-  unfold_section(Object* obj, unsigned int shndx);
+  unfold_section(Relobj* obj, unsigned int shndx);
 
   // Returns the kept section corresponding to the
   // given section.
   bool
-  is_section_folded(Object* obj, unsigned int shndx);
+  is_section_folded(Relobj* obj, unsigned int shndx);
 
   // Given an object and a section index, this returns true if the
   // pointer of the function defined in this section is taken.
   bool
-  section_has_function_pointers(Object* obj, unsigned int shndx)
+  section_has_function_pointers(Relobj* obj, unsigned int shndx)
   {
     return (this->fptr_section_id_.find(Section_id(obj, shndx))
             != this->fptr_section_id_.end());
@@ -114,7 +114,7 @@ class Icf
   // Records that a pointer of the function defined in this section
   // is taken.
   void
-  set_section_has_function_pointers(Object* obj, unsigned int shndx)
+  set_section_has_function_pointers(Relobj* obj, unsigned int shndx)
   {
     this->fptr_section_id_.insert(Section_id(obj, shndx));
   }
diff --git a/gold/object.h b/gold/object.h
index fc93abd..a3d5d0e 100644
--- a/gold/object.h
+++ b/gold/object.h
@@ -2863,11 +2863,11 @@ struct Relocate_info
 
 // This is used to represent a section in an object and is used as the
 // key type for various section maps.
-typedef std::pair<Object*, unsigned int> Section_id;
+typedef std::pair<Relobj*, unsigned int> Section_id;
 
 // This is similar to Section_id but is used when the section
 // pointers are const.
-typedef std::pair<const Object*, unsigned int> Const_section_id;
+typedef std::pair<const Relobj*, unsigned int> Const_section_id;
 
 // The hash value is based on the address of an object in memory during
 // linking.  It is okay to use this for looking up sections but never use
diff --git a/gold/output.cc b/gold/output.cc
index ee6c475..781fbfb 100644
--- a/gold/output.cc
+++ b/gold/output.cc
@@ -3501,7 +3501,7 @@ Output_section::update_section_layout(
       if (p->is_input_section()
 	  || p->is_relaxed_input_section())
 	{
-	  Object* obj = (p->is_input_section()
+	  Relobj* obj = (p->is_input_section()
 			 ? p->relobj()
 			 : p->relaxed_input_section()->relobj());
 	  unsigned int shndx = p->shndx();
diff --git a/gold/output.h b/gold/output.h
index 318af36..be72965 100644
--- a/gold/output.h
+++ b/gold/output.h
@@ -2904,7 +2904,7 @@ class Output_section_lookup_maps
 
   // Find a relaxed input section of OBJECT with index SHNDX.
   Output_relaxed_input_section*
-  find_relaxed_input_section(const Object* object, unsigned int shndx) const
+  find_relaxed_input_section(const Relobj* object, unsigned int shndx) const
   {
     gold_assert(this->is_valid_);
     Relaxed_input_sections_by_id::const_iterator p =
diff --git a/gold/plugin.cc b/gold/plugin.cc
index 68da8e3..1588f34 100644
--- a/gold/plugin.cc
+++ b/gold/plugin.cc
@@ -1731,10 +1731,10 @@ update_section_order(const struct ld_plugin_section* section_list,
     {
       Object* obj = parameters->options().plugins()->get_elf_object(
           section_list[i].handle);
-      if (obj == NULL)
+      if (obj == NULL || obj->is_dynamic())
 	return LDPS_BAD_HANDLE;
       unsigned int shndx = section_list[i].shndx;
-      Section_id secn_id(obj, shndx);
+      Section_id secn_id(static_cast<Relobj*>(obj), shndx);
       (*order_map)[secn_id] = i + 1;
     }
 
@@ -1800,10 +1800,10 @@ unique_segment_for_sections(const char* segment_name,
     {
       Object* obj = parameters->options().plugins()->get_elf_object(
           section_list[i].handle);
-      if (obj == NULL)
+      if (obj == NULL || obj->is_dynamic())
 	return LDPS_BAD_HANDLE;
       unsigned int shndx = section_list[i].shndx;
-      Const_section_id secn_id(obj, shndx);
+      Const_section_id secn_id(static_cast<Relobj*>(obj), shndx);
       layout->insert_section_segment_map(secn_id, s);
     }
 
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index fddf3fa..29abd5e 100644
--- a/gold/powerpc.cc
+++ b/gold/powerpc.cc
@@ -212,7 +212,7 @@ public:
   // Add a reference from SRC_OBJ, SRC_INDX to this object's .opd
   // section at DST_OFF.
   void
-  add_reference(Object* src_obj,
+  add_reference(Relobj* src_obj,
 		unsigned int src_indx,
 		typename elfcpp::Elf_types<size>::Elf_Addr dst_off)
   {
@@ -780,9 +780,9 @@ class Target_powerpc : public Sized_target<size, big_endian>
   // section of a function descriptor.
   void
   do_gc_add_reference(Symbol_table* symtab,
-		      Object* src_obj,
+		      Relobj* src_obj,
 		      unsigned int src_shndx,
-		      Object* dst_obj,
+		      Relobj* dst_obj,
 		      unsigned int dst_shndx,
 		      Address dst_off) const;
 
@@ -6347,7 +6347,7 @@ Target_powerpc<size, big_endian>::gc_process_relocs(
 	  typename Powerpc_relobj<size, big_endian>::Section_refs::iterator s;
 	  for (s = p->second.begin(); s != p->second.end(); ++s)
 	    {
-	      Object* src_obj = s->first;
+	      Relobj* src_obj = s->first;
 	      unsigned int src_indx = s->second;
 	      symtab->gc()->add_reference(src_obj, src_indx,
 					  ppc_object, dst_indx);
@@ -6384,9 +6384,9 @@ template<int size, bool big_endian>
 void
 Target_powerpc<size, big_endian>::do_gc_add_reference(
     Symbol_table* symtab,
-    Object* src_obj,
+    Relobj* src_obj,
     unsigned int src_shndx,
-    Object* dst_obj,
+    Relobj* dst_obj,
     unsigned int dst_shndx,
     Address dst_off) const
 {
diff --git a/gold/symtab.cc b/gold/symtab.cc
index d2ed352..925296a 100644
--- a/gold/symtab.cc
+++ b/gold/symtab.cc
@@ -585,7 +585,7 @@ Symbol_table::Symbol_table_eq::operator()(const Symbol_table_key& k1,
 }
 
 bool
-Symbol_table::is_section_folded(Object* obj, unsigned int shndx) const
+Symbol_table::is_section_folded(Relobj* obj, unsigned int shndx) const
 {
   return (parameters->options().icf_enabled()
           && this->icf_->is_section_folded(obj, shndx));
@@ -650,10 +650,11 @@ Symbol_table::gc_mark_symbol(Symbol* sym)
   // Add the object and section to the work list.
   bool is_ordinary;
   unsigned int shndx = sym->shndx(&is_ordinary);
-  if (is_ordinary && shndx != elfcpp::SHN_UNDEF)
+  if (is_ordinary && shndx != elfcpp::SHN_UNDEF && !sym->object()->is_dynamic())
     {
       gold_assert(this->gc_!= NULL);
-      this->gc_->worklist().push_back(Section_id(sym->object(), shndx));
+      Relobj* relobj = static_cast<Relobj*>(sym->object());
+      this->gc_->worklist().push_back(Section_id(relobj, shndx));
     }
   parameters->target().gc_mark_symbol(this, sym);
 }
diff --git a/gold/symtab.h b/gold/symtab.h
index 6f47c5e..f6c0ac6 100644
--- a/gold/symtab.h
+++ b/gold/symtab.h
@@ -1372,7 +1372,7 @@ class Symbol_table
  
   // Returns true if ICF determined that this is a duplicate section. 
   bool
-  is_section_folded(Object* obj, unsigned int shndx) const;
+  is_section_folded(Relobj* obj, unsigned int shndx) const;
 
   void
   set_gc(Garbage_collection* gc)
diff --git a/gold/target.h b/gold/target.h
index 95bc57e..dfbc5ee 100644
--- a/gold/target.h
+++ b/gold/target.h
@@ -1056,9 +1056,9 @@ class Sized_target : public Target
   // and DST_OFF.
   void
   gc_add_reference(Symbol_table* symtab,
-		   Object* src_obj,
+		   Relobj* src_obj,
 		   unsigned int src_shndx,
-		   Object* dst_obj,
+		   Relobj* dst_obj,
 		   unsigned int dst_shndx,
 		   typename elfcpp::Elf_types<size>::Elf_Addr dst_off) const
   {
@@ -1080,8 +1080,8 @@ class Sized_target : public Target
 
   // Handle target specific gc actions when adding a gc reference.
   virtual void
-  do_gc_add_reference(Symbol_table*, Object*, unsigned int,
-		      Object*, unsigned int,
+  do_gc_add_reference(Symbol_table*, Relobj*, unsigned int,
+		      Relobj*, unsigned int,
 		      typename elfcpp::Elf_types<size>::Elf_Addr) const
   { }
 

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2015-05-02 15:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-23  2:27 [patch] Ignore non relobj files in gc Rafael Espíndola
2015-04-27 20:17 ` Cary Coutant
2015-04-27 22:03   ` Rafael Espíndola
2015-05-02 15:49     ` Cary Coutant
2015-04-28 18:16   ` Sriraman Tallam

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).