| From: Alice Ryhl <aliceryhl@google.com> |
| Subject: kcov: rust: add flags for KCOV with Rust |
| Date: Thu, 01 May 2025 12:16:16 +0000 |
| |
| Rust code is currently not instrumented properly when KCOV is enabled. |
| Thus, add the relevant flags to perform instrumentation correctly. This |
| is necessary for efficient fuzzing of Rust code. |
| |
| The sanitizer-coverage features of LLVM have existed for long enough |
| that they are available on any LLVM version supported by rustc, so we do |
| not need any Kconfig feature detection. The coverage level is set to 3, |
| as that is the level needed by trace-pc. |
| |
| We do not instrument `core` since when we fuzz the kernel, we are |
| looking for bugs in the kernel, not the Rust stdlib. |
| |
| Link: https://lkml.kernel.org/r/20250501-rust-kcov-v2-1-b71e83e9779f@google.com |
| Signed-off-by: Alice Ryhl <aliceryhl@google.com> |
| Co-developed-by: Matthew Maurer <mmaurer@google.com> |
| Signed-off-by: Matthew Maurer <mmaurer@google.com> |
| Reviewed-by: Alexander Potapenko <glider@google.com> |
| Tested-by: Aleksandr Nogikh <nogikh@google.com> |
| Acked-by: Miguel Ojeda <ojeda@kernel.org> |
| Cc: Andreas Hindborg <a.hindborg@kernel.org> |
| Cc: Andrey Konovalov <andreyknvl@gmail.com> |
| Cc: Benno Lossin <benno.lossin@proton.me> |
| Cc: Bill Wendling <morbo@google.com> |
| Cc: Bjรถrn Roy Baron <bjorn3_gh@protonmail.com> |
| Cc: Boqun Feng <boqun.feng@gmail.com> |
| Cc: Danilo Krummrich <dakr@kernel.org> |
| Cc: Dmitriy Vyukov <dvyukov@google.com> |
| Cc: Gary Guo <gary@garyguo.net> |
| Cc: Justin Stitt <justinstitt@google.com> |
| Cc: Masahiro Yamada <masahiroy@kernel.org> |
| Cc: Nathan Chancellor <nathan@kernel.org> |
| Cc: Trevor Gross <tmgross@umich.edu> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| rust/Makefile | 1 + |
| scripts/Makefile.kcov | 6 ++++++ |
| scripts/Makefile.lib | 3 +++ |
| 3 files changed, 10 insertions(+) |
| |
| --- a/rust/Makefile~kcov-rust-add-flags-for-kcov-with-rust |
| +++ a/rust/Makefile |
| @@ -492,6 +492,7 @@ $(obj)/core.o: $(RUST_LIB_SRC)/core/src/ |
| ifneq ($(or $(CONFIG_X86_64),$(CONFIG_X86_32)),) |
| $(obj)/core.o: scripts/target.json |
| endif |
| +KCOV_INSTRUMENT_core.o := n |
| |
| $(obj)/compiler_builtins.o: private skip_gendwarfksyms = 1 |
| $(obj)/compiler_builtins.o: private rustc_objcopy = -w -W '__*' |
| --- a/scripts/Makefile.kcov~kcov-rust-add-flags-for-kcov-with-rust |
| +++ a/scripts/Makefile.kcov |
| @@ -2,4 +2,10 @@ |
| kcov-flags-y += -fsanitize-coverage=trace-pc |
| kcov-flags-$(CONFIG_KCOV_ENABLE_COMPARISONS) += -fsanitize-coverage=trace-cmp |
| |
| +kcov-rflags-y += -Cpasses=sancov-module |
| +kcov-rflags-y += -Cllvm-args=-sanitizer-coverage-level=3 |
| +kcov-rflags-y += -Cllvm-args=-sanitizer-coverage-trace-pc |
| +kcov-rflags-$(CONFIG_KCOV_ENABLE_COMPARISONS) += -Cllvm-args=-sanitizer-coverage-trace-compares |
| + |
| export CFLAGS_KCOV := $(kcov-flags-y) |
| +export RUSTFLAGS_KCOV := $(kcov-rflags-y) |
| --- a/scripts/Makefile.lib~kcov-rust-add-flags-for-kcov-with-rust |
| +++ a/scripts/Makefile.lib |
| @@ -169,6 +169,9 @@ ifeq ($(CONFIG_KCOV),y) |
| _c_flags += $(if $(patsubst n%,, \ |
| $(KCOV_INSTRUMENT_$(target-stem).o)$(KCOV_INSTRUMENT)$(if $(is-kernel-object),$(CONFIG_KCOV_INSTRUMENT_ALL))), \ |
| $(CFLAGS_KCOV)) |
| +_rust_flags += $(if $(patsubst n%,, \ |
| + $(KCOV_INSTRUMENT_$(target-stem).o)$(KCOV_INSTRUMENT)$(if $(is-kernel-object),$(CONFIG_KCOV_INSTRUMENT_ALL))), \ |
| + $(RUSTFLAGS_KCOV)) |
| endif |
| |
| # |
| _ |