[PATCH] D86706: [LLD][PowerPC] Add pc-rel based long branch thunks

Nemanja Ivanovic via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 27 10:49:34 PDT 2020


nemanjai added inline comments.


================
Comment at: lld/ELF/Thunks.cpp:993
+
+void PPC64PCRelLongBranchThunk::writeTo(uint8_t *buf) {
+  int64_t offset = in.ppc64LongBranchTarget->getEntryVA(&destination, addend) -
----------------
NeHuang wrote:
> sfertile wrote:
> > The R12Setup stub calculates the address of the callee relative to the program counter.
> > 
> > ```
> >   writePrefixedInstruction(buf + 0, paddi); // paddi r12, 0, func at pcrel, 1
> >   write32(buf + 8, MTCTR_R12);              // mtctr r12
> >   write32(buf + 12, BCTR);                  // bctr
> > ```
> > 
> > The toc-based long branch thunks have to use a table in the data segment because of limited address-ability. The pc-rel instructions and ABI doesn't have the same limitation, so why use the branch linkage table intead of doing the same thing the R12Setup stubs do?
> Good point! Will update the patch without using branch_lt table. 
Is it not possible to need a long branch to a destination that isn't available yet? I thought that something like the following would require a long branch to a PLT stub:

```
#include <stdio.h>
int main(int argc, const char **argv) {
  int a = argc;
  printf("a = %d\n", a);
  asm (".space 134217728");
  printf("a = %d\n", a);
}
```
But that seems to create two PLT stubs. Is this something that always happens? Namely, is it always the case that the linker will never create a thunk that goes to another thunk? If so, I think a comment explaining that might be useful.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D86706



More information about the llvm-commits mailing list