summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--SDKs/darwin/usr/include/stdlib.h1
-rw-r--r--lib/profile/GCDAProfiling.c21
2 files changed, 21 insertions, 1 deletions
diff --git a/SDKs/darwin/usr/include/stdlib.h b/SDKs/darwin/usr/include/stdlib.h
index c18c2e49..7c973dcc 100644
--- a/SDKs/darwin/usr/include/stdlib.h
+++ b/SDKs/darwin/usr/include/stdlib.h
@@ -22,6 +22,7 @@
typedef __SIZE_TYPE__ size_t;
void abort(void) __attribute__((__noreturn__));
+int atexit(void (*)(void));
int atoi(const char *);
void free(void *);
char *getenv(const char *);
diff --git a/lib/profile/GCDAProfiling.c b/lib/profile/GCDAProfiling.c
index bca25536..86f68f58 100644
--- a/lib/profile/GCDAProfiling.c
+++ b/lib/profile/GCDAProfiling.c
@@ -331,7 +331,7 @@ void llvm_register_writeout_function(writeout_fn fn) {
}
}
-void __llvm_writeout_files() {
+void llvm_writeout_files() {
struct writeout_fn_node *curr = writeout_fn_head;
while (curr) {
@@ -381,3 +381,22 @@ void llvm_delete_flush_function_list() {
flush_fn_head = flush_fn_tail = NULL;
}
+
+void llvm_gcov_init(writeout_fn wfn, flush_fn ffn) {
+ static int atexit_ran = 0;
+
+ if (wfn)
+ llvm_register_writeout_function(wfn);
+
+ if (ffn)
+ llvm_register_flush_function(ffn);
+
+ if (atexit_ran == 0) {
+ atexit_ran = 1;
+
+ /* Make sure we write out the data and delete the data structures. */
+ atexit(llvm_delete_flush_function_list);
+ atexit(llvm_delete_writeout_function_list);
+ atexit(llvm_writeout_files);
+ }
+}