summaryrefslogtreecommitdiff
path: root/Documentation/gcov.txt
diff options
context:
space:
mode:
Diffstat (limited to 'Documentation/gcov.txt')
-rw-r--r--Documentation/gcov.txt227
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)
+ {