1 /* Routines required for instrumenting a program. */
2 /* Compile this one with gcc. */
3 /* Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file. (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combine
22 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
23 WARRANTY; without even the implied warranty of MERCHANTABILITY or
24 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
27 You should have received a copy of the GNU General Public License
28 along with GCC; see the file COPYING. If not, write to the Free
29 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
34 #include "coretypes.h"
37 #if defined(inhibit_libc)
38 #define IN_LIBGCOV (-1)
40 #undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */
44 #define GCOV_LINKAGE /* nothing */
49 #if defined(inhibit_libc)
50 /* If libc and its header files are not available, provide dummy functions. */
53 void __gcov_init (struct gcov_info
*p
__attribute__ ((unused
))) {}
54 void __gcov_flush (void) {}
57 #ifdef L_gcov_merge_add
58 void __gcov_merge_add (gcov_type
*counters
__attribute__ ((unused
)),
59 unsigned n_counters
__attribute__ ((unused
))) {}
62 #ifdef L_gcov_merge_single
63 void __gcov_merge_single (gcov_type
*counters
__attribute__ ((unused
)),
64 unsigned n_counters
__attribute__ ((unused
))) {}
67 #ifdef L_gcov_merge_delta
68 void __gcov_merge_delta (gcov_type
*counters
__attribute__ ((unused
)),
69 unsigned n_counters
__attribute__ ((unused
))) {}
84 /* Chain of per-object gcov structures. */
85 static struct gcov_info
*gcov_list
;
87 /* A program checksum allows us to distinguish program data for an
88 object file included in multiple programs. */
89 static gcov_unsigned_t gcov_crc32
;
91 /* Size of the longest file name. */
92 static size_t gcov_max_filename
= 0;
94 /* Make sure path component of the given FILENAME exists, create
95 missing directories. FILENAME must be writable.
96 Returns zero on success, or -1 if an error occurred. */
99 create_file_directory (char *filename
)
103 for (s
= filename
+ 1; *s
!= '\0'; s
++)
104 if (IS_DIR_SEPARATOR(*s
))
109 /* Try to make directory if it doesn't already exist. */
110 if (access (filename
, F_OK
) == -1
111 && mkdir (filename
, 0755) == -1
112 /* The directory might have been made by another process. */
115 fprintf (stderr
, "profiling:%s:Cannot create directory\n",
126 /* Check if VERSION of the info block PTR matches libgcov one.
127 Return 1 on success, or zero in case of versions mismatch.
128 If FILENAME is not NULL, its value used for reporting purposes
129 instead of value from the info block. */
132 gcov_version (struct gcov_info
*ptr
, gcov_unsigned_t version
,
133 const char *filename
)
135 if (version
!= GCOV_VERSION
)
139 GCOV_UNSIGNED2STRING (v
, version
);
140 GCOV_UNSIGNED2STRING (e
, GCOV_VERSION
);
143 "profiling:%s:Version mismatch - expected %.4s got %.4s\n",
144 filename
? filename
: ptr
->filename
, e
, v
);
150 /* Dump the coverage counts. We merge with existing counts when
151 possible, to avoid growing the .da files ad infinitum. We use this
152 program's checksum to make sure we only accumulate whole program
153 statistics to the correct summary. An object file might be embedded
154 in two separate programs, and we must keep the two program
155 summaries separate. */
160 struct gcov_info
*gi_ptr
;
161 struct gcov_summary this_program
;
162 struct gcov_summary all
;
163 struct gcov_ctr_summary
*cs_ptr
;
164 const struct gcov_ctr_info
*ci_ptr
;
166 gcov_unsigned_t c_num
;
167 const char *gcov_prefix
;
168 int gcov_prefix_strip
= 0;
169 size_t prefix_length
;
170 char *gi_filename
, *gi_filename_up
;
172 memset (&all
, 0, sizeof (all
));
173 /* Find the totals for this execution. */
174 memset (&this_program
, 0, sizeof (this_program
));
175 for (gi_ptr
= gcov_list
; gi_ptr
; gi_ptr
= gi_ptr
->next
)
177 ci_ptr
= gi_ptr
->counts
;
178 for (t_ix
= 0; t_ix
< GCOV_COUNTERS_SUMMABLE
; t_ix
++)
180 if (!((1 << t_ix
) & gi_ptr
->ctr_mask
))
183 cs_ptr
= &this_program
.ctrs
[t_ix
];
184 cs_ptr
->num
+= ci_ptr
->num
;
185 for (c_num
= 0; c_num
< ci_ptr
->num
; c_num
++)
187 cs_ptr
->sum_all
+= ci_ptr
->values
[c_num
];
188 if (cs_ptr
->run_max
< ci_ptr
->values
[c_num
])
189 cs_ptr
->run_max
= ci_ptr
->values
[c_num
];
195 /* Get file name relocation prefix. Non-absolute values are ignored. */
196 gcov_prefix
= getenv("GCOV_PREFIX");
197 if (gcov_prefix
&& IS_ABSOLUTE_PATH (gcov_prefix
))
199 /* Check if the level of dirs to strip off specified. */
200 char *tmp
= getenv("GCOV_PREFIX_STRIP");
203 gcov_prefix_strip
= atoi (tmp
);
204 /* Do not consider negative values. */
205 if (gcov_prefix_strip
< 0)
206 gcov_prefix_strip
= 0;
209 prefix_length
= strlen(gcov_prefix
);
211 /* Remove an unnecessary trailing '/' */
212 if (IS_DIR_SEPARATOR (gcov_prefix
[prefix_length
- 1]))
218 /* Allocate and initialize the filename scratch space. */
219 gi_filename
= alloca (prefix_length
+ gcov_max_filename
+ 1);
221 memcpy (gi_filename
, gcov_prefix
, prefix_length
);
222 gi_filename_up
= gi_filename
+ prefix_length
;
224 /* Now merge each file. */
225 for (gi_ptr
= gcov_list
; gi_ptr
; gi_ptr
= gi_ptr
->next
)
227 struct gcov_summary this_object
;
228 struct gcov_summary object
, program
;
229 gcov_type
*values
[GCOV_COUNTERS
];
230 const struct gcov_fn_info
*fi_ptr
;
232 unsigned c_ix
, f_ix
, n_counts
;
233 struct gcov_ctr_summary
*cs_obj
, *cs_tobj
, *cs_prg
, *cs_tprg
, *cs_all
;
235 gcov_unsigned_t tag
, length
;
236 gcov_position_t summary_pos
= 0;
237 gcov_position_t eof_pos
= 0;
239 memset (&this_object
, 0, sizeof (this_object
));
240 memset (&object
, 0, sizeof (object
));
242 /* Build relocated filename, stripping off leading
243 directories from the initial filename if requested. */
244 if (gcov_prefix_strip
> 0)
247 const char *fname
= gi_ptr
->filename
;
250 /* Skip selected directory levels. */
251 for (s
= fname
+ 1; (*s
!= '\0') && (level
< gcov_prefix_strip
); s
++)
252 if (IS_DIR_SEPARATOR(*s
))
258 /* Update complete filename with stripped original. */
259 strcpy (gi_filename_up
, fname
);
262 strcpy (gi_filename_up
, gi_ptr
->filename
);
264 /* Totals for this object file. */
265 ci_ptr
= gi_ptr
->counts
;
266 for (t_ix
= 0; t_ix
< GCOV_COUNTERS_SUMMABLE
; t_ix
++)
268 if (!((1 << t_ix
) & gi_ptr
->ctr_mask
))
271 cs_ptr
= &this_object
.ctrs
[t_ix
];
272 cs_ptr
->num
+= ci_ptr
->num
;
273 for (c_num
= 0; c_num
< ci_ptr
->num
; c_num
++)
275 cs_ptr
->sum_all
+= ci_ptr
->values
[c_num
];
276 if (cs_ptr
->run_max
< ci_ptr
->values
[c_num
])
277 cs_ptr
->run_max
= ci_ptr
->values
[c_num
];
284 for (t_ix
= 0; t_ix
< GCOV_COUNTERS
; t_ix
++)
285 if ((1 << t_ix
) & gi_ptr
->ctr_mask
)
287 values
[c_ix
] = gi_ptr
->counts
[c_ix
].values
;
291 /* Calculate the function_info stride. This depends on the
292 number of counter types being measured. */
293 fi_stride
= sizeof (struct gcov_fn_info
) + c_ix
* sizeof (unsigned);
294 if (__alignof__ (struct gcov_fn_info
) > sizeof (unsigned))
296 fi_stride
+= __alignof__ (struct gcov_fn_info
) - 1;
297 fi_stride
&= ~(__alignof__ (struct gcov_fn_info
) - 1);
300 if (!gcov_open (gi_filename
))
302 /* Open failed likely due to missed directory.
303 Create directory and retry to open file. */
304 if (create_file_directory (gi_filename
))
306 fprintf (stderr
, "profiling:%s:Skip\n", gi_filename
);
309 if (!gcov_open (gi_filename
))
311 fprintf (stderr
, "profiling:%s:Cannot open\n", gi_filename
);
316 tag
= gcov_read_unsigned ();
319 /* Merge data from file. */
320 if (tag
!= GCOV_DATA_MAGIC
)
322 fprintf (stderr
, "profiling:%s:Not a gcov data file\n",
326 length
= gcov_read_unsigned ();
327 if (!gcov_version (gi_ptr
, length
, gi_filename
))
330 length
= gcov_read_unsigned ();
331 if (length
!= gi_ptr
->stamp
)
332 /* Read from a different compilation. Overwrite the file. */
335 /* Merge execution counts for each function. */
336 for (f_ix
= 0; f_ix
< gi_ptr
->n_functions
; f_ix
++)
338 fi_ptr
= (const struct gcov_fn_info
*)
339 ((const char *) gi_ptr
->functions
+ f_ix
* fi_stride
);
340 tag
= gcov_read_unsigned ();
341 length
= gcov_read_unsigned ();
343 /* Check function. */
344 if (tag
!= GCOV_TAG_FUNCTION
345 || length
!= GCOV_TAG_FUNCTION_LENGTH
346 || gcov_read_unsigned () != fi_ptr
->ident
347 || gcov_read_unsigned () != fi_ptr
->checksum
)
350 fprintf (stderr
, "profiling:%s:Merge mismatch for %s\n",
352 f_ix
+ 1 ? "function" : "summaries");
357 for (t_ix
= 0; t_ix
< GCOV_COUNTERS
; t_ix
++)
361 if (!((1 << t_ix
) & gi_ptr
->ctr_mask
))
364 n_counts
= fi_ptr
->n_ctrs
[c_ix
];
365 merge
= gi_ptr
->counts
[c_ix
].merge
;
367 tag
= gcov_read_unsigned ();
368 length
= gcov_read_unsigned ();
369 if (tag
!= GCOV_TAG_FOR_COUNTER (t_ix
)
370 || length
!= GCOV_TAG_COUNTER_LENGTH (n_counts
))
372 (*merge
) (values
[c_ix
], n_counts
);
373 values
[c_ix
] += n_counts
;
376 if ((error
= gcov_is_error ()))
381 /* Check program & object summary */
386 eof_pos
= gcov_position ();
387 tag
= gcov_read_unsigned ();
391 length
= gcov_read_unsigned ();
392 is_program
= tag
== GCOV_TAG_PROGRAM_SUMMARY
;
393 if (length
!= GCOV_TAG_SUMMARY_LENGTH
394 || (!is_program
&& tag
!= GCOV_TAG_OBJECT_SUMMARY
))
396 gcov_read_summary (is_program
? &program
: &object
);
397 if ((error
= gcov_is_error ()))
399 if (is_program
&& program
.checksum
== gcov_crc32
)
401 summary_pos
= eof_pos
;
409 fprintf (stderr
, error
< 0 ? "profiling:%s:Overflow merging\n"
410 : "profiling:%s:Error merging\n", gi_filename
);
419 memset (&program
, 0, sizeof (program
));
421 /* Merge the summaries. */
423 for (t_ix
= 0; t_ix
< GCOV_COUNTERS_SUMMABLE
; t_ix
++)
425 cs_obj
= &object
.ctrs
[t_ix
];
426 cs_tobj
= &this_object
.ctrs
[t_ix
];
427 cs_prg
= &program
.ctrs
[t_ix
];
428 cs_tprg
= &this_program
.ctrs
[t_ix
];
429 cs_all
= &all
.ctrs
[t_ix
];
431 if ((1 << t_ix
) & gi_ptr
->ctr_mask
)
434 cs_obj
->num
= cs_tobj
->num
;
435 else if (cs_obj
->num
!= cs_tobj
->num
)
437 cs_obj
->sum_all
+= cs_tobj
->sum_all
;
438 if (cs_obj
->run_max
< cs_tobj
->run_max
)
439 cs_obj
->run_max
= cs_tobj
->run_max
;
440 cs_obj
->sum_max
+= cs_tobj
->run_max
;
443 cs_prg
->num
= cs_tprg
->num
;
444 else if (cs_prg
->num
!= cs_tprg
->num
)
446 cs_prg
->sum_all
+= cs_tprg
->sum_all
;
447 if (cs_prg
->run_max
< cs_tprg
->run_max
)
448 cs_prg
->run_max
= cs_tprg
->run_max
;
449 cs_prg
->sum_max
+= cs_tprg
->run_max
;
451 else if (cs_obj
->num
|| cs_prg
->num
)
454 if (!cs_all
->runs
&& cs_prg
->runs
)
455 memcpy (cs_all
, cs_prg
, sizeof (*cs_all
));
456 else if (!all
.checksum
457 && (!GCOV_LOCKED
|| cs_all
->runs
== cs_prg
->runs
)
458 && memcmp (cs_all
, cs_prg
, sizeof (*cs_all
)))
460 fprintf (stderr
, "profiling:%s:Invocation mismatch - some data files may have been removed%s",
461 gi_filename
, GCOV_LOCKED
462 ? "" : " or concurrent update without locking support");
468 for (t_ix
= 0; t_ix
< GCOV_COUNTERS
; t_ix
++)
469 if ((1 << t_ix
) & gi_ptr
->ctr_mask
)
471 values
[c_ix
] = gi_ptr
->counts
[c_ix
].values
;
475 program
.checksum
= gcov_crc32
;
477 /* Write out the data. */
478 gcov_write_tag_length (GCOV_DATA_MAGIC
, GCOV_VERSION
);
479 gcov_write_unsigned (gi_ptr
->stamp
);
481 /* Write execution counts for each function. */
482 for (f_ix
= 0; f_ix
< gi_ptr
->n_functions
; f_ix
++)
484 fi_ptr
= (const struct gcov_fn_info
*)
485 ((const char *) gi_ptr
->functions
+ f_ix
* fi_stride
);
487 /* Announce function. */
488 gcov_write_tag_length (GCOV_TAG_FUNCTION
, GCOV_TAG_FUNCTION_LENGTH
);
489 gcov_write_unsigned (fi_ptr
->ident
);
490 gcov_write_unsigned (fi_ptr
->checksum
);
493 for (t_ix
= 0; t_ix
< GCOV_COUNTERS
; t_ix
++)
497 if (!((1 << t_ix
) & gi_ptr
->ctr_mask
))
500 n_counts
= fi_ptr
->n_ctrs
[c_ix
];
502 gcov_write_tag_length (GCOV_TAG_FOR_COUNTER (t_ix
),
503 GCOV_TAG_COUNTER_LENGTH (n_counts
));
504 c_ptr
= values
[c_ix
];
506 gcov_write_counter (*c_ptr
++);
508 values
[c_ix
] = c_ptr
;
513 /* Object file summary. */
514 gcov_write_summary (GCOV_TAG_OBJECT_SUMMARY
, &object
);
516 /* Generate whole program statistics. */
519 gcov_write_summary (GCOV_TAG_PROGRAM_SUMMARY
, &program
);
521 gcov_write_unsigned (0);
522 if ((error
= gcov_close ()))
523 fprintf (stderr
, error
< 0 ?
524 "profiling:%s:Overflow writing\n" :
525 "profiling:%s:Error writing\n",
530 /* Add a new object file onto the bb chain. Invoked automatically
531 when running an object file's global ctors. */
534 __gcov_init (struct gcov_info
*info
)
538 if (gcov_version (info
, info
->version
, 0))
540 const char *ptr
= info
->filename
;
541 gcov_unsigned_t crc32
= gcov_crc32
;
542 size_t filename_length
= strlen(info
->filename
);
544 /* Refresh the longest file name information */
545 if (filename_length
> gcov_max_filename
)
546 gcov_max_filename
= filename_length
;
551 gcov_unsigned_t value
= *ptr
<< 24;
553 for (ix
= 8; ix
--; value
<<= 1)
555 gcov_unsigned_t feedback
;
557 feedback
= (value
^ crc32
) & 0x80000000 ? 0x04c11db7 : 0;
569 info
->next
= gcov_list
;
575 /* Called before fork or exec - write out profile information gathered so
576 far and reset it to zero. This avoids duplication or loss of the
577 profile information gathered so far. */
582 const struct gcov_info
*gi_ptr
;
585 for (gi_ptr
= gcov_list
; gi_ptr
; gi_ptr
= gi_ptr
->next
)
588 const struct gcov_ctr_info
*ci_ptr
;
590 for (t_ix
= 0, ci_ptr
= gi_ptr
->counts
; t_ix
!= GCOV_COUNTERS
; t_ix
++)
591 if ((1 << t_ix
) & gi_ptr
->ctr_mask
)
593 memset (ci_ptr
->values
, 0, sizeof (gcov_type
) * ci_ptr
->num
);
601 #ifdef L_gcov_merge_add
602 /* The profile merging function that just adds the counters. It is given
603 an array COUNTERS of N_COUNTERS old counters and it reads the same number
604 of counters from the gcov file. */
606 __gcov_merge_add (gcov_type
*counters
, unsigned n_counters
)
608 for (; n_counters
; counters
++, n_counters
--)
609 *counters
+= gcov_read_counter ();
611 #endif /* L_gcov_merge_add */
613 #ifdef L_gcov_merge_single
614 /* The profile merging function for choosing the most common value.
615 It is given an array COUNTERS of N_COUNTERS old counters and it
616 reads the same number of counters from the gcov file. The counters
617 are split into 3-tuples where the members of the tuple have
620 -- the stored candidate on the most common value of the measured entity
622 -- total number of evaluations of the value */
624 __gcov_merge_single (gcov_type
*counters
, unsigned n_counters
)
626 unsigned i
, n_measures
;
627 gcov_type value
, counter
, all
;
629 gcc_assert (!(n_counters
% 3));
630 n_measures
= n_counters
/ 3;
631 for (i
= 0; i
< n_measures
; i
++, counters
+= 3)
633 value
= gcov_read_counter ();
634 counter
= gcov_read_counter ();
635 all
= gcov_read_counter ();
637 if (counters
[0] == value
)
638 counters
[1] += counter
;
639 else if (counter
> counters
[1])
642 counters
[1] = counter
- counters
[1];
645 counters
[1] -= counter
;
649 #endif /* L_gcov_merge_single */
651 #ifdef L_gcov_merge_delta
652 /* The profile merging function for choosing the most common
653 difference between two consecutive evaluations of the value. It is
654 given an array COUNTERS of N_COUNTERS old counters and it reads the
655 same number of counters from the gcov file. The counters are split
656 into 4-tuples where the members of the tuple have meanings:
658 -- the last value of the measured entity
659 -- the stored candidate on the most common difference
661 -- total number of evaluations of the value */
663 __gcov_merge_delta (gcov_type
*counters
, unsigned n_counters
)
665 unsigned i
, n_measures
;
666 gcov_type last
, value
, counter
, all
;
668 gcc_assert (!(n_counters
% 4));
669 n_measures
= n_counters
/ 4;
670 for (i
= 0; i
< n_measures
; i
++, counters
+= 4)
672 last
= gcov_read_counter ();
673 value
= gcov_read_counter ();
674 counter
= gcov_read_counter ();
675 all
= gcov_read_counter ();
677 if (counters
[1] == value
)
678 counters
[2] += counter
;
679 else if (counter
> counters
[2])
682 counters
[2] = counter
- counters
[2];
685 counters
[2] -= counter
;
689 #endif /* L_gcov_merge_delta */
691 #ifdef L_gcov_interval_profiler
692 /* If VALUE is in interval <START, START + STEPS - 1>, then increases the
693 corresponding counter in COUNTERS. If the VALUE is above or below
694 the interval, COUNTERS[STEPS] or COUNTERS[STEPS + 1] is increased
698 __gcov_interval_profiler (gcov_type
*counters
, gcov_type value
,
699 int start
, unsigned steps
)
701 gcov_type delta
= value
- start
;
703 counters
[steps
+ 1]++;
704 else if (delta
>= steps
)
711 #ifdef L_gcov_pow2_profiler
712 /* If VALUE is a power of two, COUNTERS[1] is incremented. Otherwise
713 COUNTERS[0] is incremented. */
716 __gcov_pow2_profiler (gcov_type
*counters
, gcov_type value
)
718 if (value
& (value
- 1))
725 #ifdef L_gcov_one_value_profiler
726 /* Tries to determine the most common value among its inputs. Checks if the
727 value stored in COUNTERS[0] matches VALUE. If this is the case, COUNTERS[1]
728 is incremented. If this is not the case and COUNTERS[1] is not zero,
729 COUNTERS[1] is decremented. Otherwise COUNTERS[1] is set to one and
730 VALUE is stored to COUNTERS[0]. This algorithm guarantees that if this
731 function is called more than 50% of the time with one value, this value
732 will be in COUNTERS[0] in the end.
734 In any case, COUNTERS[2] is incremented. */
737 __gcov_one_value_profiler (gcov_type
*counters
, gcov_type value
)
739 if (value
== counters
[0])
741 else if (counters
[1] == 0)
753 /* A wrapper for the fork function. Flushes the accumulated profiling data, so
754 that they are not counted twice. */
765 /* A wrapper for the execl function. Flushes the accumulated profiling data, so
766 that they are not lost. */
769 __gcov_execl (const char *path
, const char *arg
, ...)
781 while (va_arg (ap
, char *))
785 args
= alloca (length
* sizeof (void *));
786 args
[0] = (char *) arg
;
787 for (i
= 1; i
< length
; i
++)
788 args
[i
] = va_arg (aq
, char *);
791 return execv (path
, args
);
796 /* A wrapper for the execlp function. Flushes the accumulated profiling data, so
797 that they are not lost. */
800 __gcov_execlp (const char *path
, const char *arg
, ...)
812 while (va_arg (ap
, char *))
816 args
= alloca (length
* sizeof (void *));
817 args
[0] = (char *) arg
;
818 for (i
= 1; i
< length
; i
++)
819 args
[i
] = va_arg (aq
, char *);
822 return execvp (path
, args
);
827 /* A wrapper for the execle function. Flushes the accumulated profiling data, so
828 that they are not lost. */
831 __gcov_execle (const char *path
, const char *arg
, ...)
844 while (va_arg (ap
, char *))
848 args
= alloca (length
* sizeof (void *));
849 args
[0] = (char *) arg
;
850 for (i
= 1; i
< length
; i
++)
851 args
[i
] = va_arg (aq
, char *);
852 envp
= va_arg (aq
, char **);
855 return execve (path
, args
, envp
);
860 /* A wrapper for the execv function. Flushes the accumulated profiling data, so
861 that they are not lost. */
864 __gcov_execv (const char *path
, char *const argv
[])
867 return execv (path
, argv
);
872 /* A wrapper for the execvp function. Flushes the accumulated profiling data, so
873 that they are not lost. */
876 __gcov_execvp (const char *path
, char *const argv
[])
879 return execvp (path
, argv
);
884 /* A wrapper for the execve function. Flushes the accumulated profiling data, so
885 that they are not lost. */
888 __gcov_execve (const char *path
, char *const argv
[], char *const envp
[])
891 return execve (path
, argv
, envp
);
894 #endif /* inhibit_libc */