diff options
Diffstat (limited to 'Documentation/gcov.txt')
-rw-r--r-- | Documentation/gcov.txt | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/Documentation/gcov.txt b/Documentation/gcov.txt new file mode 100644 index 0000000000..896ec939d6 --- /dev/null +++ b/Documentation/gcov.txt @@ -0,0 +1,227 @@ +This patch contains our local modifications for gcov-io.h and libgcov.c. +The file gcov-iov.h is taken from a gcc build (produced at compile +time). The file gcov-io.c is unchanged. + +--- gcc-4.7.2/gcc/gcov-io.h 2011-12-04 10:27:19.000000000 -0800 ++++ coreboot/src/lib/gcov-io.h 2013-01-12 16:45:57.000000000 -0800 +@@ -163,6 +163,24 @@ + #ifndef GCC_GCOV_IO_H + #define GCC_GCOV_IO_H + ++#ifdef __COREBOOT__ ++#define GCOV_LINKAGE /* nothing */ ++/* We need the definitions for ++ BITS_PER_UNIT and ++ LONG_LONG_TYPE_SIZE ++ They are defined in gcc/defaults.h and gcc/config/<arch_depend_files> ++ (like, gcc/config/i386/i386.h). And it can be overridden by setting ++ in build scripts. Here I hardcoded the value for x86. */ ++#define BITS_PER_UNIT 8 ++#define LONG_LONG_TYPE_SIZE 64 ++ ++/* There are many gcc_assertions. Set the vaule to 1 if we want a warning ++ message if the assertion fails. */ ++#ifndef ENABLE_ASSERT_CHECKING ++#define ENABLE_ASSERT_CHECKING 1 ++#endif ++#endif /* __COREBOOT__ */ ++ + #if IN_LIBGCOV + /* About the target */ + +@@ -232,7 +250,9 @@ + is not also used in a DSO. */ + #if IN_LIBGCOV + ++#ifndef __COREBOOT__ + #include "tconfig.h" ++#endif /* __COREBOOT__ */ + + #define gcov_var __gcov_var + #define gcov_open __gcov_open +@@ -455,8 +475,10 @@ + /* Register a new object file module. */ + extern void __gcov_init (struct gcov_info *) ATTRIBUTE_HIDDEN; + ++#ifndef __COREBOOT__ + /* Called before fork, to avoid double counting. */ + extern void __gcov_flush (void) ATTRIBUTE_HIDDEN; ++#endif + + /* The merge function that just sums the counters. */ + extern void __gcov_merge_add (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; +--- gcc-4.7.2/libgcc/libgcov.c 2012-01-11 10:50:21.000000000 -0800 ++++ coreboot/src/lib/libgcov.c 2013-01-16 09:45:11.000000000 -0800 +@@ -25,12 +25,41 @@ + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + <http://www.gnu.org/licenses/>. */ + ++#define __COREBOOT__ ++#ifdef __COREBOOT__ ++#include <stdlib.h> ++#include <string.h> ++#include <console/console.h> ++#include <assert.h> ++typedef s32 pid_t; ++#define gcc_assert(x) ASSERT(x) ++#define fprintf(file, x...) printk(BIOS_ERR, x) ++#define alloca(size) __builtin_alloca (size) ++#include "gcov-glue.c" ++ ++/* Define MACROs to be used by coreboot compilation. */ ++# define L_gcov ++# define L_gcov_interval_profiler ++# define L_gcov_pow2_profiler ++# define L_gcov_one_value_profiler ++# define L_gcov_indirect_call_profiler ++# define L_gcov_average_profiler ++# define L_gcov_ior_profiler ++ ++# define HAVE_CC_TLS 0 ++# define __GCOV_KERNEL__ ++ ++# define IN_LIBGCOV 1 ++# define IN_GCOV 0 ++#else /* __COREBOOT__ */ + #include "tconfig.h" + #include "tsystem.h" + #include "coretypes.h" + #include "tm.h" + #include "libgcc_tm.h" ++#endif /* __COREBOOT__ */ + ++#ifndef __COREBOOT__ + #if defined(inhibit_libc) + #define IN_LIBGCOV (-1) + #else +@@ -41,6 +70,7 @@ + #define GCOV_LINKAGE /* nothing */ + #endif + #endif ++#endif /* __COREBOOT__ */ + #include "gcov-io.h" + + #if defined(inhibit_libc) +@@ -68,12 +98,17 @@ + + #else + ++#ifndef __COREBOOT__ + #include <string.h> + #if GCOV_LOCKED + #include <fcntl.h> + #include <errno.h> + #include <sys/stat.h> + #endif ++#else ++void __gcov_merge_add(gcov_type *counters __attribute__ ((unused)), ++ unsigned n_counters __attribute__ ((unused))) {} ++#endif /* __COREBOOT__ */ + + #ifdef L_gcov + #include "gcov-io.c" +@@ -99,6 +134,10 @@ + static int + create_file_directory (char *filename) + { ++#ifdef __COREBOOT__ ++ (void) filename; ++ return 0; ++#else + #if !defined(TARGET_POSIX_IO) && !defined(_WIN32) + (void) filename; + return -1; +@@ -137,6 +176,7 @@ + }; + return 0; + #endif ++#endif + } + + static struct gcov_fn_buffer * +@@ -279,7 +319,7 @@ + struct gcov_ctr_summary *cs_ptr; + const struct gcov_ctr_info *ci_ptr; + unsigned t_ix; +- int f_ix; ++ int f_ix = 0; + gcov_unsigned_t c_num; + const char *gcov_prefix; + int gcov_prefix_strip = 0; +@@ -329,6 +369,7 @@ + } + } + ++#ifndef __COREBOOT__ + { + /* Check if the level of dirs to strip off specified. */ + char *tmp = getenv("GCOV_PREFIX_STRIP"); +@@ -352,6 +393,7 @@ + prefix_length--; + } + else ++#endif + prefix_length = 0; + + /* If no prefix was specified and a prefix stip, then we assume +@@ -696,8 +738,10 @@ + if (filename_length > gcov_max_filename) + gcov_max_filename = filename_length; + ++#ifndef __COREBOOT__ + if (!gcov_list) + atexit (gcov_exit); ++#endif + + info->next = gcov_list; + gcov_list = info; +@@ -767,14 +811,15 @@ + + #ifdef L_gcov_merge_single + /* The profile merging function for choosing the most common value. +- It is given an array COUNTERS of N_COUNTERS old counters and it +- reads the same number of counters from the gcov file. The counters +- are split into 3-tuples where the members of the tuple have +- meanings: +- +- -- the stored candidate on the most common value of the measured entity +- -- counter +- -- total number of evaluations of the value */ ++ * It is given an array COUNTERS of N_COUNTERS old counters and it ++ * reads the same number of counters from the gcov file. The counters ++ * are split into 3-tuples where the members of the tuple have ++ * meanings: ++ * ++ * -- the stored candidate on the most common value of the measured entity ++ * -- counter ++ * -- total number of evaluations of the value ++ */ + void + __gcov_merge_single (gcov_type *counters, unsigned n_counters) + { +@@ -805,15 +850,16 @@ + + #ifdef L_gcov_merge_delta + /* The profile merging function for choosing the most common +- difference between two consecutive evaluations of the value. It is +- given an array COUNTERS of N_COUNTERS old counters and it reads the +- same number of counters from the gcov file. The counters are split +- into 4-tuples where the members of the tuple have meanings: +- +- -- the last value of the measured entity +- -- the stored candidate on the most common difference +- -- counter +- -- total number of evaluations of the value */ ++ * difference between two consecutive evaluations of the value. It is ++ * given an array COUNTERS of N_COUNTERS old counters and it reads the ++ * same number of counters from the gcov file. The counters are split ++ * into 4-tuples where the members of the tuple have meanings: ++ * ++ * -- the last value of the measured entity ++ * -- the stored candidate on the most common difference ++ * -- counter ++ * -- total number of evaluations of the value ++ */ + void + __gcov_merge_delta (gcov_type *counters, unsigned n_counters) + { |