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 @@ -100,7 +100,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 @@ -219,6 +219,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 +237,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) 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 ------===//