aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
diff options
context:
space:
mode:
authorStefan Gränitz <stefan.graenitz@gmail.com>2023-03-23 11:10:39 +0100
committerStefan Gränitz <stefan.graenitz@gmail.com>2023-03-23 11:25:45 +0100
commitc2de8ff92753acdb1ace7a27cc11cb09f28eb8fa (patch)
tree4c3af5ce764ff1a16f97d6cb17915b1d343759c6 /llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
parentd25751779baa37356265b004edc7e55ee4a4c383 (diff)
downloadllvm-c2de8ff92753acdb1ace7a27cc11cb09f28eb8fa.zip
llvm-c2de8ff92753acdb1ace7a27cc11cb09f28eb8fa.tar.gz
llvm-c2de8ff92753acdb1ace7a27cc11cb09f28eb8fa.tar.bz2
[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
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp')
-rw-r--r--llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
index 2c270cd..83a09b8 100644
--- a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
@@ -8,6 +8,7 @@
#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"
+#include "llvm/ExecutionEngine/JITLink/aarch32.h"
#include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h"
#include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h"
#include "llvm/ExecutionEngine/Orc/Shared/ObjectFormats.h"
@@ -40,7 +41,10 @@ bool hasInitializerSection(jitlink::LinkGraph &G) {
}
JITTargetAddress getJITSymbolPtrForSymbol(Symbol &Sym) {
- return Sym.getAddress().getValue();
+ uint64_t CallableAddr = Sym.getAddress().getValue();
+ if (Sym.isCallable() && Sym.hasTargetFlags(aarch32::ThumbSymbol))
+ CallableAddr |= 0x01; // thumb bit
+ return CallableAddr;
}
JITSymbolFlags getJITSymbolFlagsForSymbol(Symbol &Sym) {