On Mon, Jan 11, 2021 at 12:12 PM Fangrui Song <maskray@xxxxxxxxxx> wrote: > > On 2021-01-11, 'Bill Wendling' via Clang Built Linux wrote: > >From: Sami Tolvanen <samitolvanen@xxxxxxxxxx> > > > >Enable the use of clang's Profile-Guided Optimization[1]. To generate a > >profile, the kernel is instrumented with PGO counters, a representative > >workload is run, and the raw profile data is collected from > >/sys/kernel/debug/pgo/profraw. > > > >The raw profile data must be processed by clang's "llvm-profdata" tool before > >it can be used during recompilation: > > > > $ cp /sys/kernel/debug/pgo/profraw vmlinux.profraw > > $ llvm-profdata merge --output=vmlinux.profdata vmlinux.profraw > > > >Multiple raw profiles may be merged during this step. > > > >The data can be used either by the compiler if LTO isn't enabled: > > > > ... -fprofile-use=vmlinux.profdata ... > > > >or by LLD if LTO is enabled: > > > > ... -lto-cs-profile-file=vmlinux.profdata ... > > This LLD option does not exist. > LLD does have some `--lto-*` options but the `-lto-*` form is not supported > (it clashes with -l) https://reviews.llvm.org/D79371 > That's strange. I've been using that option for years now. :-) Is this a recent change? > (There is an earlier -fprofile-instr-generate which does > instrumentation in Clang, but the option does not have broad usage. > It is used more for code coverage, not for optimization. > Noticeably, it does not even implement the Kirchhoff's current law > optimization) > Right. I've been told outside of this email that -fprofile-generate is the prefered flag to use. > -fprofile-use= is used by both regular PGO and context-sensitive PGO (CSPGO). > > clang -flto=thin -fprofile-use= passes -plugin-opt=cs-profile-path= to the linker. > For regular PGO, this option is effectively a no-op (confirmed with CSPGO main developer). > > So I think the "or by LLD if LTO is enabled:" part should be removed. But what if you specify the linking step explicitly? Linux doesn't call "clang" when linking, but "ld.lld". -bw