forked from OSchip/llvm-project
[XRay] Align entry and return sleds to 2 byte boundaries
This should ensure that we can atomically write two bytes (on top of the retq and the one past it) and have those two bytes not straddle cache lines. We also move the label past the alignment instruction so that we can refer to the actual first instruction, as opposed to potential padding before the aligned instruction. Update the tests to allow us to reflect the new order of assembly. Reviewers: rSerge, echristo, majnemer Subscribers: llvm-commits, mehdi_amini Differential Revision: https://reviews.llvm.org/D23101 llvm-svn: 277701
This commit is contained in:
parent
b0e32f1ba1
commit
7e9abea2ae
|
@ -1038,8 +1038,8 @@ void X86AsmPrinter::LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI,
|
|||
X86MCInstLower &MCIL) {
|
||||
// We want to emit the following pattern:
|
||||
//
|
||||
// .p2align 1, ...
|
||||
// .Lxray_sled_N:
|
||||
// .palign 2, ...
|
||||
// jmp .tmpN
|
||||
// # 9 bytes worth of noops
|
||||
// .tmpN
|
||||
|
@ -1051,8 +1051,8 @@ void X86AsmPrinter::LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI,
|
|||
// call <relative offset, 32-bits> // 5 bytes
|
||||
//
|
||||
auto CurSled = OutContext.createTempSymbol("xray_sled_", true);
|
||||
OutStreamer->EmitCodeAlignment(2);
|
||||
OutStreamer->EmitLabel(CurSled);
|
||||
OutStreamer->EmitCodeAlignment(4);
|
||||
auto Target = OutContext.createTempSymbol();
|
||||
|
||||
// Use a two-byte `jmp`. This version of JMP takes an 8-bit relative offset as
|
||||
|
@ -1074,12 +1074,14 @@ void X86AsmPrinter::LowerPATCHABLE_RET(const MachineInstr &MI,
|
|||
//
|
||||
// We should emit the RET followed by sleds.
|
||||
//
|
||||
// .p2align 1, ...
|
||||
// .Lxray_sled_N:
|
||||
// ret # or equivalent instruction
|
||||
// # 10 bytes worth of noops
|
||||
//
|
||||
// This just makes sure that the alignment for the next instruction is 2.
|
||||
auto CurSled = OutContext.createTempSymbol("xray_sled_", true);
|
||||
OutStreamer->EmitCodeAlignment(2);
|
||||
OutStreamer->EmitLabel(CurSled);
|
||||
unsigned OpCode = MI.getOperand(0).getImm();
|
||||
MCInst Ret;
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
; RUN: llc -filetype=asm -o - -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
|
||||
|
||||
define i32 @foo() nounwind noinline uwtable "function-instrument"="xray-always" {
|
||||
; CHECK: .p2align 1, 0x90
|
||||
; CHECK-LABEL: Lxray_sled_0:
|
||||
; CHECK-NEXT: .p2align 2, 0x90
|
||||
; CHECK-NEXT: .ascii "\353\t"
|
||||
; CHECK-NEXT: nopw 512(%rax,%rax)
|
||||
; CHECK-LABEL: Ltmp0:
|
||||
ret i32 0
|
||||
; CHECK: .p2align 1, 0x90
|
||||
; CHECK-LABEL: Lxray_sled_1:
|
||||
; CHECK-NEXT: retq
|
||||
; CHECK-NEXT: nopw %cs:512(%rax,%rax)
|
||||
|
|
Loading…
Reference in New Issue