@@ -60,14 +60,21 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
file : int32:magic int32:version int32:stamp record*
- The magic ident is different for the notes and the data files. The
- magic ident is used to determine the endianness of the file, when
- reading. The version is the same for both files and is derived
- from gcc's version number. The stamp value is used to synchronize
- note and data files and to synchronize merging within a data
- file. It need not be an absolute time stamp, merely a ticker that
- increments fast enough and cycles slow enough to distinguish
- different compile/run/compile cycles.
+ A filename header may be used to provide a filename for the data in
+ a stream of data to support gcov in freestanding environments. This
+ header is used by the merge-stream subcommand of the gcov-tool. The
+ format of the filename header is
+
+ filename-header : int32:magic int32:version string
+
+ The magic ident is different for the notes and the data files as
+ well as the filename header. The magic ident is used to determine
+ the endianness of the file, when reading. The version is the same
+ for both files and is derived from gcc's version number. The stamp
+ value is used to synchronize note and data files and to synchronize
+ merging within a data file. It need not be an absolute time stamp,
+ merely a ticker that increments fast enough and cycles slow enough
+ to distinguish different compile/run/compile cycles.
Although the ident and version are formally 32 bit numbers, they
are derived from 4 character ASCII strings. The version number
@@ -228,6 +235,7 @@ typedef uint64_t gcov_type_unsigned;
/* File magic. Must not be palindromes. */
#define GCOV_DATA_MAGIC ((gcov_unsigned_t)0x67636461) /* "gcda" */
#define GCOV_NOTE_MAGIC ((gcov_unsigned_t)0x67636e6f) /* "gcno" */
+#define GCOV_FILENAME_MAGIC ((gcov_unsigned_t)0x6763666e) /* "gcfn" */
#include "version.h"
@@ -43,7 +43,8 @@ extern void __gcov_dump (void);
stream. The ALLOCATE_FN callback shall allocate memory with a size in
characters specified by the first callback parameter. The ARG parameter is
a user-provided argument passed as the last argument to the callback
- functions. */
+ functions. It is recommended to use the __gcov_filename_to_gcfn()
+ in the filename callback function. */
extern void
__gcov_info_to_gcda (const struct gcov_info *__info,
@@ -52,4 +53,18 @@ __gcov_info_to_gcda (const struct gcov_info *__info,
void *(*__allocate_fn) (unsigned, void *),
void *__arg);
+/* Convert the FILENAME to a gcfn data stream. The DUMP_FN callback is
+ subsequently called with chunks (the begin and length of the chunk are
+ passed as the first two callback parameters) of the gcfn data stream.
+ The ARG parameter is a user-provided argument passed as the last
+ argument to the DUMP_FN callback function. This function is intended
+ to be used by the filename callback of __gcov_info_to_gcda(). The gcfn
+ data stream is used by the merge-stream subcommand of the gcov-tool to
+ get the filename associated with a gcda data stream. */
+
+extern void
+__gcov_filename_to_gcfn (const char *__filename,
+ void (*__dump_fn) (const void *, unsigned, void *),
+ void *__arg);
+
#endif /* GCC_GCOV_H */
@@ -410,6 +410,23 @@ dump_counter (gcov_type counter,
dump_unsigned (0, dump_fn, arg);
}
+/* Dump the STRING using the DUMP handler called with ARG. */
+
+static inline void
+dump_string (const char *string,
+ void (*dump_fn) (const void *, unsigned, void *),
+ void *arg)
+{
+ unsigned length = 0;
+
+ if (string)
+ length = strlen (string) + 1;
+
+ dump_unsigned (length, dump_fn, arg);
+ if (string)
+ (*dump_fn) (string, length, arg);
+}
+
#define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
/* Store all TOP N counters where each has a dynamic length. */
@@ -780,4 +797,17 @@ __gcov_info_to_gcda (const struct gcov_info *gi_ptr,
(*filename_fn) (gi_ptr->filename, arg);
write_one_data (gi_ptr, NULL, dump_fn, allocate_fn, arg);
}
+
+/* Convert the filename to a gcfn data stream. It is intended for
+ free-standing environments which do not support the C library file I/O. */
+
+void
+__gcov_filename_to_gcfn (const char *filename,
+ void (*dump_fn) (const void *, unsigned, void *),
+ void *arg)
+{
+ dump_unsigned (GCOV_FILENAME_MAGIC, dump_fn, arg);
+ dump_unsigned (GCOV_VERSION, dump_fn, arg);
+ dump_string (filename, dump_fn, arg);
+}
#endif /* NEED_L_GCOV_INFO_TO_GCDA */