mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-24 13:33:37 +02:00
04bb923d73
Summary: When we're building with XRay instrumentation, we use a trick that preserves references from the function to a function sled index. This index table lives in a separate section, and without this trick the linker is free to garbage-collect this section and all the segments it refers to. Until we're able to tell the linkers to preserve these sections, we use this reference trick to keep around both the index and the entries in the instrumentation map. Before this change we emitted both a synthetic reference to the label in the instrumentation map, and to the entry in the function map index. This change removes the first synthetic reference and only emits one synthetic reference to the index -- the index entry has the references to the labels in the instrumentation map, so the linker will still preserve those if the function itself is preserved. This reduces the amount of synthetic references we emit from 16 bytes to just 8 bytes in x86_64, and similarly to other platforms. Reviewers: dblaikie Subscribers: javed.absar, kpw, pelikan, llvm-commits Differential Revision: https://reviews.llvm.org/D34340 llvm-svn: 305880
80 lines
2.2 KiB
LLVM
80 lines
2.2 KiB
LLVM
; RUN: llc -filetype=asm -o - -mtriple=aarch64-linux-gnu < %s | FileCheck %s
|
|
|
|
define i32 @callee() nounwind noinline uwtable "function-instrument"="xray-always" {
|
|
; CHECK: .p2align 2
|
|
; CHECK-LABEL: .Lxray_sled_0:
|
|
; CHECK-NEXT: b #32
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-LABEL: .Ltmp0:
|
|
ret i32 0
|
|
; CHECK-NEXT: mov w0, wzr
|
|
; CHECK-NEXT: .p2align 2
|
|
; CHECK-LABEL: .Lxray_sled_1:
|
|
; CHECK-NEXT: b #32
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-LABEL: .Ltmp1:
|
|
; CHECK-NEXT: ret
|
|
}
|
|
; CHECK: .p2align 4
|
|
; CHECK-NEXT: .xword .Lxray_fn_idx_synth_0
|
|
; CHECK-NEXT: .section xray_instr_map,{{.*}}
|
|
; CHECK-LABEL: Lxray_sleds_start0:
|
|
; CHECK: .xword .Lxray_sled_0
|
|
; CHECK: .xword .Lxray_sled_1
|
|
; CHECK-LABEL: Lxray_sleds_end0:
|
|
; CHECK: .section xray_fn_idx,{{.*}}
|
|
; CHECK-LABEL: Lxray_fn_idx_synth_0:
|
|
; CHECK: .xword .Lxray_sleds_start0
|
|
; CHECK-NEXT: .xword .Lxray_sleds_end0
|
|
|
|
define i32 @caller() nounwind noinline uwtable "function-instrument"="xray-always" {
|
|
; CHECK: .p2align 2
|
|
; CHECK-LABEL: Lxray_sled_2:
|
|
; CHECK-NEXT: b #32
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-LABEL: .Ltmp2:
|
|
; CHECK: .p2align 2
|
|
; CHECK-LABEL: Lxray_sled_3:
|
|
; CHECK-NEXT: b #32
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: nop
|
|
; CHECK-LABEL: .Ltmp3:
|
|
%retval = tail call i32 @callee()
|
|
; CHECK: b callee
|
|
ret i32 %retval
|
|
}
|
|
; CHECK: .p2align 4
|
|
; CHECK-NEXT: .xword .Lxray_fn_idx_synth_1
|
|
; CHECK-NEXT: .section xray_instr_map,{{.*}}
|
|
; CHECK-LABEL: Lxray_sleds_start1:
|
|
; CHECK: .xword .Lxray_sled_2
|
|
; CHECK: .xword .Lxray_sled_3
|
|
; CHECK-LABEL: Lxray_sleds_end1:
|
|
; CHECK: .section xray_fn_idx,{{.*}}
|
|
; CHECK-LABEL: Lxray_fn_idx_synth_1:
|
|
; CHECK: .xword .Lxray_sleds_start1
|
|
; CHECK-NEXT: .xword .Lxray_sleds_end1
|