libports: add libgcov and gcov tool

Issue #3048
This commit is contained in:
Christian Prochaska 2018-11-15 18:04:53 +01:00 committed by Christian Helmuth
parent 18e855e4d5
commit e74771e047
25 changed files with 1154 additions and 0 deletions

View File

@ -0,0 +1,45 @@
GCOV_PORT_DIR := $(call select_from_ports,gcov)
GCOV_DIR := $(GCOV_PORT_DIR)/src/gcov
SRC_CC = diagnostic.cc \
diagnostic-color.cc \
diagnostic-show-locus.cc \
ggc-none.cc \
hash-table.cc \
input.cc \
intl.cc \
memory-block.cc \
pretty-print.cc \
vec.cc \
version.cc
CC_OPT += -DIN_GCC
CC_OPT_version += -DBASEVER="\"6.3.0\"" \
-DDATESTAMP="\"\"" \
-DREVISION="\"\"" \
-DDEVPHASE="\"\"" \
-DPKGVERSION="\"(GCC) \"" \
-DBUGURL="\"<http://gcc.gnu.org/bugs.html>\""
LIBS += libc gmp stdcxx
INC_DIR += $(GCOV_DIR)/include \
$(GCOV_DIR)/libcpp/include
ifeq ($(filter-out $(SPECS),arm),)
INC_DIR += $(GCOV_PORT_DIR)/include/arm/gcc
endif
ifeq ($(filter-out $(SPECS),x86_32),)
INC_DIR += $(GCOV_PORT_DIR)/include/x86_32/gcc
endif
ifeq ($(filter-out $(SPECS),x86_64),)
INC_DIR += $(GCOV_PORT_DIR)/include/x86_64/gcc
endif
vpath %.cc $(GCOV_DIR)/gcc
CC_CXX_WARN_STRICT =

View File

@ -0,0 +1,26 @@
GCOV_PORT_DIR := $(call select_from_ports,gcov)
GCOV_DIR := $(GCOV_PORT_DIR)/src/gcov
SRC_CC = line-map.cc
LIBS += libc
INC_DIR += $(GCOV_DIR)/include \
$(GCOV_DIR)/libcpp/include
ifeq ($(filter-out $(SPECS),arm),)
INC_DIR += $(GCOV_PORT_DIR)/include/arm/libcpp
endif
ifeq ($(filter-out $(SPECS),x86_32),)
INC_DIR += $(GCOV_PORT_DIR)/include/x86_32/libcpp
endif
ifeq ($(filter-out $(SPECS),x86_64),)
INC_DIR += $(GCOV_PORT_DIR)/include/x86_64/libcpp
endif
vpath %.cc $(GCOV_DIR)/libcpp
CC_CXX_WARN_STRICT =

View File

@ -0,0 +1,43 @@
GCOV_PORT_DIR := $(call select_from_ports,gcov)
GCOV_DIR := $(GCOV_PORT_DIR)/src/gcov
SRC_C = argv.c \
concat.c \
cp-demangle.c \
cplus-dem.c \
d-demangle.c \
filename_cmp.c \
fopen_unlocked.c \
hashtab.c \
lbasename.c \
obstack.c \
safe-ctype.c \
vprintf-support.c \
xexit.c \
xmalloc.c \
xstrdup.c \
xstrerror.c \
xvasprintf.c
CC_OPT += -DHAVE_CONFIG_H
LIBS += libc stdcxx
INC_DIR += $(GCOV_DIR)/include
ifeq ($(filter-out $(SPECS),arm),)
INC_DIR += $(GCOV_PORT_DIR)/include/arm/libiberty
endif
ifeq ($(filter-out $(SPECS),x86_32),)
INC_DIR += $(GCOV_PORT_DIR)/include/x86_32/libiberty
endif
ifeq ($(filter-out $(SPECS),x86_64),)
INC_DIR += $(GCOV_PORT_DIR)/include/x86_64/libiberty
endif
vpath %.c $(GCOV_DIR)/libiberty
CC_CXX_WARN_STRICT =

View File

