gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / gc.h
index 45f8d2af9c3af80453c0c16012b76b5061bafe79..cd5b539b4856903ee388aa83babc46ca95cb5072 100644 (file)
--- a/gold/gc.h
+++ b/gold/gc.h
@@ -1,6 +1,6 @@
 // gc.h -- garbage collection of unused sections
 
-// Copyright (C) 2009-2017 Free Software Foundation, Inc.
+// Copyright (C) 2009-2020 Free Software Foundation, Inc.
 // Written by Sriraman Tallam <tmsriram@google.com>.
 
 // This file is part of gold.
@@ -200,7 +200,8 @@ gc_process_relocs(
   bool check_section_for_function_pointers = false;
 
   if (parameters->options().icf_enabled()
-      && is_section_foldable_candidate(src_section_name.c_str()))
+      && (is_section_foldable_candidate(src_section_name)
+          || is_prefix_of(".eh_frame", src_section_name.c_str())))
     {
       is_icf_tracked = true;
       Section_id src_id(src_obj, src_indx);
@@ -247,7 +248,12 @@ gc_process_relocs(
                (*secvec).push_back(Section_id(src_obj, dst_indx));
              else
                 (*secvec).push_back(Section_id(NULL, 0));
-              (*symvec).push_back(NULL);
+              // If the target of the relocation is an STT_SECTION symbol,
+              // make a note of that by storing -1 in the symbol vector.
+              if (lsym.get_st_type() == elfcpp::STT_SECTION)
+               (*symvec).push_back(reinterpret_cast<Symbol*>(-1));
+             else
+               (*symvec).push_back(NULL);
              (*addendvec).push_back(std::make_pair(
                                        static_cast<long long>(symvalue),
                                        static_cast<long long>(addend)));
@@ -263,7 +269,7 @@ gc_process_relocs(
          if (is_ordinary
              && check_section_for_function_pointers
               && lsym.get_st_type() != elfcpp::STT_OBJECT
-             && scan.local_reloc_may_be_function_pointer(symtab, NULL, NULL,
+             && scan.local_reloc_may_be_function_pointer(symtab, NULL, target,
                                                          src_obj, src_indx,
                                                          NULL, reloc, r_type,
                                                          lsym))
@@ -295,11 +301,12 @@ gc_process_relocs(
          // When doing safe folding, check to see if this relocation is that
          // of a function pointer being taken.
          if (gsym->source() == Symbol::FROM_OBJECT
+              && gsym->type() == elfcpp::STT_FUNC
               && check_section_for_function_pointers
               && dst_obj != NULL
               && (!is_ordinary
                   || scan.global_reloc_may_be_function_pointer(
-                       symtab, NULL, NULL, src_obj, src_indx, NULL, reloc,
+                       symtab, NULL, target, src_obj, src_indx, NULL, reloc,
                        r_type, gsym)))
             symtab->icf()->set_section_has_function_pointers(dst_obj, dst_indx);
 
This page took 0.034467 seconds and 4 git commands to generate.