aboutsummaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2011-04-16 01:20:23 +0000
committerNick Lewycky <nicholas@mxc.ca>2011-04-16 01:20:23 +0000
commitb1928704201034c785a26296a49f69355eb56a05 (patch)
tree6cb5f9d9c717c85a5e9ccb6ada1a9c2a103e192c /runtime
parente9db5e29e3af91eec572bfeb8dcec908213298b0 (diff)
Rename LineProfiling to GCOVProfiling to more accurately represent what it
does. Also mostly implement it. Still a work-in-progress, but generates legal output on crafted test cases. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129630 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'runtime')
-rw-r--r--runtime/libprofile/GCDAProfiling.c104
-rw-r--r--runtime/libprofile/LineProfiling.c40
-rw-r--r--runtime/libprofile/libprofile.exports7
3 files changed, 108 insertions, 43 deletions
diff --git a/runtime/libprofile/GCDAProfiling.c b/runtime/libprofile/GCDAProfiling.c
new file mode 100644
index 0000000000..ee48ab5b6b
--- /dev/null
+++ b/runtime/libprofile/GCDAProfiling.c
@@ -0,0 +1,104 @@
+/*===- GCDAProfiling.c - Support library for GCDA file emission -----------===*\
+|*
+|* The LLVM Compiler Infrastructure
+|*
+|* This file is distributed under the University of Illinois Open Source
+|* License. See LICENSE.TXT for details.
+|*
+|*===----------------------------------------------------------------------===*|
+|*
+|* This file implements the call back routines for the gcov profiling
+|* instrumentation pass. Link against this library when running code through
+|* the -insert-gcov-profiling LLVM pass.
+|*
+|* We emit files in a corrupt version of GCOV's "gcda" file format. These files
+|* are only close enough that LCOV will happily parse them. Anything that lcov
+|* ignores is missing.
+|*
+\*===----------------------------------------------------------------------===*/
+
+#include "llvm/Support/DataTypes.h"
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+// #define DEBUG_GCDAPROFILING
+
+/*
+ * --- GCOV file format I/O primitives ---
+ */
+
+static FILE *output_file = NULL;
+
+static void write_int32(uint32_t i) {
+ fwrite(&i, 4, 1, output_file);
+}
+
+static void write_int64(uint64_t i) {
+ uint32_t lo, hi;
+ lo = i & 0x00000000ffffffff;
+ hi = i & 0xffffffff00000000;
+
+ write_int32(lo);
+ write_int32(hi);
+}
+
+/*
+ * --- LLVM line counter API ---
+ */
+
+/* A file in this case is a translation unit. Each .o file built with line
+ * profiling enabled will emit to a different file. Only one file may be
+ * started at a time.
+ */
+void llvm_gcda_start_file(const char *filename) {
+ output_file = fopen(filename, "w+");
+
+ /* gcda file, version 404*, stamp LLVM. */
+ fwrite("adcg*404MVLL", 12, 1, output_file);
+
+#ifdef DEBUG_GCDAPROFILING
+ printf("[%s]\n", filename);
+#endif
+}
+
+void llvm_gcda_emit_function(uint32_t ident) {
+#ifdef DEBUG_GCDAPROFILING
+ printf("function id=%x\n", ident);
+#endif
+
+ /* function tag */
+ fwrite("\0\0\0\1", 4, 1, output_file);
+ write_int32(2);
+ write_int32(ident);
+ write_int32(0);
+}
+
+void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) {
+ uint32_t i;
+ /* counter #1 (arcs) tag */
+ fwrite("\0\0\xa1\1", 4, 1, output_file);
+ write_int32(num_counters * 2);
+ for (i = 0; i < num_counters; ++i) {
+ write_int64(counters[i]);
+ }
+
+#ifdef DEBUG_GCDAPROFILING
+ printf(" %u arcs\n", num_counters);
+ for (i = 0; i < num_counters; ++i) {
+ printf(" %llu\n", (unsigned long long)counters[i]);
+ }
+#endif
+}
+
+void llvm_gcda_end_file() {
+ /* Write out EOF record. */
+ fwrite("\0\0\0\0\0\0\0\0", 8, 1, output_file);
+ fclose(output_file);
+ output_file = NULL;
+
+#ifdef DEBUG_GCDAPROFILING
+ printf("-----\n");
+#endif
+}
diff --git a/runtime/libprofile/LineProfiling.c b/runtime/libprofile/LineProfiling.c
deleted file mode 100644
index 9db789ec0b..0000000000
--- a/runtime/libprofile/LineProfiling.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/*===- LineProfiling.c - Support library for line profiling ---------------===*\
-|*
-|* The LLVM Compiler Infrastructure
-|*
-|* This file is distributed under the University of Illinois Open Source
-|* License. See LICENSE.TXT for details.
-|*
-|*===----------------------------------------------------------------------===*|
-|*
-|* This file implements the call back routines for the line profiling
-|* instrumentation pass. Link against this library when running code through
-|* the -insert-line-profiling LLVM pass.
-|*
-\*===----------------------------------------------------------------------===*/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-
-#include "llvm/Support/DataTypes.h"
-
-/* A file in this case is a translation unit. Each .o file built with line
- * profiling enabled will emit to a different file. Only one file may be
- * started at a time.
- */
-void llvm_prof_linectr_start_file(const char *orig_filename) {
- printf("[%s]\n", orig_filename);
-}
-
-/* Emit data about a counter to the data file. */
-void llvm_prof_linectr_emit_counter(const char *dir, const char *file,
- uint32_t line, uint32_t column,
- uint64_t *counter) {
- printf("%s/%s:%u:%u %llu\n", dir, file, line, column,
- (unsigned long long)(*counter));
-}
-
-void llvm_prof_linectr_end_file() {
- printf("-----\n");
-}
diff --git a/runtime/libprofile/libprofile.exports b/runtime/libprofile/libprofile.exports
index fb04ea3480..aca563fc5c 100644
--- a/runtime/libprofile/libprofile.exports
+++ b/runtime/libprofile/libprofile.exports
@@ -5,6 +5,7 @@ llvm_start_basic_block_tracing
llvm_trace_basic_block
llvm_increment_path_count
llvm_decrement_path_count
-llvm_prof_linectr_start_file
-llvm_prof_linectr_emit_counter
-llvm_prof_linectr_end_file
+llvm_gcda_start_file
+llvm_gcda_emit_function
+llvm_gcda_emit_arcs
+llvm_gcda_end_file