Reland "[JITLink] Initial AArch32 backend"
authorStefan Gränitz <stefan.graenitz@gmail.com>
Thu, 23 Mar 2023 10:10:39 +0000 (11:10 +0100)
committerStefan Gränitz <stefan.graenitz@gmail.com>
Fri, 24 Mar 2023 09:18:08 +0000 (10:18 +0100)
commit5c1d160cd979dd6099f4266db600020a0cb4867a
tree19e58f38bd80cbee1e439fd4f58de1ebfa5f34d1
parent410a239996725e68b431e7e3e43e270290be93d2
Reland "[JITLink] Initial AArch32 backend"

This first version lays the foundations for AArch32 support in JITLink. ELFLinkGraphBuilder_aarch32 processes REL-type relocations and populates LinkGraphs from ELF object files for both big- and little-endian systems. The ArmCfg member controls subarchitecture-specific details throughout the linking process (i.e. it's passed to ELFJITLinker_aarch32).

Relocation types follow the ABI documentation's division into classes: Data (endian-sensitive), Arm (32-bit little-endian) and Thumb (2x 16-bit little-endian, "Thumb32" in the docs). The implementation of instruction encoding/decoding for relocation resolution is implemented symmetrically and is testable in isolation (see AArch32 category in JITLinkTests).

Callable Thumb functions are marked with a ThumbSymbol target-flag and stored in the LinkGraph with their real addresses. The thumb-bit is added back in when the owning JITDylib requests the address for such a symbol.

The StubsManager can generate (absolute) Thumb-state stubs for branch range extensions on v7+ targets. Proper GOT/PLT handling is not yet implemented.

This patch is based on the backend implementation in ez-clang and has just enough functionality to model the infrastructure and link a Thumb function `main()` that calls `printf()` to dump "Hello Arm!" on Armv7a. It was tested on Raspberry Pi with 32-bit Raspbian OS.

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D144083
13 files changed:
llvm/include/llvm/ExecutionEngine/JITLink/ELF_aarch32.h [new file with mode: 0644]
llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h [new file with mode: 0644]
llvm/lib/ExecutionEngine/JITLink/CMakeLists.txt
llvm/lib/ExecutionEngine/JITLink/ELF.cpp
llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h
llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp [new file with mode: 0644]
llvm/lib/ExecutionEngine/JITLink/aarch32.cpp [new file with mode: 0644]
llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
llvm/test/ExecutionEngine/JITLink/AArch32/ELF_thumbv7_printf.s [new file with mode: 0644]
llvm/test/ExecutionEngine/JITLink/AArch32/lit.local.cfg [new file with mode: 0644]
llvm/unittests/ExecutionEngine/JITLink/AArch32Tests.cpp [new file with mode: 0644]
llvm/unittests/ExecutionEngine/JITLink/CMakeLists.txt