From: Mikhail Kurinnoi Date: Mon, 30 Nov 2020 09:12:59 +0000 (-0800) Subject: Fix arm32 naked functions registers push/pop logic. X-Git-Tag: submit/tizen/20210909.063632~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0a2377469a848b8063f0ae85b81a685500fe3c47;p=sdk%2Ftools%2Fcoreprofiler.git Fix arm32 naked functions registers push/pop logic. --- diff --git a/src/arch/arm/asmhelpers.S b/src/arch/arm/asmhelpers.S index 6dcc892..2d792b9 100644 --- a/src/arch/arm/asmhelpers.S +++ b/src/arch/arm/asmhelpers.S @@ -7,30 +7,42 @@ // EXTERN_C void EnterNaked3(FunctionIDOrClientID functionIDOrClientID); // NESTED_ENTRY EnterNaked3, _TEXT, NoHandler - push {r0-r7, lr} - .save {r0-r7, lr} + // From src/jit/codegenarm.cpp: + // On Arm arguments are prespilled on stack, which frees r0-r3. + PROLOG_PUSH "{r4-r11, lr}" + alloc_stack 4 // 8 byte align bl C_FUNC(EnterStub) - pop {r0-r7, pc} + free_stack 4 + EPILOG_POP "{r4-r11, pc}" NESTED_END EnterNaked3, _TEXT // // EXTERN_C void LeaveNaked3(FunctionIDOrClientID functionIDOrClientID); // NESTED_ENTRY LeaveNaked3, _TEXT, NoHandler - push {r0-r7, lr} - .save {r0-r7, lr} + // From src/jit/codegenarm.cpp: + // It is assumed that profiler Leave callback doesn't trash registers r1,REG_PROFILER_RET_SCRATCH (r2)... + // In the following cases r0 doesn't contain a return value and hence need not be preserved before emitting Leave callback. + PROLOG_PUSH "{r1, r2, r4-r11, lr}" + alloc_stack 4 // 8 byte align bl C_FUNC(LeaveStub) - pop {r0-r7, pc} + free_stack 4 + EPILOG_POP "{r1, r2, r4-r11, pc}" NESTED_END LeaveNaked3, _TEXT // // EXTERN_C void TailcallNaked3(FunctionIDOrClientID functionIDOrClientID); // NESTED_ENTRY TailcallNaked3, _TEXT, NoHandler - push {r0-r7, lr} - .save {r0-r7, lr} + // From src/jit/codegenarm.cpp: + // It is assumed that profiler Leave callback doesn't trash registers r1,REG_PROFILER_RET_SCRATCH (r2)... + // In the following cases r0 doesn't contain a return value and hence need not be preserved before emitting Leave callback. + // Note, Jit use same code for Tail callback helper and for Leave callback helper. + PROLOG_PUSH "{r1, r2, r4-r11, lr}" + alloc_stack 4 // 8 byte align bl C_FUNC(TailcallStub) - pop {r0-r7, pc} + free_stack 4 + EPILOG_POP "{r1, r2, r4-r11, pc}" NESTED_END TailcallNaked3, _TEXT NESTED_ENTRY getPrevPC, _TEXT, NoHandler