[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