@ -0,0 +1,66 @@
# this is a static library, because some symbols are marked as hidden
GCOV_PORT_DIR := $(call select_from_ports,gcov)
GCOV_DIR := $(GCOV_PORT_DIR)/src/gcov
SRC_C = libgcov-merge.c \
libgcov-profiler.c \
libgcov-interface.c \
libgcov-driver.c
SRC_CC = libc.cc
LIBGCOV_MERGE = _gcov_merge_add \
_gcov_merge_single \
_gcov_merge_delta \
_gcov_merge_ior \
_gcov_merge_time_profile \
_gcov_merge_icall_topn
LIBGCOV_PROFILER = _gcov_interval_profiler \
_gcov_pow2_profiler \
_gcov_one_value_profiler \
_gcov_indirect_call_profiler \
_gcov_average_profiler \
_gcov_ior_profiler \
_gcov_indirect_call_profiler_v2 \
_gcov_time_profiler \
_gcov_indirect_call_topn_profiler
LIBGCOV_INTERFACE = _gcov_dump \
_gcov_flush \
_gcov_reset
LIBGCOV_DRIVER = _gcov
CC_OPT += -fbuilding-libgcc -DIN_GCC -DIN_LIBGCC2
CC_OPT += $(addprefix -DL,$(LIBGCOV_MERGE))
CC_OPT += $(addprefix -DL,$(LIBGCOV_PROFILER))
CC_OPT += $(addprefix -DL,$(LIBGCOV_INTERFACE))
CC_OPT += $(addprefix -DL,$(LIBGCOV_DRIVER))
INC_DIR += $(GCOV_DIR)/include \
$(GCOV_DIR)/gcc \
$(REP_DIR)/src/lib/gcov/libc
ifeq ($(filter-out $(SPECS),arm),)
INC_DIR += $(GCOV_PORT_DIR)/include/arm/gcc \
$(GCOV_PORT_DIR)/include/arm/libgcc
endif
ifeq ($(filter-out $(SPECS),x86_32),)
INC_DIR += $(GCOV_PORT_DIR)/include/x86_32/gcc \
$(GCOV_PORT_DIR)/include/x86_32/libgcc
endif
ifeq ($(filter-out $(SPECS),x86_64),)
INC_DIR += $(GCOV_PORT_DIR)/include/x86_64/gcc \
$(GCOV_PORT_DIR)/include/x86_64/libgcc
endif
vpath %.c $(GCOV_DIR)/libgcc
vpath libc.cc $(REP_DIR)/src/lib/gcov/libc
CC_CXX_WARN_STRICT =

View File

@ -0,0 +1 @@
270978954f87ac494b04c2cc1c15c23102f07406

View File

