Skip to content
This repository was archived by the owner on Nov 21, 2022. It is now read-only.

Commit e178a5b

Browse files
greghackmanntorvalds
authored andcommitted
gcov: clang support
LLVM uses profiling data that's deliberately similar to GCC, but has a very different way of exporting that data. LLVM calls llvm_gcov_init() once per module, and provides a couple of callbacks that we can use to ask for more data. We care about the "writeout" callback, which in turn calls back into compiler-rt/this module to dump all the gathered coverage data to disk: llvm_gcda_start_file() llvm_gcda_emit_function() llvm_gcda_emit_arcs() llvm_gcda_emit_function() llvm_gcda_emit_arcs() [... repeats for each function ...] llvm_gcda_summary_info() llvm_gcda_end_file() This design is much more stateless and unstructured than gcc's, and is intended to run at process exit. This forces us to keep some local state about which module we're dealing with at the moment. On the other hand, it also means we don't depend as much on how LLVM represents profiling data internally. See LLVM's lib/Transforms/Instrumentation/GCOVProfiling.cpp for more details on how this works, particularly GCOVProfiler::emitProfileArcs(), GCOVProfiler::insertCounterWriteout(), and GCOVProfiler::insertFlush(). [akpm@linux-foundation.org: coding-style fixes] Link: http://lkml.kernel.org/r/20190417225328.208129-1-trong@android.com Signed-off-by: Greg Hackmann <ghackmann@android.com> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Tri Vo <trong@android.com> Co-developed-by: Nick Desaulniers <ndesaulniers@google.com> Co-developed-by: Tri Vo <trong@android.com> Tested-by: Trilok Soni <tsoni@quicinc.com> Tested-by: Prasad Sodagudi <psodagud@quicinc.com> Tested-by: Tri Vo <trong@android.com> Tested-by: Daniel Mentz <danielmentz@google.com> Tested-by: Petri Gynther <pgynther@google.com> Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent aa069a2 commit e178a5b

File tree

7 files changed

+611
-2
lines changed

7 files changed

+611
-2
lines changed

kernel/gcov/Kconfig

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ config GCOV_PROFILE_ALL
5353
choice
5454
prompt "Specify GCOV format"
5555
depends on GCOV_KERNEL
56+
depends on CC_IS_GCC
5657
---help---
5758
The gcov format is usually determined by the GCC version, and the
5859
default is chosen according to your GCC version. However, there are
@@ -62,7 +63,7 @@ choice
6263

6364
config GCOV_FORMAT_3_4
6465
bool "GCC 3.4 format"
65-
depends on CC_IS_GCC && GCC_VERSION < 40700
66+
depends on GCC_VERSION < 40700
6667
---help---
6768
Select this option to use the format defined by GCC 3.4.
6869

kernel/gcov/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ ccflags-y := -DSRCTREE='"$(srctree)"' -DOBJTREE='"$(objtree)"'
44
obj-y := base.o fs.o
55
obj-$(CONFIG_GCOV_FORMAT_3_4) += gcc_base.o gcc_3_4.o
66
obj-$(CONFIG_GCOV_FORMAT_4_7) += gcc_base.o gcc_4_7.o
7+
obj-$(CONFIG_CC_IS_CLANG) += clang.o

kernel/gcov/base.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ static int gcov_module_notifier(struct notifier_block *nb, unsigned long event,
6464

6565
/* Remove entries located in module from linked list. */
6666
while ((info = gcov_info_next(info))) {
67-
if (within_module((unsigned long)info, mod)) {
67+
if (gcov_info_within_module(info, mod)) {
6868
gcov_info_unlink(prev, info);
6969
if (gcov_events_enabled)
7070
gcov_event(GCOV_REMOVE, info);

0 commit comments

Comments
 (0)