2018-07-12 22:36:43 +08:00
|
|
|
; RUN: llc -verify-machineinstrs -filetype=asm -o - -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
|
|
|
|
; RUN: llc -verify-machineinstrs -filetype=asm -o - \
|
|
|
|
; RUN: -mtriple=x86_64-unknown-linux-gnu -relocation-model=pic < %s | FileCheck %s
|
|
|
|
; RUN: llc -verify-machineinstrs -filetype=asm -o - -mtriple=x86_64-darwin-unknown < %s | FileCheck %s
|
XRay: Add entry and exit sleds
Summary:
In this patch we implement the following parts of XRay:
- Supporting a function attribute named 'function-instrument' which currently only supports 'xray-always'. We should be able to use this attribute for other instrumentation approaches.
- Supporting a function attribute named 'xray-instruction-threshold' used to determine whether a function is instrumented with a minimum number of instructions (IR instruction counts).
- X86-specific nop sleds as described in the white paper.
- A machine function pass that adds the different instrumentation marker instructions at a very late stage.
- A way of identifying which return opcode is considered "normal" for each architecture.
There are some caveats here:
1) We don't handle PATCHABLE_RET in platforms other than x86_64 yet -- this means if IR used PATCHABLE_RET directly instead of a normal ret, instruction lowering for that platform might do the wrong thing. We think this should be handled at instruction selection time to by default be unpacked for platforms where XRay is not availble yet.
2) The generated section for X86 is different from what is described from the white paper for the sole reason that LLVM allows us to do this neatly. We're taking the opportunity to deviate from the white paper from this perspective to allow us to get richer information from the runtime library.
Reviewers: sanjoy, eugenis, kcc, pcc, echristo, rnk
Subscribers: niravd, majnemer, atrick, rnk, emaste, bmakam, mcrosier, mehdi_amini, llvm-commits
Differential Revision: http://reviews.llvm.org/D19904
llvm-svn: 275367
2016-07-14 12:06:33 +08:00
|
|
|
|
|
|
|
define i32 @foo() nounwind noinline uwtable "function-instrument"="xray-always" {
|
2016-08-04 15:37:28 +08:00
|
|
|
; CHECK: .p2align 1, 0x90
|
XRay: Add entry and exit sleds
Summary:
In this patch we implement the following parts of XRay:
- Supporting a function attribute named 'function-instrument' which currently only supports 'xray-always'. We should be able to use this attribute for other instrumentation approaches.
- Supporting a function attribute named 'xray-instruction-threshold' used to determine whether a function is instrumented with a minimum number of instructions (IR instruction counts).
- X86-specific nop sleds as described in the white paper.
- A machine function pass that adds the different instrumentation marker instructions at a very late stage.
- A way of identifying which return opcode is considered "normal" for each architecture.
There are some caveats here:
1) We don't handle PATCHABLE_RET in platforms other than x86_64 yet -- this means if IR used PATCHABLE_RET directly instead of a normal ret, instruction lowering for that platform might do the wrong thing. We think this should be handled at instruction selection time to by default be unpacked for platforms where XRay is not availble yet.
2) The generated section for X86 is different from what is described from the white paper for the sole reason that LLVM allows us to do this neatly. We're taking the opportunity to deviate from the white paper from this perspective to allow us to get richer information from the runtime library.
Reviewers: sanjoy, eugenis, kcc, pcc, echristo, rnk
Subscribers: niravd, majnemer, atrick, rnk, emaste, bmakam, mcrosier, mehdi_amini, llvm-commits
Differential Revision: http://reviews.llvm.org/D19904
llvm-svn: 275367
2016-07-14 12:06:33 +08:00
|
|
|
; CHECK-LABEL: Lxray_sled_0:
|
2017-09-04 13:34:58 +08:00
|
|
|
; CHECK: .ascii "\353\t"
|
XRay: Add entry and exit sleds
Summary:
In this patch we implement the following parts of XRay:
- Supporting a function attribute named 'function-instrument' which currently only supports 'xray-always'. We should be able to use this attribute for other instrumentation approaches.
- Supporting a function attribute named 'xray-instruction-threshold' used to determine whether a function is instrumented with a minimum number of instructions (IR instruction counts).
- X86-specific nop sleds as described in the white paper.
- A machine function pass that adds the different instrumentation marker instructions at a very late stage.
- A way of identifying which return opcode is considered "normal" for each architecture.
There are some caveats here:
1) We don't handle PATCHABLE_RET in platforms other than x86_64 yet -- this means if IR used PATCHABLE_RET directly instead of a normal ret, instruction lowering for that platform might do the wrong thing. We think this should be handled at instruction selection time to by default be unpacked for platforms where XRay is not availble yet.
2) The generated section for X86 is different from what is described from the white paper for the sole reason that LLVM allows us to do this neatly. We're taking the opportunity to deviate from the white paper from this perspective to allow us to get richer information from the runtime library.
Reviewers: sanjoy, eugenis, kcc, pcc, echristo, rnk
Subscribers: niravd, majnemer, atrick, rnk, emaste, bmakam, mcrosier, mehdi_amini, llvm-commits
Differential Revision: http://reviews.llvm.org/D19904
llvm-svn: 275367
2016-07-14 12:06:33 +08:00
|
|
|
; CHECK-NEXT: nopw 512(%rax,%rax)
|
|
|
|
ret i32 0
|
2016-08-04 15:37:28 +08:00
|
|
|
; CHECK: .p2align 1, 0x90
|
XRay: Add entry and exit sleds
Summary:
In this patch we implement the following parts of XRay:
- Supporting a function attribute named 'function-instrument' which currently only supports 'xray-always'. We should be able to use this attribute for other instrumentation approaches.
- Supporting a function attribute named 'xray-instruction-threshold' used to determine whether a function is instrumented with a minimum number of instructions (IR instruction counts).
- X86-specific nop sleds as described in the white paper.
- A machine function pass that adds the different instrumentation marker instructions at a very late stage.
- A way of identifying which return opcode is considered "normal" for each architecture.
There are some caveats here:
1) We don't handle PATCHABLE_RET in platforms other than x86_64 yet -- this means if IR used PATCHABLE_RET directly instead of a normal ret, instruction lowering for that platform might do the wrong thing. We think this should be handled at instruction selection time to by default be unpacked for platforms where XRay is not availble yet.
2) The generated section for X86 is different from what is described from the white paper for the sole reason that LLVM allows us to do this neatly. We're taking the opportunity to deviate from the white paper from this perspective to allow us to get richer information from the runtime library.
Reviewers: sanjoy, eugenis, kcc, pcc, echristo, rnk
Subscribers: niravd, majnemer, atrick, rnk, emaste, bmakam, mcrosier, mehdi_amini, llvm-commits
Differential Revision: http://reviews.llvm.org/D19904
llvm-svn: 275367
2016-07-14 12:06:33 +08:00
|
|
|
; CHECK-LABEL: Lxray_sled_1:
|
2017-09-04 13:34:58 +08:00
|
|
|
; CHECK: retq
|
XRay: Add entry and exit sleds
Summary:
In this patch we implement the following parts of XRay:
- Supporting a function attribute named 'function-instrument' which currently only supports 'xray-always'. We should be able to use this attribute for other instrumentation approaches.
- Supporting a function attribute named 'xray-instruction-threshold' used to determine whether a function is instrumented with a minimum number of instructions (IR instruction counts).
- X86-specific nop sleds as described in the white paper.
- A machine function pass that adds the different instrumentation marker instructions at a very late stage.
- A way of identifying which return opcode is considered "normal" for each architecture.
There are some caveats here:
1) We don't handle PATCHABLE_RET in platforms other than x86_64 yet -- this means if IR used PATCHABLE_RET directly instead of a normal ret, instruction lowering for that platform might do the wrong thing. We think this should be handled at instruction selection time to by default be unpacked for platforms where XRay is not availble yet.
2) The generated section for X86 is different from what is described from the white paper for the sole reason that LLVM allows us to do this neatly. We're taking the opportunity to deviate from the white paper from this perspective to allow us to get richer information from the runtime library.
Reviewers: sanjoy, eugenis, kcc, pcc, echristo, rnk
Subscribers: niravd, majnemer, atrick, rnk, emaste, bmakam, mcrosier, mehdi_amini, llvm-commits
Differential Revision: http://reviews.llvm.org/D19904
llvm-svn: 275367
2016-07-14 12:06:33 +08:00
|
|
|
; CHECK-NEXT: nopw %cs:512(%rax,%rax)
|
|
|
|
}
|
2017-09-04 13:34:58 +08:00
|
|
|
; CHECK-LABEL: xray_instr_map
|
2017-06-21 14:39:42 +08:00
|
|
|
; CHECK-LABEL: Lxray_sleds_start0:
|
2016-11-23 10:07:04 +08:00
|
|
|
; CHECK: .quad {{.*}}xray_sled_0
|
|
|
|
; CHECK: .quad {{.*}}xray_sled_1
|
2017-06-21 14:39:42 +08:00
|
|
|
; CHECK-LABEL: Lxray_sleds_end0:
|
2017-09-04 13:34:58 +08:00
|
|
|
; CHECK-LABEL: xray_fn_idx
|
2017-06-21 14:39:42 +08:00
|
|
|
; CHECK: .quad {{.*}}xray_sleds_start0
|
|
|
|
; CHECK-NEXT: .quad {{.*}}xray_sleds_end0
|
[XRay] Create an Index of sleds per function
Summary:
This change adds a new section to the xray-instrumented binary that
stores an index into ranges of the instrumentation map, where sleds
associated with the same function can be accessed as an array. At
runtime, we can get access to this index by function ID offset allowing
for selective patching and unpatching by function ID.
Each entry in this new section (xray_fn_idx) will include two pointers
indicating the start and one past the end of the sleds associated with
the same function. These entries will be 16 bytes long on x86 and
aarch64. On arm, we align to 16 bytes anyway so the runtime has to take
that into consideration.
__{start,stop}_xray_fn_idx will be the symbols that the runtime will
look for when we implement the selective patching/unpatching by function
id APIs. Because XRay synthesizes the function id's in a monotonically
increasing manner at runtime now, implementations (and users) can use
this table to look up the sleds associated with a specific function.
This is useful in implementations that want to do things like:
- Implement coverage mode for functions by patching everything
pre-main, then as functions are encountered, the installed handler
can unpatch the function that's been encountered after recording
that it's been called.
- Do "learning mode", so that the implementation can figure out some
statistical information about function calls by function id for a
time being, and then determine which functions are worth
uninstrumenting at runtime.
- Do "selective instrumentation" where an implementation can
specifically instrument only certain function id's at runtime
(either based on some external data, or through some other
heuristics) instead of patching all the instrumented functions at
runtime.
Reviewers: dblaikie, echristo, chandlerc, javed.absar
Subscribers: pelikan, aemerson, kpw, llvm-commits, rengolin
Differential Revision: https://reviews.llvm.org/D32693
llvm-svn: 302109
2017-05-04 11:37:57 +08:00
|
|
|
|
2016-08-31 13:20:08 +08:00
|
|
|
|
|
|
|
; We test multiple returns in a single function to make sure we're getting all
|
|
|
|
; of them with XRay instrumentation.
|
|
|
|
define i32 @bar(i32 %i) nounwind noinline uwtable "function-instrument"="xray-always" {
|
|
|
|
; CHECK: .p2align 1, 0x90
|
|
|
|
; CHECK-LABEL: Lxray_sled_2:
|
2017-09-04 13:34:58 +08:00
|
|
|
; CHECK: .ascii "\353\t"
|
2016-08-31 13:20:08 +08:00
|
|
|
; CHECK-NEXT: nopw 512(%rax,%rax)
|
|
|
|
Test:
|
|
|
|
%cond = icmp eq i32 %i, 0
|
|
|
|
br i1 %cond, label %IsEqual, label %NotEqual
|
|
|
|
IsEqual:
|
|
|
|
ret i32 0
|
|
|
|
; CHECK: .p2align 1, 0x90
|
|
|
|
; CHECK-LABEL: Lxray_sled_3:
|
2017-09-04 13:34:58 +08:00
|
|
|
; CHECK: retq
|
2016-08-31 13:20:08 +08:00
|
|
|
; CHECK-NEXT: nopw %cs:512(%rax,%rax)
|
|
|
|
NotEqual:
|
|
|
|
ret i32 1
|
|
|
|
; CHECK: .p2align 1, 0x90
|
|
|
|
; CHECK-LABEL: Lxray_sled_4:
|
2017-09-04 13:34:58 +08:00
|
|
|
; CHECK: retq
|
2016-08-31 13:20:08 +08:00
|
|
|
; CHECK-NEXT: nopw %cs:512(%rax,%rax)
|
|
|
|
}
|
2017-09-04 13:34:58 +08:00
|
|
|
; CHECK-LABEL: xray_instr_map
|
2017-06-21 14:39:42 +08:00
|
|
|
; CHECK-LABEL: Lxray_sleds_start1:
|
2016-11-23 10:07:04 +08:00
|
|
|
; CHECK: .quad {{.*}}xray_sled_2
|
|
|
|
; CHECK: .quad {{.*}}xray_sled_3
|
|
|
|
; CHECK: .quad {{.*}}xray_sled_4
|
2017-06-21 14:39:42 +08:00
|
|
|
; CHECK-LABEL: Lxray_sleds_end1:
|
2017-09-04 13:34:58 +08:00
|
|
|
; CHECK-LABEL: xray_fn_idx
|
2017-06-21 14:39:42 +08:00
|
|
|
; CHECK: .quad {{.*}}xray_sleds_start1
|
|
|
|
; CHECK-NEXT: .quad {{.*}}xray_sleds_end1
|