diff options
author | Roman Artemev <rartemev@microsoft.com> | 2017-10-26 23:01:27 -0700 |
---|---|---|
committer | Jan Vorlicek <janvorli@microsoft.com> | 2017-10-27 08:01:27 +0200 |
commit | 79c9bd4add54afbb57aede7c3c9bd100bfbd988e (patch) | |
tree | 5442a1c647e472ac96ccc07a2cbf8f42867a0fbd /src/vm/arm | |
parent | d320cea98c24f232d5258599f975bb7e6602d8d4 (diff) | |
download | coreclr-79c9bd4add54afbb57aede7c3c9bd100bfbd988e.tar.gz coreclr-79c9bd4add54afbb57aede7c3c9bd100bfbd988e.tar.bz2 coreclr-79c9bd4add54afbb57aede7c3c9bd100bfbd988e.zip |
Implemented TailCall ELT hook for arm32 Linux (#14713)
* Added TailCall ELT hook for arm32 Linux
* fixed review
Diffstat (limited to 'src/vm/arm')
-rw-r--r-- | src/vm/arm/asmhelpers.S | 53 | ||||
-rw-r--r-- | src/vm/arm/unixstubs.cpp | 5 |
2 files changed, 48 insertions, 10 deletions
diff --git a/src/vm/arm/asmhelpers.S b/src/vm/arm/asmhelpers.S index 36933f5ea6..40faf9c3bc 100644 --- a/src/vm/arm/asmhelpers.S +++ b/src/vm/arm/asmhelpers.S @@ -662,11 +662,11 @@ NESTED_ENTRY ProfileEnterNaked, _TEXT, NoHandler PROLOG_PUSH "{r4, r5, r7, r11, lr}" PROLOG_STACK_SAVE_OFFSET r7, #8 - // fields of PLATFORM_SPECIFIC_DATA, in reverse order + // fields of PROFILE_PLATFORM_SPECIFIC_DATA, in reverse order // UINT32 r0; // Keep r0 & r1 contiguous to make returning 64-bit results easier // UINT32 r1; - // void *R11; + // void *r11; // void *Pc; // union // Float arg registers as 32-bit (s0-s15) and 64-bit (d0-d7) // { @@ -705,11 +705,11 @@ NESTED_ENTRY ProfileLeaveNaked, _TEXT, NoHandler PROLOG_PUSH "{r1, r2, r4, r5, r7, r11, lr}" PROLOG_STACK_SAVE_OFFSET r7, #16 - // fields of PLATFORM_SPECIFIC_DATA, in reverse order + // fields of PROFILE_PLATFORM_SPECIFIC_DATA, in reverse order // UINT32 r0; // Keep r0 & r1 contiguous to make returning 64-bit results easier // UINT32 r1; - // void *R11; + // void *r11; // void *Pc; // union // Float arg registers as 32-bit (s0-s15) and 64-bit (d0-d7) // { @@ -734,13 +734,56 @@ NESTED_ENTRY ProfileLeaveNaked, _TEXT, NoHandler push { lr } push { r11 } push { r1 } - push { r2 } + push { r0 } mov r1, sp bl C_FUNC(ProfileLeave) EPILOG_STACK_RESTORE_OFFSET r7, #16 EPILOG_POP "{r1, r2, r4, r5, r7, r11, pc}" NESTED_END ProfileLeaveNaked, _TEXT +// +// EXTERN_C void ProfileTailcallNaked(FunctionIDOrClientID functionIDOrClientID); +// +NESTED_ENTRY ProfileTailcallNaked, _TEXT, NoHandler + PROLOG_PUSH "{r1, r2, r4, r5, r7, r11, lr}" + PROLOG_STACK_SAVE_OFFSET r7, #16 + + // fields of PROFILE_PLATFORM_SPECIFIC_DATA, in reverse order + + // UINT32 r0; // Keep r0 & r1 contiguous to make returning 64-bit results easier + // UINT32 r1; + // void *r11; + // void *Pc; + // union // Float arg registers as 32-bit (s0-s15) and 64-bit (d0-d7) + // { + // UINT32 s[16]; + // UINT64 d[8]; + // }; + // FunctionID functionId; + // void *probeSp; // stack pointer of managed function + // void *profiledSp; // location of arguments on stack + // LPVOID hiddenArg; + // UINT32 flags; + movw r4, #2 + push { /* flags */ r4 } + movw r4, #0 + push { /* hiddenArg */ r4 } + add r5, r11, #8 + push { /* profiledSp */ r5 } + add r5, sp, #40 + push { /* probeSp */ r5 } + push { /* functionId */ r0 } + vpush.64 { d0 - d7 } + push { lr } + push { r11 } + push { r1 } + push { r0 } + mov r1, sp + bl C_FUNC(ProfileTailcall) + EPILOG_STACK_RESTORE_OFFSET r7, #16 + EPILOG_POP "{r1, r2, r4, r5, r7, r11, pc}" +NESTED_END ProfileTailcallNaked, _TEXT + // EXTERN_C int __fastcall HelperMethodFrameRestoreState( // INDEBUG_COMMA(HelperMethodFrame *pFrame) // MachState *pState diff --git a/src/vm/arm/unixstubs.cpp b/src/vm/arm/unixstubs.cpp index 62f60473ab..b1462fab3a 100644 --- a/src/vm/arm/unixstubs.cpp +++ b/src/vm/arm/unixstubs.cpp @@ -15,9 +15,4 @@ extern "C" { PORTABILITY_ASSERT("Implement for PAL"); } - - void ProfileTailcallNaked(FunctionIDOrClientID functionIDOrClientID) - { - PORTABILITY_ASSERT("Implement for PAL"); - } }; |