[PATCH] D154198: [JITLink][PowerPC] Add TOC and relocations for ppc64

Lang Hames via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 4 16:45:08 PDT 2023


lhames added a comment.

Thanks very much @lkail!

I just tested this out locally and it's exciting to see nontrivial test cases running.



================
Comment at: llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h:112-117
+    case RequestToBeGOTEntry: {
+      this->appendEntry(
+          E.getTarget(),
+          G.addAnonymousSymbol(*B, 0, G.getPointerSize(), false, false));
+      E.setKind(ppc64::Pointer64);
+      return true;
----------------
Just to make sure I follow:

`ELFLinkGraphBuilder_ppc64` converts `R_PPC64_ADDR64` to `RequestToBeGOTEntry` when it's a relocation _from_ a preexisting GOT entry in the object file?

Rather than using a special edge kind, could we walk the `.toc` section in the `buildTables_ELF_ppc64` function to pre-register the entries before calling `visitExistingEdges`?  Would that allow us to drop the `RequestToBeGOTEntry` edge kind and use `Pointer64` unconditionally for `R_PPC64_ADDR64`?

I'm imagining something like:

```
template <support::endianness Endianness>
Error buildTables_ELF_ppc64(LinkGraph &G) {
  LLVM_DEBUG(dbgs() << "Visiting edges in graph:\n");
  ppc64::TOCTableManager<Endianness> TOC;

  // Register preexisting GOT entries with TOC table manager.
  if (auto *dotTOCSection = G.findSectionByName(".toc")) {
    for (<each GOT entry>)
      TOC.appendEntry(<entry target>, <entry symbol>);
  }

  ppc64::PLTTableManager<Endianness> PLT(TOC);
  createELFGOTHeader(G, TOC);
  visitExistingEdges(G, TOC, PLT);
  ...
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D154198/new/

https://reviews.llvm.org/D154198



More information about the llvm-commits mailing list