rust/compiler/rustc_llvm/llvm-wrapper
Jubilee 6c2d4bf3f7
Rollup merge of #87918 - mikebenfield:pr-afdo, r=nikic
Enable AutoFDO.

This largely involves implementing the options debug-info-for-profiling
and profile-sample-use and forwarding them on to LLVM.

AutoFDO can be used on x86-64 Linux like this:
rustc -O -Clink-arg='Wl,--no-rosegment' -Cdebug-info-for-profiling main.rs -o main
perf record -b ./main
create_llvm_prof --binary=main --out=code.prof
rustc -O -Cprofile-sample-use=code.prof main.rs -o main2

Now `main2` will have feedback directed optimization applied to it.

The create_llvm_prof tool can be obtained from this github repository:
https://github.com/google/autofdo

The option -Clink-arg='Wl,--no-rosegment' is necessary to avoid lld
putting an extra RO segment before the executable code, which would make
the binary silently incompatible with create_llvm_prof.
2021-10-07 20:26:09 -07:00
..
.editorconfig Move rustllvm into rustc_llvm 2020-09-09 23:05:43 +03:00
ArchiveWrapper.cpp Update the minimum external LLVM to 10 2021-03-22 11:33:43 -07:00
CoverageMappingWrapper.cpp fix: I meant LLVM version 13, not 12 2021-03-19 16:46:40 -04:00
Linker.cpp Move rustllvm into rustc_llvm 2020-09-09 23:05:43 +03:00
LLVMWrapper.h LLVMWrapper: attractive nuisance macros 2021-03-24 14:39:13 -04:00
PassWrapper.cpp Enable AutoFDO. 2021-10-06 19:36:52 +00:00
README Move rustllvm into rustc_llvm 2020-09-09 23:05:43 +03:00
RustWrapper.cpp RustWrapper: adapt for LLVM API change of fatal_error_handler_t 2021-10-05 16:31:36 +02:00

This directory currently contains some LLVM support code. This will generally
be sent upstream to LLVM in time; for now it lives here.

NOTE: the LLVM C++ ABI is subject to between-version breakage and must *never*
be exposed to Rust. To allow for easy auditing of that, all Rust-exposed types
must be typedef-ed as "LLVMXyz", or "LLVMRustXyz" if they were defined here.

Functions that return a failure status and leave the error in
the LLVM last error should return an LLVMRustResult rather than an
int or anything to avoid confusion.

When translating enums, add a single `Other` variant as the first
one to allow for new variants to be added. It should abort when used
as an input.

All other types must not be typedef-ed as such.