This is the diff from:

  https://reviews.llvm.org/D75419

which is needed to be able to link llvm with lld on powerpc.

Not enough to link code generated by gcc 4.x though, but if I dissable
building gcc a make build completes.

What would the impact on ports of disabling base-gcc be on powerpc?

ok?


Index: gnu/llvm/lld/ELF/InputSection.cpp
===================================================================
RCS file: /cvs/src/gnu/llvm/lld/ELF/InputSection.cpp,v
retrieving revision 1.1.1.2
diff -u -p -r1.1.1.2 InputSection.cpp
--- gnu/llvm/lld/ELF/InputSection.cpp   9 Aug 2020 15:52:06 -0000       1.1.1.2
+++ gnu/llvm/lld/ELF/InputSection.cpp   15 Nov 2020 16:15:46 -0000
@@ -438,11 +438,12 @@ void InputSection::copyRelocations(uint8
       // hopefully creates a frame that is ignored at runtime. Also, don't warn
       // on .gcc_except_table and debug sections.
       //
-      // See the comment in maybeReportUndefined for PPC64 .toc .
+      // See the comment in maybeReportUndefined for PPC32 .got2 and PPC64 .toc
       auto *d = dyn_cast<Defined>(&sym);
       if (!d) {
         if (!isDebugSection(*sec) && sec->name != ".eh_frame" &&
-            sec->name != ".gcc_except_table" && sec->name != ".toc") {
+            sec->name != ".gcc_except_table" && sec->name != ".got2" &&
+            sec->name != ".toc") {
           uint32_t secIdx = cast<Undefined>(sym).discardedSecIdx;
           Elf_Shdr_Impl<ELFT> sec =
               CHECK(file->getObj().sections(), file)[secIdx];
Index: gnu/llvm/lld/ELF/Relocations.cpp
===================================================================
RCS file: /cvs/src/gnu/llvm/lld/ELF/Relocations.cpp,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 Relocations.cpp
--- gnu/llvm/lld/ELF/Relocations.cpp    3 Aug 2020 14:32:29 -0000       1.1.1.1
+++ gnu/llvm/lld/ELF/Relocations.cpp    15 Nov 2020 16:15:46 -0000
@@ -926,8 +926,12 @@ static bool maybeReportUndefined(Symbol 
   // .toc and the .rela.toc are incorrectly not placed in the comdat. The ELF
   // spec says references from outside the group to a STB_LOCAL symbol are not
   // allowed. Work around the bug.
-  if (config->emachine == EM_PPC64 &&
-      cast<Undefined>(sym).discardedSecIdx != 0 && sec.name == ".toc")
+  //
+  // PPC32 .got2 is similar but cannot be fixed. Multiple .got2 is infeasible
+  // because .LC0-.LTOC is not representable if the two labels are in different
+  // .got2
+  if (cast<Undefined>(sym).discardedSecIdx != 0 &&
+      (sec.name == ".got2" || sec.name == ".toc"))
     return false;
 
   bool isWarning =

Reply via email to