From 7b4cf161aa98c4f65d9968734e09394b0199e458 Mon Sep 17 00:00:00 2001 From: svenbarth Date: Wed, 21 Aug 2019 20:25:31 +0000 Subject: [PATCH] * implement RawThunk for ARM git-svn-id: trunk@42755 - --- packages/rtl-objpas/src/inc/rtti.pp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/packages/rtl-objpas/src/inc/rtti.pp b/packages/rtl-objpas/src/inc/rtti.pp index 5f84aa0422..d582369ad2 100644 --- a/packages/rtl-objpas/src/inc/rtti.pp +++ b/packages/rtl-objpas/src/inc/rtti.pp @@ -891,6 +891,34 @@ asm RawThunkEnd: end; {$endif} +{$elseif defined(cpuarm)} +const + RawThunkPlaceholderProc = $87658765; + RawThunkPlaceholderContext = $43214321; + +type + TRawThunkProc = PtrUInt; + TRawThunkContext = PtrUInt; + +procedure RawThunk; assembler; nostackframe; +asm + (* To be compatible with Thumb we first load the function pointer into R0, + then move that to R12 which is volatile and then we load the new Self into + R0 *) + ldr r0, .LProc + mov r12, r0 + ldr r0, .LContext +{$ifdef CPUARM_HAS_BX} + bx r12 +{$else} + mov pc, r12 +{$endif} +.LProc: + .long RawThunkPlaceholderProc +.LContext: + .long RawThunkPlaceholderContext +RawThunkEnd: +end; {$endif} {$if declared(RawThunk)}