22 Commits

Author SHA1 Message Date
Lang Hames
255870d7b5 [JITLink] Update splitBlock to support splitting into multiple blocks.
LinkGraph::splitBlock used to take a single split-point to split a Block into
two. In the common case where a block needs to be split repeatedly (e.g. in
eh-frame and compact-unwind sections), iterative calls to splitBlock could
lead to poor performance as symbols and edges are repeatedly shuffled to new
blocks.

This commit updates LinkGraph::splitBlock to take a sequence of split offsets,
allowing a block to be split into an arbitrary number of new blocks. Internally,
Symbols and Edges only need to be moved once (directly to whichever new block
they will be associated with), leading to better performance.

On some large MachO object files in an out of tree project this change improved
the performance of splitBlock by several orders of magnitude.

rdar://135820493
2024-09-22 09:52:08 +10:00
Kai Luo
18dc8dcd76
[PowerPC][JITLink] Support R_PPC64_GOT_TLSGD_PCREL34 (#68660)
`R_PPC64_GOT_TLSGD_PCREL34` is generated for pwr10+.
2023-10-14 10:57:03 +08:00
Kai Luo
a712244f3b
[PowerPC][JITLink] Support R_PPC64_GOT_PCREL34 (#68658)
`R_PPC64_GOT_PCREL34` is generated for pwr10+.
2023-10-13 08:51:11 +08:00
Jonas Hahnfeld
b9383a86b8
[JITLink] Some cleanups to EHFrameSupport (#66707)
* Remove unused variable.
 * Error on existing edge at CIE pointer field.
 * Simplify CFI processing in `EHFrameEdgeFixer`: The code expects
`DWARFRecordSectionSplitter` to split each CFI record into its own
block, so remove loop over possibly multiple entries in one block.
2023-10-05 18:16:48 +02:00
Kai Luo
1dae4dd0d8 [JITLink][PowerPC] Fix incorrect assertion of addend for R_PPC64_REL24
There is case that R_PPC64_REL24 with non-zero addend. The assertion is incorrectly triggered in such situation.

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D158708
2023-09-14 02:40:45 +00:00
bzEq
0eeca5739a
[JITLink][PowerPC] Port rtdyld's tests to jitlink. NFC. (#65739) 2023-09-09 05:52:58 +08:00
Kai Luo
bed9081896 Reland [JITLink][PowerPC] Pre-commit test for D158708. NFC. 2023-08-28 14:06:02 +08:00
Alex Lorenz
41db543807
Revert "[JITLink][PowerPC] Pre-commit test for D158708. NFC."
This reverts commit 4468103bf68ce09820d0e31fa7c725004b5f2ca4.

This added testcase is failing on Darwin:
https://green.lab.llvm.org/green/job/clang-stage1-cmake-RA-incremental/37181/testReport/junit/LLVM/ExecutionEngine_JITLink_ppc64/ppc64_rel24_non_zero_addend_test/

More info in: https://reviews.llvm.org/D158708
2023-08-24 09:03:05 -07:00
Kai Luo
4468103bf6 [JITLink][PowerPC] Pre-commit test for D158708. NFC. 2023-08-24 07:41:33 +00:00
Kai Luo
b6e2eac293 [JITLink][PowerPC] Add relocations included in rtdyld but missing from jitlink
RuntimeDyld has implemented more relocations than JITLink for ppc64. This patch adds relocations missing from JITLink for ppc64.

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D157366
2023-08-13 09:44:18 +08:00
Kai Luo
beb937e8dd [JITLink][PowerPC] Correct size and align in assembly directives. NFC. 2023-08-09 05:24:47 +00:00
Kai Luo
d6791fb774 [JITLink][PowerPC] Fix relocations in stubs for ppc64 big-endian target
Offset and addend are fixed for big-endian stubs.

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D157257
2023-08-09 02:04:01 +00:00
Kai Luo
af07ec316f [JITLink][PowerPC] Enable more tests for ppc64 big-endian target. NFC. 2023-08-07 15:52:58 +08:00
Kai Luo
0c1f318646 [JITLink][PowerPC] Rename test files by removing 'le' suffix. NFC. 2023-08-07 11:21:05 +08:00
Kai Luo
be7a54655c [JITLink][ELF] Fix reading target architecture when the ELF object is big-endian
Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D156982
2023-08-04 10:55:38 +08:00
Kai Luo
68c98f3550 [JITLink][PowerPC] Add run lines for powerpc64. NFC. 2023-08-03 09:55:03 +00:00
Kai Luo
ca6d86f6bf [JITLink][PowerPC] Support R_PPC64_PCREL34
PC-relative instructions are added in ISA-3.1 implemented by pwr10. This patch adds basic pc-relative relocation.

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D155771
2023-08-02 02:00:38 +00:00
Kai Luo
11a02de782 [JITLink][PowerPC] Change method to check if a symbol is external to current object
After PrePrunePass `claimOrExternalizeWeakAndCommonSymbols`, a defined symbol might become external. So determine a function call is external or not when building the linkgraph is not accurate. This largely affects updating TOC pointer on PowerPC. TOC pointer is supposed to be the same in one object file(if no mulitple TOC appears) and is updated when control flow transferred to another object file.

This patch defers checking a function call is external or not, in `buildTables_ELF_ppc64` which is a PostPrunePass.

This patch fixes failures when `jitlink -orc-runtime=/path/to/libort_rt.a` is used.

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D155925
2023-07-26 03:20:56 +00:00
Kai Luo
cee4494c14 [JITLink][PowerPC] Pre-commit test for D155925. NFC. 2023-07-25 08:27:03 +00:00
Kai Luo
995f199f0a [JITLink][PowerPC] Correct handling of R_PPC64_REL24_NOTOC
According to the ELFv2 ABI

> This relocation type is used to specify a function call where the TOC pointer is not initialized. It is similar to R_PPC64_REL24 in that it specifies a symbol to be resolved. If the symbol resolves to a function that requires a TOC pointer (as determined by st_other bits) then a link editor must arrange for the call to be via the global entry point of the called function. Any stub code must not rely on a valid TOC base address in r2.

This patch fixes handling of `R_PPC64_REL24_NOTOC` by using the same stub code sequence as lld.

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D155672
2023-07-24 14:00:53 +08:00
Kai Luo
61358d4fbe [JITLink][PowerPC] Add TOC and relocations for ppc64
This patch builds TOC and adds common relocations for ppc64.

To build TOC, sections belong to TOC are merged into one section, serves as GOT and small data accessing.

Relocations commonly seen in local function call, external function call and global variable reference are added.

References
- https://youtu.be/i-inxFudrgI
- https://maskray.me/blog/2023-02-26-linker-notes-on-power-isa
- https://openpowerfoundation.org/specifications/64bitelfabi/

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D154198
2023-07-10 11:26:53 +08:00
Lang Hames
8313507a7c [JITLink][ELF][ppc64] Add skeleton ppc64 support and ELF/ppc64 JITLink backend.
This patch introduces a skeleton JITLink ppc64 support header and ELF/ppc64
backend. No relocations are supported in this initial version, but given a
program requiring no relocations (e.g. one that just returns a constant value
from main) the new backend is able to construct a LinkGraph from a ppc64 ELF
relocatable object, and the llvm-jitlink tool is able to execute it.

This commit should also serve as a good example of how to introduce a JITLink
backend for a new architecture.

Reviewed By: sgraenitz, v.g.vassilev, vchuravy, nemanjai, jain98, MaskRay

Differential Revision: https://reviews.llvm.org/D148192
2023-05-22 20:10:01 +00:00