@ -0,0 +1,151 @@
LICENSE := GPLv2
VERSION := 6.3.0
DOWNLOADS := gcov.archive generated.git
URL(gcov) := ftp://ftp.fu-berlin.de/gnu/gcc/gcc-$(VERSION)/gcc-$(VERSION).tar.bz2
SHA(gcov) := f06ae7f3f790fbf0f018f6d40e844451e6bc3b7bc96e128e63b09825c1f8b29f
DIR(gcov) := src/gcov
SIG(gcov) := ${URL(gcov)}
KEY(gcov) := GNU
URL(generated) := https://github.com/cproc/genode-generated.git
REV(generated) := c0b4333a7df8de45036506b9542b57349796775d
DIR(generated) := include
TAR_OPT(gcov) := gcc-$(VERSION)/gcc/coretypes.h \
gcc-$(VERSION)/gcc/defaults.h \
gcc-$(VERSION)/gcc/diagnostic.c \
gcc-$(VERSION)/gcc/diagnostic-color.c \
gcc-$(VERSION)/gcc/diagnostic-color.h \
gcc-$(VERSION)/gcc/diagnostic-core.h \
gcc-$(VERSION)/gcc/diagnostic.def \
gcc-$(VERSION)/gcc/diagnostic.h \
gcc-$(VERSION)/gcc/diagnostic-show-locus.c \
gcc-$(VERSION)/gcc/double-int.h \
gcc-$(VERSION)/gcc/fixed-value.h \
gcc-$(VERSION)/gcc/flag-types.h \
gcc-$(VERSION)/gcc/gcov.c \
gcc-$(VERSION)/gcc/gcov-counter.def \
gcc-$(VERSION)/gcc/gcov-io.c \
gcc-$(VERSION)/gcc/gcov-io.h \
gcc-$(VERSION)/gcc/ggc.h \
gcc-$(VERSION)/gcc/ggc-none.c \
gcc-$(VERSION)/gcc/hash-map.h \
gcc-$(VERSION)/gcc/hash-map-traits.h \
gcc-$(VERSION)/gcc/hash-set.h \
gcc-$(VERSION)/gcc/hash-table.c \
gcc-$(VERSION)/gcc/hash-table.h \
gcc-$(VERSION)/gcc/hash-traits.h \
gcc-$(VERSION)/gcc/hwint.h \
gcc-$(VERSION)/gcc/inchash.h \
gcc-$(VERSION)/gcc/input.c \
gcc-$(VERSION)/gcc/input.h \
gcc-$(VERSION)/gcc/intl.c \
gcc-$(VERSION)/gcc/intl.h \
gcc-$(VERSION)/gcc/is-a.h \
gcc-$(VERSION)/gcc/machmode.h \
gcc-$(VERSION)/gcc/memory-block.cc \
gcc-$(VERSION)/gcc/memory-block.h \
gcc-$(VERSION)/gcc/mem-stats.h \
gcc-$(VERSION)/gcc/mem-stats-traits.h \
gcc-$(VERSION)/gcc/mode-classes.def \
gcc-$(VERSION)/gcc/pretty-print.c \
gcc-$(VERSION)/gcc/pretty-print.h \
gcc-$(VERSION)/gcc/real.h \
gcc-$(VERSION)/gcc/signop.h \
gcc-$(VERSION)/gcc/statistics.h \
gcc-$(VERSION)/gcc/system.h \
gcc-$(VERSION)/gcc/tsystem.h \
gcc-$(VERSION)/gcc/vec.c \
gcc-$(VERSION)/gcc/vec.h \
gcc-$(VERSION)/gcc/version.c \
gcc-$(VERSION)/gcc/version.h \
gcc-$(VERSION)/gcc/wide-int.h \
gcc-$(VERSION)/gcc/wide-int-print.h \
gcc-$(VERSION)/gcc/config/dbxelf.h \
gcc-$(VERSION)/gcc/config/elfos.h \
gcc-$(VERSION)/gcc/config/initfini-array.h \
gcc-$(VERSION)/gcc/config/newlib-stdint.h \
gcc-$(VERSION)/gcc/config/vxworks-dummy.h \
gcc-$(VERSION)/gcc/config/arm/aout.h \
gcc-$(VERSION)/gcc/config/arm/arm-cores.def \
gcc-$(VERSION)/gcc/config/arm/arm.h \
gcc-$(VERSION)/gcc/config/arm/arm-opts.h \
gcc-$(VERSION)/gcc/config/arm/bpabi.h \
gcc-$(VERSION)/gcc/config/arm/elf.h \
gcc-$(VERSION)/gcc/config/arm/unknown-elf.h \
gcc-$(VERSION)/gcc/config/i386/att.h \
gcc-$(VERSION)/gcc/config/i386/biarch64.h \
gcc-$(VERSION)/gcc/config/i386/i386elf.h \
gcc-$(VERSION)/gcc/config/i386/i386.h \
gcc-$(VERSION)/gcc/config/i386/i386-opts.h \
gcc-$(VERSION)/gcc/config/i386/stringop.def \
gcc-$(VERSION)/gcc/config/i386/unix.h \
gcc-$(VERSION)/gcc/config/i386/x86-64.h \
gcc-$(VERSION)/gcc/config/i386/x86-tune.def \
gcc-$(VERSION)/include/ansidecl.h \
gcc-$(VERSION)/include/demangle.h \
gcc-$(VERSION)/include/environ.h \
gcc-$(VERSION)/include/filenames.h \
gcc-$(VERSION)/include/hashtab.h \
gcc-$(VERSION)/include/libiberty.h \
gcc-$(VERSION)/include/obstack.h \
gcc-$(VERSION)/include/safe-ctype.h \
gcc-$(VERSION)/libcpp/internal.h \
gcc-$(VERSION)/libcpp/line-map.c \
gcc-$(VERSION)/libcpp/system.h \
gcc-$(VERSION)/libcpp/include/cpp-id-data.h \
gcc-$(VERSION)/libcpp/include/cpplib.h \
gcc-$(VERSION)/libcpp/include/line-map.h \
gcc-$(VERSION)/libcpp/include/symtab.h \
gcc-$(VERSION)/libgcc/gthr.h \
gcc-$(VERSION)/libgcc/libgcov-driver.c \
gcc-$(VERSION)/libgcc/libgcov-driver-system.c \
gcc-$(VERSION)/libgcc/libgcov.h \
gcc-$(VERSION)/libgcc/libgcov-interface.c \
gcc-$(VERSION)/libgcc/libgcov-merge.c \
gcc-$(VERSION)/libgcc/libgcov-profiler.c \
gcc-$(VERSION)/libiberty/argv.c \
gcc-$(VERSION)/libiberty/concat.c \
gcc-$(VERSION)/libiberty/cp-demangle.c \
gcc-$(VERSION)/libiberty/cp-demangle.h \
gcc-$(VERSION)/libiberty/cplus-dem.c \
gcc-$(VERSION)/libiberty/d-demangle.c \
gcc-$(VERSION)/libiberty/filename_cmp.c \
gcc-$(VERSION)/libiberty/fopen_unlocked.c \
gcc-$(VERSION)/libiberty/hashtab.c \
gcc-$(VERSION)/libiberty/lbasename.c \
gcc-$(VERSION)/libiberty/obstack.c \
gcc-$(VERSION)/libiberty/safe-ctype.c \
gcc-$(VERSION)/libiberty/vprintf-support.c \
gcc-$(VERSION)/libiberty/vprintf-support.h \
gcc-$(VERSION)/libiberty/xexit.c \
gcc-$(VERSION)/libiberty/xmalloc.c \
gcc-$(VERSION)/libiberty/xstrdup.c \
gcc-$(VERSION)/libiberty/xstrerror.c \
gcc-$(VERSION)/libiberty/xvasprintf.c \
gcc-$(VERSION)/COPYING \
--strip-components=1
PATCHES := src/app/gcov/patches/*.patch \
src/lib/gcov/patches/*.patch
PATCH_OPT := -p1 -d src/gcov
default: symlinks
#
# These .c files need to be compiled with g++
#
symlinks: $(DOWNLOADS)
$(VERBOSE)ln -s diagnostic-color.c ${DIR(gcov)}/gcc/diagnostic-color.cc
$(VERBOSE)ln -s diagnostic-show-locus.c ${DIR(gcov)}/gcc/diagnostic-show-locus.cc
$(VERBOSE)ln -s diagnostic.c ${DIR(gcov)}/gcc/diagnostic.cc
$(VERBOSE)ln -s gcov.c ${DIR(gcov)}/gcc/gcov.cc
$(VERBOSE)ln -s ggc-none.c ${DIR(gcov)}/gcc/ggc-none.cc
$(VERBOSE)ln -s hash-table.c ${DIR(gcov)}/gcc/hash-table.cc
$(VERBOSE)ln -s input.c ${DIR(gcov)}/gcc/input.cc
$(VERBOSE)ln -s intl.c ${DIR(gcov)}/gcc/intl.cc
$(VERBOSE)ln -s pretty-print.c ${DIR(gcov)}/gcc/pretty-print.cc
$(VERBOSE)ln -s vec.c ${DIR(gcov)}/gcc/vec.cc
$(VERBOSE)ln -s version.c ${DIR(gcov)}/gcc/version.cc
$(VERBOSE)ln -s line-map.c ${DIR(gcov)}/libcpp/line-map.cc

View File

@ -0,0 +1,28 @@
content: include \
lib/mk/libgcov.mk \
src/gcov \
src/lib/gcov \
LICENSE
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/gcov)
include:
mkdir $@
cp -r $(PORT_DIR)/include/* $@/
cp -r $(GENODE_DIR)/repos/os/include/file_system $@/
lib/mk/libgcov.mk:
$(mirror_from_rep_dir)
src/gcov:
mkdir -p $@
cp -r $(PORT_DIR)/src/gcov/include $@/
cp -r $(PORT_DIR)/src/gcov/gcc $@/
cp -r $(PORT_DIR)/src/gcov/libgcc $@/
src/lib/gcov:
$(mirror_from_rep_dir)
echo "LIBS = libgcov" > $@/target.mk
LICENSE:
cp $(PORT_DIR)/src/gcov/COPYING $@

View File

@ -0,0 +1 @@
2018-11-16-b 8a444f55abb26a8ae6c9d7af681db7a4ae58d12a

View File

@ -0,0 +1 @@
gcov runtime for tests executed by 'depot_autopilot.run'

View File

@ -0,0 +1,7 @@
_/src/init
_/src/gcov
_/src/gmp
_/src/libc
_/src/posix
_/src/stdcxx
_/src/vfs

View File

@ -0,0 +1 @@
2018-11-16-h d56715c26c3266e1dede99f928683339956e6d2d

View File

@ -0,0 +1,49 @@
<runtime ram="16M" caps="1000" binary="init">
<events>
<timeout meaning="failed" sec="300" />
<log meaning="succeeded">
[init] child "gcov" exited with exit value 0
</log>
</events>
<content>
<rom label="gcov"/>
<rom label="gmp.lib.so"/>
<rom label="ld.lib.so"/>
<rom label="libc.lib.so"/>
<rom label="libm.lib.so"/>
<rom label="posix.lib.so"/>
<rom label="stdcxx.lib.so"/>
<rom label="vfs.lib.so"/>
</content>
<config>
<parent-provides>
<service name="LOG"/>
<service name="PD"/>
<service name="CPU"/>
<service name="ROM"/>
<service name="File_system"/>
</parent-provides>
<default-route>
<any-service> <parent/> </any-service>
</default-route>
<default caps="150"/>
<start name="gcov">
<resource name="RAM" quantum="10M"/>
<config>
<arg value="gcov"/>
<arg value="--genode-autopilot"/>
<arg value="--function-summaries"/>
<arg value="--demangled-names"/>
<vfs>
<dir name="dev"> <log/> </dir>
<fs label="depot"/>
<fs label="gcov_data"/>
</vfs>
<libc stdout="/dev/log" stderr="/dev/log"/>
</config>
</start>
</config>
</runtime>

View File

@ -0,0 +1,29 @@
content: include \
lib/mk/gcov-libcommon.mk \
lib/mk/gcov-libcpp.mk \
lib/mk/gcov-libiberty.mk \
src/gcov \
src/app/gcov \
LICENSE
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/gcov)
include:
mkdir $@
cp -r $(PORT_DIR)/include/* $@/
lib/mk/%.mk:
$(mirror_from_rep_dir)
src/lib/%:
$(mirror_from_rep_dir)
src/gcov:
mkdir -p $(dir $@)
cp -r $(PORT_DIR)/src/gcov $@
src/app/gcov:
$(mirror_from_rep_dir)
LICENSE:
cp $(PORT_DIR)/src/gcov/COPYING $@

View File

@ -0,0 +1 @@
2018-11-16-e 2a86e572acc3c547aeb8c249832a40c2642b05a9

View File

@ -0,0 +1,5 @@
base
gmp
libc
posix
stdcxx

View File

@ -0,0 +1,75 @@
backtrace.patch
From: Christian Prochaska <christian.prochaska@genode-labs.com>
---
gcc/diagnostic-show-locus.c | 2 ++
gcc/diagnostic.c | 11 ++++++++---
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/gcc/diagnostic-show-locus.c b/gcc/diagnostic-show-locus.c
index bf95666..b68b700 100644
--- a/gcc/diagnostic-show-locus.c
+++ b/gcc/diagnostic-show-locus.c
@@ -24,7 +24,9 @@ along with GCC; see the file COPYING3. If not see
#include "version.h"
#include "demangle.h"
#include "intl.h"
+#if 0
#include "backtrace.h"
+#endif
#include "diagnostic.h"
#include "diagnostic-color.h"
diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c
index 8106172..85d5eb0 100644
--- a/gcc/diagnostic.c
+++ b/gcc/diagnostic.c
@@ -28,7 +28,9 @@ along with GCC; see the file COPYING3. If not see
#include "version.h"
#include "demangle.h"
#include "intl.h"
+#if 0
#include "backtrace.h"
+#endif
#include "diagnostic.h"
#include "diagnostic-color.h"
@@ -345,7 +347,7 @@ static const char * const bt_stop[] =
};
/* A callback function passed to the backtrace_full function. */
-
+#if 0
static int
bt_callback (void *data, uintptr_t pc, const char *filename, int lineno,
const char *function)
@@ -425,7 +427,7 @@ bt_err_callback (void *data ATTRIBUTE_UNUSED, const char *msg, int errnum)
fprintf (stderr, "%s%s%s\n", msg, errnum == 0 ? "" : ": ",
errnum == 0 ? "" : xstrerror (errnum));
}
-
+#endif
/* Take any action which is expected to happen after the diagnostic
is written out. This function does not always return. */
void
@@ -467,14 +469,17 @@ diagnostic_action_after_output (diagnostic_context *context,
case DK_ICE:
case DK_ICE_NOBT:
{
+#if 0
struct backtrace_state *state = NULL;
if (diag_kind == DK_ICE)
state = backtrace_create_state (NULL, 0, bt_err_callback, NULL);
+#endif
int count = 0;
+#if 0
if (state != NULL)
backtrace_full (state, 2, bt_callback, bt_err_callback,
(void *) &count);
-
+#endif
if (context->abort_on_error)
real_abort ();

View File

@ -0,0 +1,189 @@
gcov.patch
From: Christian Prochaska <christian.prochaska@genode-labs.com>
---
gcc/gcov.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 84 insertions(+), 5 deletions(-)
diff --git a/gcc/gcov.c b/gcc/gcov.c
index 50061c7..eead285 100644
--- a/gcc/gcov.c
+++ b/gcc/gcov.c
@@ -41,10 +41,13 @@ along with Gcov; see the file COPYING3. If not see
#include <getopt.h>
+#include <dirent.h>
+
#define IN_GCOV 1
#include "gcov-io.h"
#include "gcov-io.c"
+
/* The gcno file is generated by -ftest-coverage option. The gcda file is
generated by a program compiled with -fprofile-arcs. Their formats
are documented in gcov-io.h. */
@@ -350,6 +353,16 @@ static int flag_all_blocks = 0;
static int flag_function_summary = 0;
+/*
+ * Genode autopilot mode
+ *
+ * - scans for gcov data files
+ * - strips the Genode depot path from source paths
+ * - writes results to stdout
+ */
+
+static int flag_genode_autopilot = 0;
+
/* Object directory file prefix. This is the directory/file where the
graph and data files are looked for, if nonzero. */
@@ -407,6 +420,43 @@ static void release_structures (void);
static void release_function (function_t *);
extern int main (int, char **);
+void process_files(const char *dir_path)
+{
+ char new_path[strlen(dir_path) + sizeof('/') + NAME_MAX];
+
+ DIR *dir = opendir(dir_path);
+
+ if (!dir)
+ return;
+
+ struct dirent *dirent;
+
+ while((dirent = readdir(dir)) != NULL) {
+
+ snprintf(new_path, sizeof(new_path), "%s/%s", dir_path, dirent->d_name);
+
+ struct stat stat_buf;
+
+ if (stat(new_path, &stat_buf) != 0)
+ continue;
+
+ if (S_ISDIR(stat_buf.st_mode)) {
+ process_files(new_path);
+ continue;
+ }
+
+ if (!S_ISREG(stat_buf.st_mode))
+ continue;
+
+ if (!strstr(dirent->d_name, ".gcda"))
+ continue;
+
+ process_file(new_path);
+ }
+
+ closedir(dir);
+}
+
int
main (int argc, char **argv)
{
@@ -437,7 +487,7 @@ main (int argc, char **argv)
sources = XNEWVEC (source_t, a_sources);
argno = process_args (argc, argv);
- if (optind == argc)
+ if ((optind == argc) && !flag_genode_autopilot)
print_usage (true);
if (argc - argno > 1)
@@ -445,6 +495,15 @@ main (int argc, char **argv)
first_arg = argno;
+ if (flag_genode_autopilot) {
+
+ /* search .gcda files and process each one */
+ process_files("/");
+
+ /* finish processing arguments */
+ argno = argc;
+ }
+
for (; argno != argc; argno++)
{
if (flag_display_progress)
@@ -488,7 +547,8 @@ print_usage (int error_p)
fnotice (file, " -r, --relative-only Only show data for relative sources\n");
fnotice (file, " -s, --source-prefix DIR Source prefix to elide\n");
fnotice (file, " -u, --unconditional-branches Show unconditional branch counts too\n");
- fnotice (file, " -v, --version Print version number, then exit\n");
+ fnotice (file, " -v, --version Print version number, then exit\n\n");
+ fnotice (file, " -g, --genode-autopilot Genode autopilot mode\n");
fnotice (file, "\nFor bug reporting instructions, please see:\n%s.\n",
bug_report_url);
exit (status);
@@ -528,6 +588,7 @@ static const struct option options[] =
{ "source-prefix", required_argument, NULL, 's' },
{ "unconditional-branches", no_argument, NULL, 'u' },
{ "display-progress", no_argument, NULL, 'd' },
+ { "genode-autopilot", no_argument, NULL, 'g' },
{ 0, 0, 0, 0 }
};
@@ -538,7 +599,7 @@ process_args (int argc, char **argv)
{
int opt;
- while ((opt = getopt_long (argc, argv, "abcdfhilmno:s:pruv", options, NULL)) !=
+ while ((opt = getopt_long (argc, argv, "abcdfghilmno:s:pruv", options, NULL)) !=
-1)
{
switch (opt)
@@ -555,6 +616,9 @@ process_args (int argc, char **argv)
case 'f':
flag_function_summary = 1;
break;
+ case 'g':
+ flag_genode_autopilot = 1;
+ break;
case 'h':
print_usage (false);
/* print_usage will exit. */
@@ -788,14 +852,17 @@ output_gcov_file (const char *file_name, source_t *src)
if (src->coverage.lines)
{
- FILE *gcov_file = fopen (gcov_file_name, "w");
+ FILE *gcov_file = flag_genode_autopilot ?
+ stdout :
+ fopen (gcov_file_name, "w");
if (gcov_file)
{
fnotice (stdout, "Creating '%s'\n", gcov_file_name);
output_lines (gcov_file, src);
if (ferror (gcov_file))
fnotice (stderr, "Error writing output file '%s'\n", gcov_file_name);
- fclose (gcov_file);
+ if (!flag_genode_autopilot)
+ fclose (gcov_file);
}
else
fnotice (stderr, "Could not open output file '%s'\n", gcov_file_name);
@@ -1114,6 +1181,18 @@ find_source (const char *file_name)
#endif
&& IS_DIR_SEPARATOR (src->coverage.name[source_length]))
src->coverage.name += source_length + 1;
+
+ if (flag_genode_autopilot) {
+
+ /* strip path of the Genode depot */
+
+ char *depot_relative_path = strstr(src->name, "/depot/");
+ if (depot_relative_path) {
+ src->name = depot_relative_path + strlen("/depot");
+ src->coverage.name = src->name;
+ }
+ }
+
if (!stat (src->name, &status))
src->file_time = status.st_mtime;
}

View File

@ -0,0 +1,31 @@
TARGET = gcov
GCOV_PORT_DIR := $(call select_from_ports,gcov)
GCOV_DIR := $(GCOV_PORT_DIR)/src/gcov
SRC_CC = gcov.cc
CC_OPT_gcov = -DIN_GCC -DHAVE_CONFIG_H
INC_DIR += $(GCOV_DIR)/gcc
INC_DIR += $(GCOV_DIR)/include
INC_DIR += $(GCOV_DIR)/libcpp/include
ifeq ($(filter-out $(SPECS),arm),)
INC_DIR += $(GCOV_PORT_DIR)/include/arm/gcc
endif
ifeq ($(filter-out $(SPECS),x86_32),)
INC_DIR += $(GCOV_PORT_DIR)/include/x86_32/gcc
endif
ifeq ($(filter-out $(SPECS),x86_64),)
INC_DIR += $(GCOV_PORT_DIR)/include/x86_64/gcc
endif
LIBS += base libc posix gmp stdcxx gcov-libcommon gcov-libcpp gcov-libiberty
vpath %.cc $(GCOV_DIR)/gcc
CC_CXX_WARN_STRICT =

View File

@ -0,0 +1,241 @@
/*
* \brief Minimal C library for libgcov
* \author Christian Prochaska
* \date 2018-11-16
*
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#include <base/env.h>
#include <base/heap.h>
#include <base/log.h>
#include <base/printf.h>
#include <base/sleep.h>
#include <file_system_session/connection.h>
#include <file_system/util.h>
#include <util/string.h>
extern "C" {
#include "stdio.h"
}
typedef Genode::Path<File_system::MAX_PATH_LEN> Absolute_path;
struct FILE { };
static FILE stderr_file;
FILE *stderr = &stderr_file;
struct Gcov_env
{
Genode::Env &env;
Genode::Heap heap { env.ram(), env.rm() };
Genode::Allocator_avl fs_alloc { &heap };
File_system::Connection fs { env, fs_alloc, "gcov_data" };
unsigned long seek_offset { 0 };
/* only one file is open at a time */
Genode::Constructible<File_system::File_handle> file_handle;
FILE file;
Gcov_env(Genode::Env &env) : env(env) { }
};
static Genode::Constructible<Gcov_env> gcov_env;
void gcov_init(Genode::Env &env)
{
gcov_env.construct(env);
}
extern "C" void abort()
{
Genode::error("abort() called: not implemented");
Genode::sleep_forever();
}
extern void genode_atexit(void (*func)(void));
extern "C" void atexit(void (*func)(void))
{
genode_atexit(func);
}
extern "C" int atoi(const char *nptr)
{
Genode::error("atoi() called: not implemented");
return 0;
}
extern "C" int fclose(FILE *stream)
{
gcov_env->fs.close(*(gcov_env->file_handle));
gcov_env->file_handle.destruct();
return 0;
}
extern "C" FILE *fopen(const char *path, const char *mode)
{
Absolute_path dir_path(path);
dir_path.strip_last_element();
Absolute_path file_name(path);
file_name.keep_only_last_element();
File_system::Dir_handle dir = File_system::ensure_dir(gcov_env->fs, dir_path.base());
try {
gcov_env->file_handle.construct(gcov_env->fs.file(dir,
file_name.base() + 1,
File_system::READ_WRITE,
false));
if (Genode::strcmp(mode, "w+b", 3) == 0)
gcov_env->fs.truncate(*(gcov_env->file_handle), 0);
} catch (File_system::Lookup_failed) {
if (Genode::strcmp(mode, "w+b", 3) == 0)
gcov_env->file_handle.construct(gcov_env->fs.file(dir,
file_name.base() + 1,
File_system::READ_WRITE,
true));
else
return nullptr;
}
gcov_env->seek_offset = 0;
return &gcov_env->file;
}
extern "C" int fprintf(FILE *stream, const char *format, ...)
{
if (stream != stderr) {
Genode::error("fprintf() called: not implemented");
return 0;
}
va_list list;
va_start(list, format);
Genode::vprintf(format, list);
va_end(list);
return 0;
}
extern "C" size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
size_t bytes_read = File_system::read(gcov_env->fs, *(gcov_env->file_handle),
ptr, size * nmemb,
gcov_env->seek_offset);
gcov_env->seek_offset += bytes_read;
if (bytes_read == (size * nmemb))
return nmemb;
return 0;
}
extern "C" void free(void *ptr)
{
gcov_env->heap.free(ptr, 0);
}
extern "C" int fseek(FILE *stream, long offset, int whence)
{
if (whence != 0)
Genode::error("fseek(): unsupported 'whence'");
gcov_env->seek_offset = offset;
return 0;
}
extern "C" long ftell(FILE *stream)
{
return gcov_env->seek_offset;
}
extern "C" size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
{
if (stream == stderr) {
Genode::printf((const char*)ptr);
return 0;
}
size_t bytes_written = File_system::write(gcov_env->fs,
*(gcov_env->file_handle),
ptr, size * nmemb,
gcov_env->seek_offset);
gcov_env->seek_offset += bytes_written;
if (bytes_written == (size * nmemb))
return nmemb;
return 0;
}
extern "C" char *getenv(const char *name)
{
return nullptr;
}
extern "C" void *malloc(size_t size)
{
void *res = nullptr;
gcov_env->heap.alloc(size, &res);
return res;
}
extern "C" void setbuf(FILE *stream, char *buf)
{
if (buf)
Genode::error("setbuf(", (void*)buf, "): not implemented");
}
extern "C" char *strcpy(char *dest, const char *src)
{
return Genode::strncpy(dest, src, Genode::strlen(src) + 1);
}
extern "C" size_t strlen(const char *s)
{
return Genode::strlen(s);
}
extern "C" int vfprintf(FILE *stream, const char *format, va_list ap)
{
if (stream != stderr)
return 0;
Genode::vprintf(format, ap);
return 0;
}

View File

@ -0,0 +1,37 @@
/*
* \brief Minimal C library for libgcov
* \author Christian Prochaska
* \date 2018-11-16
*
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef STDIO_H
#define STDIO_H
#include <sys/types.h>
#define SEEK_SET 0
struct FILE;
typedef struct FILE FILE;
extern FILE *stderr;
int fclose(FILE *stream);
FILE *fopen(const char *path, const char *mode);
int fprintf(FILE *stream, const char *format, ...);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
void setbuf(FILE *stream, char *buf);
int vfprintf(FILE *stream, const char *format, va_list ap);
#endif

View File

@ -0,0 +1,25 @@
/*
* \brief Minimal C library for libgcov
* \author Christian Prochaska
* \date 2018-11-16
*
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef STDLIB_H
#define STDLIB_H
void abort(void);
void atexit(void (*func)(void));
int atoi(const char *nptr);
void free(void *ptr);
char *getenv(const char *name);
void *malloc(size_t size);
#endif

View File

@ -0,0 +1,23 @@
/*
* \brief Minimal C library for libgcov
* \author Christian Prochaska
* \date 2018-11-16
*
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef STRING_H
#define STRING_H
void *memcpy(void *dest, const void *src, size_t n);
void *memset(void *s, int c, size_t n);
char *strcpy(char *dest, const char *src);
size_t strlen(const char *s);
#endif

View File

@ -0,0 +1,21 @@
/*
* \brief Minimal C library for libgcov
* \author Christian Prochaska
* \date 2018-11-16
*
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef SYS_TYPES_H
#define SYS_TYPES_H
typedef unsigned long size_t;
typedef int pid_t;
#endif

View File

@ -0,0 +1,20 @@
/*
* \brief Minimal C library for libgcov
* \author Christian Prochaska
* \date 2018-11-16
*
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef UNISTD_H
#define UNISTD_H
#define F_OK 0
#endif

View File

@ -0,0 +1,38 @@
libgcov.patch
From: Christian Prochaska <christian.prochaska@genode-labs.com>
---
gcc/tsystem.h | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/gcc/tsystem.h b/gcc/tsystem.h
index 7dc4b54..c7a09df 100644
--- a/gcc/tsystem.h
+++ b/gcc/tsystem.h
@@ -90,7 +90,9 @@ extern void *memset (void *, int, size_t);
#include <sys/types.h>
/* All systems have this header. */
+#if 0
#include <errno.h>
+#endif
#ifndef errno
extern int errno;
@@ -102,10 +104,14 @@ extern int errno;
#include <unistd.h>
/* GCC supplies this header. */
+#if 0
#include <limits.h>
+#endif
/* If these system headers do not exist, fixincludes must create them. */
+#if 0
#include <time.h>
+#endif
#endif /* inhibit_libc */