[GOLD] Symbol flag for PowerPC64 localentry:0 tracking
[deliverable/binutils-gdb.git] / gold / powerpc.cc
index 6f610cbe8cb4c0f3eb3f83d9cad3679fadbffb6b..c29850b617aa6f3b07b9679bea122a91ba3bb4b5 100644 (file)
@@ -1026,7 +1026,8 @@ class Target_powerpc : public Sized_target<size, big_endian>
            && this->plt_localentry0()
            && gsym->type() == elfcpp::STT_FUNC
            && gsym->is_defined()
-           && gsym->nonvis() >> 3 == 0);
+           && gsym->nonvis() >> 3 == 0
+           && !gsym->non_zero_localentry());
   }
 
   bool
@@ -1051,6 +1052,22 @@ class Target_powerpc : public Sized_target<size, big_endian>
     return false;
   }
 
+  // Remember any symbols seen with non-zero localentry, even those
+  // not providing a definition
+  bool
+  resolve(Symbol* to, const elfcpp::Sym<size, big_endian>& sym, Object*,
+         const char*)
+  {
+    if (size == 64)
+      {
+       unsigned char st_other = sym.get_st_other();
+       if ((st_other & elfcpp::STO_PPC64_LOCAL_MASK) != 0)
+         to->set_non_zero_localentry();
+      }
+    // We haven't resolved anything, continue normal processing.
+    return false;
+  }
+
   int
   abiversion() const
   { return this->processor_specific_flags() & elfcpp::EF_PPC64_ABI; }
@@ -1603,7 +1620,7 @@ Target::Target_info Target_powerpc<64, true>::powerpc_info =
   true,                        // is_big_endian
   elfcpp::EM_PPC64,    // machine_code
   false,               // has_make_symbol
-  false,               // has_resolve
+  true,                        // has_resolve
   false,               // has_code_fill
   true,                        // is_default_stack_executable
   false,               // can_icf_inline_merge_sections
@@ -1631,7 +1648,7 @@ Target::Target_info Target_powerpc<64, false>::powerpc_info =
   false,               // is_big_endian
   elfcpp::EM_PPC64,    // machine_code
   false,               // has_make_symbol
-  false,               // has_resolve
+  true,                        // has_resolve
   false,               // has_code_fill
   true,                        // is_default_stack_executable
   false,               // can_icf_inline_merge_sections
This page took 0.02885 seconds and 4 git commands to generate.