[PATCH] D40894: [XRay][compiler-rt+llvm] Update XRay trampoline CFI and register stashing semantics
Dean Michael Berris via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Dec 10 20:11:49 PST 2017
dberris updated this revision to Diff 126305.
dberris added a comment.
Rebase and back-out the CFI details. We can follow-up on those as the semantics changes are more important at this time.
https://reviews.llvm.org/D40894
Files:
compiler-rt/lib/xray/xray_trampoline_x86_64.S
llvm/include/llvm/IR/Intrinsics.td
Index: llvm/include/llvm/IR/Intrinsics.td
===================================================================
--- llvm/include/llvm/IR/Intrinsics.td
+++ llvm/include/llvm/IR/Intrinsics.td
@@ -880,7 +880,7 @@
// Custom event logging for x-ray.
// Takes a pointer to a string and the length of the string.
def int_xray_customevent : Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty],
- [NoCapture<0>, ReadOnly<0>, IntrWriteMem]>;
+ [NoCapture<0>, ReadOnly<0>, IntrWriteMem, IntrHasSideEffects]>;
//===----------------------------------------------------------------------===//
//===------ Memory intrinsics with element-wise atomicity guarantees ------===//
Index: compiler-rt/lib/xray/xray_trampoline_x86_64.S
===================================================================
--- compiler-rt/lib/xray/xray_trampoline_x86_64.S
+++ compiler-rt/lib/xray/xray_trampoline_x86_64.S
@@ -20,7 +20,7 @@
.macro SAVE_REGISTERS
subq $192, %rsp
- CFI_DEF_CFA_OFFSET(200)
+ CFI_ADJUST_CFA_OFFSET(192)
// At this point, the stack pointer should be aligned to an 8-byte boundary,
// because any call instructions that come after this will add another 8
// bytes and therefore align it to 16-bytes.
@@ -60,7 +60,7 @@
movq 8(%rsp), %r8
movq 0(%rsp), %r9
addq $192, %rsp
- CFI_DEF_CFA_OFFSET(8)
+ CFI_ADJUST_CFA_OFFSET(-192)
.endm
.macro ALIGNED_CALL_RAX
@@ -71,7 +71,9 @@
// pointer, we can always look -8 bytes from the current position to get
// either of the values we've stashed in the first place.
pushq %rsp
+ CFI_ADJUST_CFA_OFFSET(8)
pushq (%rsp)
+ CFI_ADJUST_CFA_OFFSET(8)
andq $-0x10, %rsp
callq *%rax
movq 8(%rsp), %rsp
@@ -100,7 +102,7 @@
testq %rax, %rax
je .Ltmp0
- // The patched function prolog puts its xray_instr_map index into %r10d.
+ // The patched function prologue puts its xray_instr_map index into %r10d.
movl %r10d, %edi
xor %esi,%esi
ALIGNED_CALL_RAX
@@ -122,7 +124,7 @@
// function is only jumped into, we only preserve the registers for
// returning.
subq $56, %rsp
- CFI_DEF_CFA_OFFSET(64)
+ CFI_ADJUST_CFA_OFFSET(56)
movq %rbp, 48(%rsp)
movupd %xmm0, 32(%rsp)
movupd %xmm1, 16(%rsp)
@@ -144,7 +146,7 @@
movq 8(%rsp), %rax
movq 0(%rsp), %rdx
addq $56, %rsp
- CFI_DEF_CFA_OFFSET(8)
+ CFI_ADJUST_CFA_OFFSET(-56)
retq
ASM_SIZE(__xray_FunctionExit)
CFI_ENDPROC
@@ -219,6 +221,14 @@
CFI_STARTPROC
SAVE_REGISTERS
+ // Because calls to __xray_CustomEvent can occur in the middle of a function
+ // which may already be using scratch registers, we preserve more information
+ // in this trampoline than when we are handling entry/exit events.
+ subq $16, %rsp
+ CFI_ADJUST_CFA_OFFSET(16)
+ movq %r10, 8(%rsp)
+ movq %r11, 0(%rsp)
+
// We take two arguments to this trampoline, which should be in rdi and rsi
// already. We also make sure that we stash %rax because we use that register
// to call the logging handler.
@@ -229,6 +239,11 @@
ALIGNED_CALL_RAX
.LcustomEventCleanup:
+
+ movq 8(%rsp), %r10
+ movq 0(%rsp), %r11
+ addq $16, %rsp
+ CFI_ADJUST_CFA_OFFSET(-16)
RESTORE_REGISTERS
retq
ASM_SIZE(__xray_CustomEvent)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40894.126305.patch
Type: text/x-patch
Size: 3190 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171211/00081971/attachment.bin>
More information about the llvm-commits
mailing list