1 /* Routines required for instrumenting a program. */
2 /* Compile this one with gcc. */
3 /* Copyright (C) 1989-2014 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 Under Section 7 of GPL version 3, you are granted additional
18 permissions described in the GCC Runtime Library Exception, version
19 3.1, as published by the Free Software Foundation.
21 You should have received a copy of the GNU General Public License and
22 a copy of the GCC Runtime Library Exception along with this program;
23 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 <http://www.gnu.org/licenses/>. */
29 #if defined(inhibit_libc)
32 void __gcov_flush (void) {}
36 void __gcov_reset (void) {}
40 void __gcov_dump (void) {}
45 extern void gcov_clear (void) ATTRIBUTE_HIDDEN
;
46 extern void gcov_exit (void) ATTRIBUTE_HIDDEN
;
47 extern void set_gcov_dump_complete (void) ATTRIBUTE_HIDDEN
;
48 extern void reset_gcov_dump_complete (void) ATTRIBUTE_HIDDEN
;
52 #ifdef __GTHREAD_MUTEX_INIT
53 ATTRIBUTE_HIDDEN __gthread_mutex_t __gcov_flush_mx
= __GTHREAD_MUTEX_INIT
;
54 #define init_mx_once()
56 __gthread_mutex_t __gcov_flush_mx ATTRIBUTE_HIDDEN
;
61 __GTHREAD_MUTEX_INIT_FUNCTION (&__gcov_flush_mx
);
66 static __gthread_once_t once
= __GTHREAD_ONCE_INIT
;
67 __gthread_once (&once
, init_mx
);
71 /* Called before fork or exec - write out profile information gathered so
72 far and reset it to zero. This avoids duplication or loss of the
73 profile information gathered so far. */
79 __gthread_mutex_lock (&__gcov_flush_mx
);
84 __gthread_mutex_unlock (&__gcov_flush_mx
);
87 #endif /* L_gcov_flush */
91 /* Function that can be called from application to reset counters to zero,
92 in order to collect profile in region of interest. */
98 /* Re-enable dumping to support collecting profile in multiple regions
100 reset_gcov_dump_complete ();
103 #endif /* L_gcov_reset */
107 /* Function that can be called from application to write profile collected
108 so far, in order to collect profile in region of interest. */
114 /* Prevent profile from being dumped a second time on application exit. */
115 set_gcov_dump_complete ();
118 #endif /* L_gcov_dump */
122 /* A wrapper for the fork function. Flushes the accumulated profiling data, so
123 that they are not counted twice. */
129 extern __gthread_mutex_t __gcov_flush_mx
;
133 __GTHREAD_MUTEX_INIT_FUNCTION (&__gcov_flush_mx
);
139 /* A wrapper for the execl function. Flushes the accumulated profiling data, so
140 that they are not lost. */
143 __gcov_execl (const char *path
, char *arg
, ...)
155 while (va_arg (ap
, char *))
159 args
= (char **) alloca (length
* sizeof (void *));
161 for (i
= 1; i
< length
; i
++)
162 args
[i
] = va_arg (aq
, char *);
165 return execv (path
, args
);
170 /* A wrapper for the execlp function. Flushes the accumulated profiling data, so
171 that they are not lost. */
174 __gcov_execlp (const char *path
, char *arg
, ...)
186 while (va_arg (ap
, char *))
190 args
= (char **) alloca (length
* sizeof (void *));
192 for (i
= 1; i
< length
; i
++)
193 args
[i
] = va_arg (aq
, char *);
196 return execvp (path
, args
);
201 /* A wrapper for the execle function. Flushes the accumulated profiling data, so
202 that they are not lost. */
205 __gcov_execle (const char *path
, char *arg
, ...)
218 while (va_arg (ap
, char *))
222 args
= (char **) alloca (length
* sizeof (void *));
224 for (i
= 1; i
< length
; i
++)
225 args
[i
] = va_arg (aq
, char *);
226 envp
= va_arg (aq
, char **);
229 return execve (path
, args
, envp
);
234 /* A wrapper for the execv function. Flushes the accumulated profiling data, so
235 that they are not lost. */
238 __gcov_execv (const char *path
, char *const argv
[])
241 return execv (path
, argv
);
246 /* A wrapper for the execvp function. Flushes the accumulated profiling data, so
247 that they are not lost. */
250 __gcov_execvp (const char *path
, char *const argv
[])
253 return execvp (path
, argv
);
258 /* A wrapper for the execve function. Flushes the accumulated profiling data, so
259 that they are not lost. */
262 __gcov_execve (const char *path
, char *const argv
[], char *const envp
[])
265 return execve (path
, argv
, envp
);
268 #endif /* inhibit_libc */