[XRay][Arm32] Reduce the portion of the stub and implement more staging for tail calls - in compiler-rt

Summary:
This patch provides more staging for tail calls in XRay Arm32 . When the logging part of XRay is ready for tail calls, its support in the core part of XRay Arm32 may be as easy as changing the number passed to the handler from 1 to 2.
Coupled patch:
- https://reviews.llvm.org/D28673

Reviewers: dberris, rengolin

Reviewed By: dberris, rengolin

Subscribers: llvm-commits, iid_iunknown, aemerson

Differential Revision: https://reviews.llvm.org/D28674

llvm-svn: 293186
This commit is contained in:
Serge Rogatch 2017-01-26 16:18:13 +00:00
parent e09ba748cf
commit c4540b371d
2 changed files with 34 additions and 3 deletions

View File

@ -153,9 +153,7 @@ bool patchFunctionExit(const bool Enable, const uint32_t FuncId,
bool patchFunctionTailExit(const bool Enable, const uint32_t FuncId,
const XRaySledEntry &Sled) XRAY_NEVER_INSTRUMENT {
// FIXME: In the future we'd need to distinguish between non-tail exits and
// tail exits for better information preservation.
return patchSled(Enable, FuncId, Sled, __xray_FunctionExit);
return patchSled(Enable, FuncId, Sled, __xray_FunctionTailExit);
}
} // namespace __xray

View File

@ -3,6 +3,7 @@
.fpu vfpv2
.code 32
.global _ZN6__xray19XRayPatchedFunctionE
@ Word-aligned function entry point
.p2align 2
@ Let C/C++ see the symbol
@ -63,3 +64,35 @@ FunctionExit_restore:
@ Restore the floating-point return value of the instrumented function
VPOP {d0}
POP {r1-r3,pc}
@ Word-aligned function entry point
.p2align 2
@ Let C/C++ see the symbol
.global __xray_FunctionTailExit
@ It preserves all registers except r0, r12(ip), r14(lr) and r15(pc)
@ Assume that "q" part of the floating-point registers is not used
@ for passing parameters to C/C++ functions.
.type __xray_FunctionTailExit, %function
@ In C++ it is void extern "C" __xray_FunctionTailExit(uint32_t FuncId)
@ with FuncId passed in r0 register.
__xray_FunctionTailExit:
PUSH {r1-r3,lr}
@ Save floating-point parameters of the instrumented function
VPUSH {d0-d7}
MOVW r1,#:lower16:_ZN6__xray19XRayPatchedFunctionE
MOVT r1,#:upper16:_ZN6__xray19XRayPatchedFunctionE
LDR r2, [r1]
@ Handler address is nullptr if handler is not set
CMP r2, #0
BEQ FunctionTailExit_restore
@ Function ID is already in r0 (the first parameter).
@ r1=2 means that we are tracing a tail exit event
@ But before the logging part of XRay is ready, we pretend that here a
@ normal function exit happens, so we give the handler code 1
MOV r1, #1
@ Call the handler with 2 parameters in r0 and r1
BLX r2
FunctionTailExit_restore:
@ Restore floating-point parameters of the instrumented function
VPOP {d0-d7}
POP {r1-r3,pc}