Re: [PATCH v9] pgo: add clang's Profile Guided Optimization infrastructure
From: Bill Wendling <morbo@google.com>
Date: 2021-06-13 18:08:42
Also in:
linux-kbuild, lkml
On Sat, Jun 12, 2021 at 3:47 PM Bill Wendling [off-list ref] wrote:
On Sat, Jun 12, 2021 at 1:56 PM Bill Wendling [off-list ref] wrote:quoted
On Sat, Jun 12, 2021 at 1:25 PM Peter Zijlstra [off-list ref] wrote:quoted
On Sat, Jun 12, 2021 at 12:10:03PM -0700, Bill Wendling wrote: Yes it is, but is that sufficient in this case? It very much isn't for KASAN, UBSAN, and a whole host of other instrumentation crud. They all needed their own 'bugger-off' attributes.Now, for the "nointr" issue. I'll see if we need an additional change for that.The GCOV implementation disables profiling in those directories where instrumentation would fail. We do the same. Both clang and gcc seem to treat the no_instrument_function attribute similarly.
An example:
$ cat n.c
int g(int);
int __attribute__((__no_instrument_function__))
__attribute__((no_instrument_function))
no_instr(int a) {
int sum = 0;
for (int i = 0; i < a; i++)
sum += g(i);
return sum;
}
int instr(int a) {
int sum = 0;
for (int i = 0; i < a; i++)
sum += g(i);
return sum;
}
$ gcc -S -o - n.c -fprofile-arcs -ftest-coverage -O2
.globl no_instr
.type no_instr, @function
no_instr:
.LFB0:
...
addq $1, __gcov0.no_instr(%rip)
pushq %rbp
...
.L3:
...
addq $1, 8+__gcov0.no_instr(%rip)
...
addq $1, 16+__gcov0.no_instr(%rip)
...
addq $1, 16+__gcov0.no_instr(%rip)
...
ret
.globl instr
.type instr, @function
instr:
.LFB1:
...
addq $1, __gcov0.instr(%rip)
...
addq $1, 8+__gcov0.instr(%rip)
...
addq $1, 16+__gcov0.instr(%rip)
...
addq $1, 16+__gcov0.instr(%rip)
...
ret
$ clang -S -o - n.c -fprofile-generate -O2
.globl no_instr # -- Begin function no_instr
.p2align 4, 0x90
.type no_instr,@function
no_instr: # @no_instr
...
addq $1, .L__profc_no_instr+8(%rip)
...
movq .L__profc_no_instr(%rip), %rax
...
movq %rax, .L__profc_no_instr(%rip)
...
retq
.globl instr # -- Begin function instr
.p2align 4, 0x90
.type instr,@function
instr: # @instr
...
addq $1, .L__profc_instr+8(%rip)
...
movq .L__profc_instr(%rip), %rax
...
movq %rax, .L__profc_instr(%rip)
...
retq
.Lfunc_end1: