1 /* File format for coverage information 2 Copyright (C) 1996, 1997, 1998, 2000, 2002, 3 2003, 2004, 2005, 2008, 2009 Free Software Foundation, Inc. 4 Contributed by Bob Manson <manson (at) cygnus.com>. 5 Completely remangled by Nathan Sidwell <nathan (at) codesourcery.com>. 6 7 This file is part of GCC. 8 9 GCC is free software; you can redistribute it and/or modify it under 10 the terms of the GNU General Public License as published by the Free 11 Software Foundation; either version 3, or (at your option) any later 12 version. 13 14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 15 WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 17 for more details. 18 19 Under Section 7 of GPL version 3, you are granted additional 20 permissions described in the GCC Runtime Library Exception, version 21 3.1, as published by the Free Software Foundation. 22 23 You should have received a copy of the GNU General Public License and 24 a copy of the GCC Runtime Library Exception along with this program; 25 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 26 <http://www.gnu.org/licenses/>. */ 27 28 29 /* Coverage information is held in two files. A notes file, which is 30 generated by the compiler, and a data file, which is generated by 31 the program under test. Both files use a similar structure. We do 32 not attempt to make these files backwards compatible with previous 33 versions, as you only need coverage information when developing a 34 program. We do hold version information, so that mismatches can be 35 detected, and we use a format that allows tools to skip information 36 they do not understand or are not interested in. 37 38 Numbers are recorded in the 32 bit unsigned binary form of the 39 endianness of the machine generating the file. 64 bit numbers are 40 stored as two 32 bit numbers, the low part first. Strings are 41 padded with 1 to 4 NUL bytes, to bring the length up to a multiple 42 of 4. The number of 4 bytes is stored, followed by the padded 43 string. Zero length and NULL strings are simply stored as a length 44 of zero (they have no trailing NUL or padding). 45 46 int32: byte3 byte2 byte1 byte0 | byte0 byte1 byte2 byte3 47 int64: int32:low int32:high 48 string: int32:0 | int32:length char* char:0 padding 49 padding: | char:0 | char:0 char:0 | char:0 char:0 char:0 50 item: int32 | int64 | string 51 52 The basic format of the files is 53 54 file : int32:magic int32:version int32:stamp record* 55 56 The magic ident is different for the notes and the data files. The 57 magic ident is used to determine the endianness of the file, when 58 reading. The version is the same for both files and is derived 59 from gcc's version number. The stamp value is used to synchronize 60 note and data files and to synchronize merging within a data 61 file. It need not be an absolute time stamp, merely a ticker that 62 increments fast enough and cycles slow enough to distinguish 63 different compile/run/compile cycles. 64 65 Although the ident and version are formally 32 bit numbers, they 66 are derived from 4 character ASCII strings. The version number 67 consists of the single character major version number, a two 68 character minor version number (leading zero for versions less than 69 10), and a single character indicating the status of the release. 70 That will be 'e' experimental, 'p' prerelease and 'r' for release. 71 Because, by good fortune, these are in alphabetical order, string 72 collating can be used to compare version strings. Be aware that 73 the 'e' designation will (naturally) be unstable and might be 74 incompatible with itself. For gcc 3.4 experimental, it would be 75 '304e' (0x33303465). When the major version reaches 10, the 76 letters A-Z will be used. Assuming minor increments releases every 77 6 months, we have to make a major increment every 50 years. 78 Assuming major increments releases every 5 years, we're ok for the 79 next 155 years -- good enough for me. 80 81 A record has a tag, length and variable amount of data. 82 83 record: header data 84 header: int32:tag int32:length 85 data: item* 86 87 Records are not nested, but there is a record hierarchy. Tag 88 numbers reflect this hierarchy. Tags are unique across note and 89 data files. Some record types have a varying amount of data. The 90 LENGTH is the number of 4bytes that follow and is usually used to 91 determine how much data. The tag value is split into 4 8-bit 92 fields, one for each of four possible levels. The most significant 93 is allocated first. Unused levels are zero. Active levels are 94 odd-valued, so that the LSB of the level is one. A sub-level 95 incorporates the values of its superlevels. This formatting allows 96 you to determine the tag hierarchy, without understanding the tags 97 themselves, and is similar to the standard section numbering used 98 in technical documents. Level values [1..3f] are used for common 99 tags, values [41..9f] for the notes file and [a1..ff] for the data 100 file. 101 102 The basic block graph file contains the following records 103 note: unit function-graph* 104 unit: header int32:checksum string:source 105 function-graph: announce_function basic_blocks {arcs | lines}* 106 announce_function: header int32:ident 107 int32:lineno_checksum int32:cfg_checksum 108 string:name string:source int32:lineno 109 basic_block: header int32:flags* 110 arcs: header int32:block_no arc* 111 arc: int32:dest_block int32:flags 112 lines: header int32:block_no line* 113 int32:0 string:NULL 114 line: int32:line_no | int32:0 string:filename 115 116 The BASIC_BLOCK record holds per-bb flags. The number of blocks 117 can be inferred from its data length. There is one ARCS record per 118 basic block. The number of arcs from a bb is implicit from the 119 data length. It enumerates the destination bb and per-arc flags. 120 There is one LINES record per basic block, it enumerates the source 121 lines which belong to that basic block. Source file names are 122 introduced by a line number of 0, following lines are from the new 123 source file. The initial source file for the function is NULL, but 124 the current source file should be remembered from one LINES record 125 to the next. The end of a block is indicated by an empty filename 126 - this does not reset the current source file. Note there is no 127 ordering of the ARCS and LINES records: they may be in any order, 128 interleaved in any manner. The current filename follows the order 129 the LINES records are stored in the file, *not* the ordering of the 130 blocks they are for. 131 132 The data file contains the following records. 133 data: {unit function-data* summary:object summary:program*}* 134 unit: header int32:checksum 135 function-data: announce_function arc_counts 136 announce_function: header int32:ident 137 int32:lineno_checksum int32:cfg_checksum 138 arc_counts: header int64:count* 139 summary: int32:checksum {count-summary}GCOV_COUNTERS 140 count-summary: int32:num int32:runs int64:sum 141 int64:max int64:sum_max 142 143 The ANNOUNCE_FUNCTION record is the same as that in the note file, 144 but without the source location. The ARC_COUNTS gives the counter 145 values for those arcs that are instrumented. The SUMMARY records 146 give information about the whole object file and about the whole 147 program. The checksum is used for whole program summaries, and 148 disambiguates different programs which include the same 149 instrumented object file. There may be several program summaries, 150 each with a unique checksum. The object summary's checksum is zero. 151 Note that the data file might contain information from several runs 152 concatenated, or the data might be merged. 153 154 This file is included by both the compiler, gcov tools and the 155 runtime support library libgcov. IN_LIBGCOV and IN_GCOV are used to 156 distinguish which case is which. If IN_LIBGCOV is nonzero, 157 libgcov is being built. If IN_GCOV is nonzero, the gcov tools are 158 being built. Otherwise the compiler is being built. IN_GCOV may be 159 positive or negative. If positive, we are compiling a tool that 160 requires additional functions (see the code for knowledge of what 161 those functions are). */ 162 163 #ifndef GCC_GCOV_IO_H 164 #define GCC_GCOV_IO_H 165 166 #ifdef __KERNEL__ 167 #ifndef __GCOV_KERNEL__ 168 #define __GCOV_KERNEL__ 169 #endif /* __GCOV_KERNEL__ */ 170 #endif /* __KERNEL__ */ 171 172 #ifdef __GCOV_KERNEL__ 173 #define GCOV_LINKAGE /* nothing */ 174 175 /* We need the definitions for 176 BITS_PER_UNIT and 177 LONG_LONG_TYPE_SIZE 178 They are defined in gcc/defaults.h and gcc/config/<arch_depend_files> 179 (like, gcc/config/i386/i386.h). And it can be overridden by setting 180 in build scripts. Here I hardcoded the value for x86. 181 Todo: using a program to auto-generate the vaules in build time. */ 182 #define BITS_PER_UNIT 8 183 #define LONG_LONG_TYPE_SIZE 64 184 185 /* There are many gcc_assertions. Set the vaule to 1 if we want a warning 186 message if the assertion fails. */ 187 #ifndef ENABLE_ASSERT_CHECKING 188 #define ENABLE_ASSERT_CHECKING 1 189 #endif 190 191 #include <linux/fs.h> 192 #endif /* __GCOV_KERNEL__ */ 193 194 /* Wrappers to the file operations. */ 195 #ifndef __GCOV_KERNEL__ 196 # define _GCOV_FILE FILE 197 # define _GCOV_fclose fclose 198 # define _GCOV_ftell ftell 199 # define _GCOV_fseek fseek 200 # define _GCOV_ftruncate ftruncate 201 # define _GCOV_fread fread 202 # define _GCOV_fwrite fwrite 203 # define _GCOV_fread fread 204 # define _GCOV_fileno fileno 205 #else /* __GCOV_KERNEL__ */ 206 /* In Linux kernel mode, a virtual file is used for file operations. */ 207 struct gcov_info; 208 typedef struct { 209 long size; /* size of buf */ 210 long count; /* element written into buf */ 211 struct gcov_info *info; 212 char buf[0]; 213 } gcov_kernel_vfile; 214 215 # define _GCOV_FILE gcov_kernel_vfile 216 217 /* gcc_assert() prints out a warning if the check fails. It 218 will not abort. */ 219 #if ENABLE_ASSERT_CHECKING 220 # define gcc_assert(EXPR) \ 221 ((void)(!(EXPR) ? printk (KERN_WARNING \ 222 "GCOV assertion fails: func=%s line=%d\n", \ 223 __FUNCTION__, __LINE__), 0 : 0)) 224 #else 225 # define gcc_assert(EXPR) ((void)(0 && (EXPR))) 226 #endif 227 228 /* Wrappers to the file operations. */ 229 # define _GCOV_fclose kernel_file_fclose 230 # define _GCOV_ftell kernel_file_ftell 231 # define _GCOV_fseek kernel_file_fseek 232 # define _GCOV_ftruncate kernel_file_ftruncate 233 # define _GCOV_fread kernel_file_fread 234 # define _GCOV_fwrite kernel_file_fwrite 235 # define _GCOV_fileno kernel_file_fileno 236 237 /* Declarations for virtual files operations. */ 238 extern int kernel_file_fclose (gcov_kernel_vfile *); 239 extern long kernel_file_ftell (gcov_kernel_vfile *); 240 extern int kernel_file_fseek (gcov_kernel_vfile *, long, int); 241 extern int kernel_file_ftruncate (gcov_kernel_vfile *, off_t); 242 extern int kernel_file_fread (void *, size_t, size_t, 243 gcov_kernel_vfile *); 244 extern int kernel_file_fwrite (const void *, size_t, size_t, 245 gcov_kernel_vfile *); 246 extern int kernel_file_fileno(gcov_kernel_vfile *); 247 #endif /* GCOV_KERNEL */ 248 #if IN_LIBGCOV 249 250 #undef FUNC_ID_WIDTH 251 #undef FUNC_ID_MASK 252 /* About the target */ 253 254 #if BITS_PER_UNIT == 8 255 typedef unsigned gcov_unsigned_t __attribute__ ((mode (SI))); 256 typedef unsigned gcov_position_t __attribute__ ((mode (SI))); 257 #if LONG_LONG_TYPE_SIZE > 32 258 typedef signed gcov_type __attribute__ ((mode (DI))); 259 #define FUNC_ID_WIDTH 32 260 #define FUNC_ID_MASK ((1ll << FUNC_ID_WIDTH) - 1) 261 #else 262 typedef signed gcov_type __attribute__ ((mode (SI))); 263 #define FUNC_ID_WIDTH 16 264 #define FUNC_ID_MASK ((1 << FUNC_ID_WIDTH) - 1) 265 #endif 266 #else /* BITS_PER_UNIT != 8 */ 267 #if BITS_PER_UNIT == 16 268 typedef unsigned gcov_unsigned_t __attribute__ ((mode (HI))); 269 typedef unsigned gcov_position_t __attribute__ ((mode (HI))); 270 #if LONG_LONG_TYPE_SIZE > 32 271 typedef signed gcov_type __attribute__ ((mode (SI))); 272 #define FUNC_ID_WIDTH 32 273 #define FUNC_ID_MASK ((1ll << FUNC_ID_WIDTH) - 1) 274 #else 275 typedef signed gcov_type __attribute__ ((mode (HI))); 276 #define FUNC_ID_WIDTH 16 277 #define FUNC_ID_MASK ((1 << FUNC_ID_WIDTH) - 1) 278 #endif 279 #else /* BITS_PER_UNIT != 16 */ 280 typedef unsigned gcov_unsigned_t __attribute__ ((mode (QI))); 281 typedef unsigned gcov_position_t __attribute__ ((mode (QI))); 282 #if LONG_LONG_TYPE_SIZE > 32 283 typedef signed gcov_type __attribute__ ((mode (HI))); 284 #define FUNC_ID_WIDTH 32 285 #define FUNC_ID_MASK ((1ll << FUNC_ID_WIDTH) - 1) 286 #else 287 typedef signed gcov_type __attribute__ ((mode (QI))); 288 #define FUNC_ID_WIDTH 16 289 #define FUNC_ID_MASK ((1 << FUNC_ID_WIDTH) - 1) 290 #endif 291 #endif /* BITS_PER_UNIT == 16 */ 292 293 #endif /* BITS_PER_UNIT == 8 */ 294 295 #undef EXTRACT_MODULE_ID_FROM_GLOBAL_ID 296 #undef EXTRACT_FUNC_ID_FROM_GLOBAL_ID 297 #undef GEN_FUNC_GLOBAL_ID 298 #define EXTRACT_MODULE_ID_FROM_GLOBAL_ID(gid) \ 299 (gcov_unsigned_t)(((gid) >> FUNC_ID_WIDTH) & FUNC_ID_MASK) 300 #define EXTRACT_FUNC_ID_FROM_GLOBAL_ID(gid) \ 301 (gcov_unsigned_t)((gid) & FUNC_ID_MASK) 302 #define GEN_FUNC_GLOBAL_ID(m,f) ((((gcov_type) (m)) << FUNC_ID_WIDTH) | (f)) 303 304 305 #if defined (TARGET_POSIX_IO) 306 #define GCOV_LOCKED 1 307 #else 308 #define GCOV_LOCKED 0 309 #endif 310 311 #else /* !IN_LIBGCOV */ 312 /* About the host */ 313 314 typedef unsigned gcov_unsigned_t; 315 typedef unsigned gcov_position_t; 316 317 /* gcov_type is typedef'd elsewhere for the compiler */ 318 #if IN_GCOV 319 #define GCOV_LINKAGE static 320 typedef HOST_WIDEST_INT gcov_type; 321 #if IN_GCOV > 0 322 #include <sys/types.h> 323 #endif 324 325 #define FUNC_ID_WIDTH HOST_BITS_PER_WIDE_INT/2 326 #define FUNC_ID_MASK ((1L << FUNC_ID_WIDTH) - 1) 327 #define EXTRACT_MODULE_ID_FROM_GLOBAL_ID(gid) (unsigned)(((gid) >> FUNC_ID_WIDTH) & FUNC_ID_MASK) 328 #define EXTRACT_FUNC_ID_FROM_GLOBAL_ID(gid) (unsigned)((gid) & FUNC_ID_MASK) 329 #define FUNC_GLOBAL_ID(m,f) ((((HOST_WIDE_INT) (m)) << FUNC_ID_WIDTH) | (f) 330 331 #else /*!IN_GCOV */ 332 #define GCOV_TYPE_SIZE (LONG_LONG_TYPE_SIZE > 32 ? 64 : 32) 333 #endif 334 335 #if defined (HOST_HAS_F_SETLKW) 336 #define GCOV_LOCKED 1 337 #else 338 #define GCOV_LOCKED 0 339 #endif 340 341 #endif /* !IN_LIBGCOV */ 342 343 /* In gcov we want function linkage to be static. In the compiler we want 344 it extern, so that they can be accessed from elsewhere. In libgcov we 345 need these functions to be extern, so prefix them with __gcov. In 346 libgcov they must also be hidden so that the instance in the executable 347 is not also used in a DSO. */ 348 #if IN_LIBGCOV 349 350 #ifndef __GCOV_KERNEL__ 351 #include "tconfig.h" 352 #endif /* __GCOV_KERNEL__ */ 353 354 #define gcov_var __gcov_var 355 #define gcov_open __gcov_open 356 #define gcov_close __gcov_close 357 #define gcov_write_tag_length __gcov_write_tag_length 358 #define gcov_position __gcov_position 359 #define gcov_seek __gcov_seek 360 #define gcov_rewrite __gcov_rewrite 361 #define gcov_truncate __gcov_truncate 362 #define gcov_is_error __gcov_is_error 363 #define gcov_write_unsigned __gcov_write_unsigned 364 #define gcov_write_counter __gcov_write_counter 365 #define gcov_write_summary __gcov_write_summary 366 #define gcov_write_module_info __gcov_write_module_info 367 #define gcov_write_string __gcov_write_string 368 #define gcov_string_length __gcov_string_length 369 #define gcov_read_unsigned __gcov_read_unsigned 370 #define gcov_read_counter __gcov_read_counter 371 #define gcov_read_string __gcov_read_string 372 #define gcov_read_summary __gcov_read_summary 373 #define gcov_read_module_info __gcov_read_module_info 374 #define gcov_sort_n_vals __gcov_sort_n_vals 375 #define gcov_canonical_filename _gcov_canonical_filename 376 #define gcov_read_pmu_load_latency_info __gcov_read_pmu_load_latency_info 377 #define gcov_read_pmu_branch_mispredict_info __gcov_read_pmu_branch_mispredict_info 378 #define gcov_read_pmu_tool_header __gcov_read_pmu_tool_header 379 #define destroy_pmu_tool_header __destroy_pmu_tool_header 380 381 382 /* Poison these, so they don't accidentally slip in. */ 383 #pragma GCC poison gcov_write_tag gcov_write_length 384 #pragma GCC poison gcov_sync gcov_time gcov_magic 385 386 #ifdef HAVE_GAS_HIDDEN 387 #define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden"))) 388 #else 389 #define ATTRIBUTE_HIDDEN 390 #endif 391 392 #else 393 394 #define ATTRIBUTE_HIDDEN 395 396 #endif 397 398 #ifndef GCOV_LINKAGE 399 #define GCOV_LINKAGE extern 400 #endif 401 402 /* File suffixes. */ 403 #define GCOV_DATA_SUFFIX ".gcda" 404 #define GCOV_NOTE_SUFFIX ".gcno" 405 406 /* File magic. Must not be palindromes. */ 407 #define GCOV_DATA_MAGIC ((gcov_unsigned_t)0x67636461) /* "gcda" */ 408 #define GCOV_NOTE_MAGIC ((gcov_unsigned_t)0x67636e6f) /* "gcno" */ 409 410 /* gcov-iov.h is automatically generated by the makefile from 411 version.c, it looks like 412 #define GCOV_VERSION ((gcov_unsigned_t)0x89abcdef) 413 */ 414 #include "gcov-iov.h" 415 416 /* Convert a magic or version number to a 4 character string. */ 417 #define GCOV_UNSIGNED2STRING(ARRAY,VALUE) \ 418 ((ARRAY)[0] = (char)((VALUE) >> 24), \ 419 (ARRAY)[1] = (char)((VALUE) >> 16), \ 420 (ARRAY)[2] = (char)((VALUE) >> 8), \ 421 (ARRAY)[3] = (char)((VALUE) >> 0)) 422 423 /* The record tags. Values [1..3f] are for tags which may be in either 424 file. Values [41..9f] for those in the note file and [a1..ff] for 425 the data file. The tag value zero is used as an explicit end of 426 file marker -- it is not required to be present. */ 427 428 #define GCOV_TAG_FUNCTION ((gcov_unsigned_t)0x01000000) 429 #define GCOV_TAG_FUNCTION_LENGTH (3) 430 #define GCOV_TAG_BLOCKS ((gcov_unsigned_t)0x01410000) 431 #define GCOV_TAG_BLOCKS_LENGTH(NUM) (NUM) 432 #define GCOV_TAG_BLOCKS_NUM(LENGTH) (LENGTH) 433 #define GCOV_TAG_ARCS ((gcov_unsigned_t)0x01430000) 434 #define GCOV_TAG_ARCS_LENGTH(NUM) (1 + (NUM) * 2) 435 #define GCOV_TAG_ARCS_NUM(LENGTH) (((LENGTH) - 1) / 2) 436 #define GCOV_TAG_LINES ((gcov_unsigned_t)0x01450000) 437 #define GCOV_TAG_COUNTER_BASE ((gcov_unsigned_t)0x01a10000) 438 #define GCOV_TAG_COUNTER_LENGTH(NUM) ((NUM) * 2) 439 #define GCOV_TAG_COUNTER_NUM(LENGTH) ((LENGTH) / 2) 440 #define GCOV_TAG_OBJECT_SUMMARY ((gcov_unsigned_t)0xa1000000) 441 #define GCOV_TAG_PROGRAM_SUMMARY ((gcov_unsigned_t)0xa3000000) 442 #define GCOV_TAG_SUMMARY_LENGTH \ 443 (1 + GCOV_COUNTERS_SUMMABLE * (2 + 3 * 2)) 444 #define GCOV_TAG_MODULE_INFO ((gcov_unsigned_t)0xa4000000) 445 #define GCOV_TAG_PMU_LOAD_LATENCY_INFO ((gcov_unsigned_t)0xa5000000) 446 #define GCOV_TAG_PMU_LOAD_LATENCY_LENGTH(filename) \ 447 (gcov_string_length (filename) + 12 + 2) 448 #define GCOV_TAG_PMU_BRANCH_MISPREDICT_INFO ((gcov_unsigned_t)0xa7000000) 449 #define GCOV_TAG_PMU_BRANCH_MISPREDICT_LENGTH(filename) \ 450 (gcov_string_length (filename) + 5 + 2) 451 #define GCOV_TAG_PMU_TOOL_HEADER ((gcov_unsigned_t)0xa9000000) 452 453 /* Counters that are collected. */ 454 #define GCOV_COUNTER_ARCS 0 /* Arc transitions. */ 455 #define GCOV_COUNTERS_SUMMABLE 1 /* Counters which can be 456 summaried. */ 457 #define GCOV_FIRST_VALUE_COUNTER 1 /* The first of counters used for value 458 profiling. They must form a consecutive 459 interval and their order must match 460 the order of HIST_TYPEs in 461 value-prof.h. */ 462 #define GCOV_COUNTER_V_INTERVAL 1 /* Histogram of value inside an interval. */ 463 #define GCOV_COUNTER_V_POW2 2 /* Histogram of exact power2 logarithm 464 of a value. */ 465 #define GCOV_COUNTER_V_SINGLE 3 /* The most common value of expression. */ 466 #define GCOV_COUNTER_V_DELTA 4 /* The most common difference between 467 consecutive values of expression. */ 468 469 #define GCOV_COUNTER_V_INDIR 5 /* The most common indirect address */ 470 #define GCOV_COUNTER_AVERAGE 6 /* Compute average value passed to the 471 counter. */ 472 #define GCOV_COUNTER_IOR 7 /* IOR of the all values passed to 473 counter. */ 474 #define GCOV_COUNTER_ICALL_TOPNV 8 /* Top N value tracking for indirect calls */ 475 #define GCOV_LAST_VALUE_COUNTER 8 /* The last of counters used for value 476 profiling. */ 477 #define GCOV_COUNTER_DIRECT_CALL 9 /* Direct call counts. */ 478 #define GCOV_COUNTER_REUSE_DIST 10 /* Reuse distance measure. */ 479 #define GCOV_COUNTERS 11 480 481 /* Number of counters used for value profiling. */ 482 #define GCOV_N_VALUE_COUNTERS \ 483 (GCOV_LAST_VALUE_COUNTER - GCOV_FIRST_VALUE_COUNTER + 1) 484 485 /* A list of human readable names of the counters */ 486 #define GCOV_COUNTER_NAMES {"arcs", "interval", "pow2", "single", \ 487 "delta","indirect_call", "average", "ior", \ 488 "indirect_call_topn", "direct_call", \ 489 "reuse_distance"} 490 491 #define GCOV_ICALL_TOPN_VAL 2 /* Track two hottest callees */ 492 #define GCOV_ICALL_TOPN_NCOUNTS 9 /* The number of counter entries per icall callsite */ 493 /* Names of merge functions for counters. */ 494 #define GCOV_MERGE_FUNCTIONS {"__gcov_merge_add", \ 495 "__gcov_merge_add", \ 496 "__gcov_merge_add", \ 497 "__gcov_merge_single", \ 498 "__gcov_merge_delta", \ 499 "__gcov_merge_single", \ 500 "__gcov_merge_add", \ 501 "__gcov_merge_ior", \ 502 "__gcov_merge_icall_topn",\ 503 "__gcov_merge_dc",\ 504 "__gcov_merge_reusedist" } 505 506 /* Convert a counter index to a tag. */ 507 #define GCOV_TAG_FOR_COUNTER(COUNT) \ 508 (GCOV_TAG_COUNTER_BASE + ((gcov_unsigned_t)(COUNT) << 17)) 509 /* Convert a tag to a counter. */ 510 #define GCOV_COUNTER_FOR_TAG(TAG) \ 511 ((unsigned)(((TAG) - GCOV_TAG_COUNTER_BASE) >> 17)) 512 /* Check whether a tag is a counter tag. */ 513 #define GCOV_TAG_IS_COUNTER(TAG) \ 514 (!((TAG) & 0xFFFF) && GCOV_COUNTER_FOR_TAG (TAG) < GCOV_COUNTERS) 515 516 /* The tag level mask has 1's in the position of the inner levels, & 517 the lsb of the current level, and zero on the current and outer 518 levels. */ 519 #define GCOV_TAG_MASK(TAG) (((TAG) - 1) ^ (TAG)) 520 521 /* Return nonzero if SUB is an immediate subtag of TAG. */ 522 #define GCOV_TAG_IS_SUBTAG(TAG,SUB) \ 523 (GCOV_TAG_MASK (TAG) >> 8 == GCOV_TAG_MASK (SUB) \ 524 && !(((SUB) ^ (TAG)) & ~GCOV_TAG_MASK(TAG))) 525 526 /* Return nonzero if SUB is at a sublevel to TAG. */ 527 #define GCOV_TAG_IS_SUBLEVEL(TAG,SUB) \ 528 (GCOV_TAG_MASK (TAG) > GCOV_TAG_MASK (SUB)) 529 530 /* Basic block flags. */ 531 #define GCOV_BLOCK_UNEXPECTED (1 << 1) 532 533 /* Arc flags. */ 534 #define GCOV_ARC_ON_TREE (1 << 0) 535 #define GCOV_ARC_FAKE (1 << 1) 536 #define GCOV_ARC_FALLTHROUGH (1 << 2) 537 538 /* Structured records. */ 539 540 /* Cumulative counter data. */ 541 struct gcov_ctr_summary 542 { 543 gcov_unsigned_t num; /* number of counters. */ 544 gcov_unsigned_t runs; /* number of program runs */ 545 gcov_type sum_all; /* sum of all counters accumulated. */ 546 gcov_type run_max; /* maximum value on a single run. */ 547 gcov_type sum_max; /* sum of individual run max values. */ 548 }; 549 550 /* Object & program summary record. */ 551 struct gcov_summary 552 { 553 gcov_unsigned_t checksum; /* checksum of program */ 554 struct gcov_ctr_summary ctrs[GCOV_COUNTERS_SUMMABLE]; 555 }; 556 557 #define GCOV_MODULE_UNKNOWN_LANG 0 558 #define GCOV_MODULE_C_LANG 1 559 #define GCOV_MODULE_CPP_LANG 2 560 #define GCOV_MODULE_FORT_LANG 3 561 562 #define GCOV_MODULE_ASM_STMTS (1 << 16) 563 #define GCOV_MODULE_LANG_MASK 0xffff 564 565 enum print_newline {no_newline, add_newline}; 566 567 /* Source module info. The data structure is used in 568 both runtime and profile-use phase. Make sure to allocate 569 enough space for the variable length member. */ 570 struct gcov_module_info 571 { 572 gcov_unsigned_t ident; 573 gcov_unsigned_t is_primary; /* this is overloaded to mean two things: 574 (1) means FDO/LIPO in instrumented binary. 575 (2) means IS_PRIMARY in persistent file or 576 memory copy used in profile-use. */ 577 gcov_unsigned_t is_exported; 578 gcov_unsigned_t lang; /* lower 16 bits encode the language, and the upper 579 16 bits enocde other attributes, such as whether 580 any assembler is present in the source, etc. */ 581 char *da_filename; 582 char *source_filename; 583 gcov_unsigned_t num_quote_paths; 584 gcov_unsigned_t num_bracket_paths; 585 gcov_unsigned_t num_cpp_defines; 586 gcov_unsigned_t num_cpp_includes; 587 gcov_unsigned_t num_cl_args; 588 char *string_array[1]; 589 }; 590 591 extern struct gcov_module_info **module_infos; 592 extern unsigned primary_module_id; 593 #define PRIMARY_MODULE_EXPORTED \ 594 (module_infos[0]->is_exported \ 595 && !((module_infos[0]->lang & GCOV_MODULE_ASM_STMTS) \ 596 && flag_ripa_disallow_asm_modules)) 597 598 /* Information about the hardware performance monitoring unit. */ 599 struct gcov_pmu_info 600 { 601 const char *pmu_profile_filename; /* pmu profile filename */ 602 const char *pmu_tool; /* canonical pmu tool options */ 603 gcov_unsigned_t pmu_top_n_address; /* how many top addresses to symbolize */ 604 }; 605 606 /* Information about the PMU tool header. */ 607 typedef struct gcov_pmu_tool_header { 608 char *host_cpu; 609 char *hostname; 610 char *kernel_version; 611 char *column_header; 612 char *column_description; 613 char *full_header; 614 } gcov_pmu_tool_header_t; 615 616 /* Available only for PMUs which support PEBS or IBS using pfmon 617 tool. If any field here is changed, the length computation in 618 GCOV_TAG_PMU_LOAD_LATENCY_LENGTH must be updated as well. All 619 percentages are multiplied by 100 to make them out of 10000 and 620 only integer part is kept. */ 621 typedef struct gcov_pmu_load_latency_info 622 { 623 gcov_unsigned_t counts; /* raw count of samples */ 624 gcov_unsigned_t self; /* per 10k of total samples */ 625 gcov_unsigned_t cum; /* per 10k cumulative weight */ 626 gcov_unsigned_t lt_10; /* per 10k with latency <= 10 cycles */ 627 gcov_unsigned_t lt_32; /* per 10k with latency <= 32 cycles */ 628 gcov_unsigned_t lt_64; /* per 10k with latency <= 64 cycles */ 629 gcov_unsigned_t lt_256; /* per 10k with latency <= 256 cycles */ 630 gcov_unsigned_t lt_1024; /* per 10k with latency <= 1024 cycles */ 631 gcov_unsigned_t gt_1024; /* per 10k with latency > 1024 cycles */ 632 gcov_unsigned_t wself; /* weighted average cost of this miss in cycles */ 633 gcov_type code_addr; /* the actual miss address (pc+1 for Intel) */ 634 gcov_unsigned_t line; /* line number corresponding to this miss */ 635 gcov_unsigned_t discriminator; /* discriminator information for this miss */ 636 char *filename; /* filename corresponding to this miss */ 637 } gcov_pmu_ll_info_t; 638 639 /* This structure is used during runtime as well as in gcov. */ 640 typedef struct load_latency_infos 641 { 642 /* An array describing the total number of load latency fields. */ 643 gcov_pmu_ll_info_t **ll_array; 644 /* The total number of entries in the load latency array. */ 645 unsigned ll_count; 646 /* The total number of entries currently allocated in the array. 647 Used for bookkeeping. */ 648 unsigned alloc_ll_count; 649 /* PMU tool header */ 650 gcov_pmu_tool_header_t *pmu_tool_header; 651 } ll_infos_t; 652 653 /* Available only for PMUs which support PEBS or IBS using pfmon 654 tool. If any field here is changed, the length computation in 655 GCOV_TAG_PMU_BR_MISPREDICT_LENGTH must be updated as well. All 656 percentages are multiplied by 100 to make them out of 10000 and 657 only integer part is kept. */ 658 typedef struct gcov_pmu_branch_mispredict_info 659 { 660 gcov_unsigned_t counts; /* raw count of samples */ 661 gcov_unsigned_t self; /* per 10k of total samples */ 662 gcov_unsigned_t cum; /* per 10k cumulative weight */ 663 gcov_type code_addr; /* the actual mispredict address */ 664 gcov_unsigned_t line; /* line number corresponding to this event */ 665 gcov_unsigned_t discriminator; /* discriminator for this event */ 666 char *filename; /* filename corresponding to this event */ 667 } gcov_pmu_brm_info_t; 668 669 /* This structure is used during runtime as well as in gcov. */ 670 typedef struct branch_mispredict_infos 671 { 672 /* An array describing the total number of mispredict entries. */ 673 gcov_pmu_brm_info_t **brm_array; 674 /* The total number of entries in the above array. */ 675 unsigned brm_count; 676 /* The total number of entries currently allocated in the array. 677 Used for bookkeeping. */ 678 unsigned alloc_brm_count; 679 /* PMU tool header */ 680 gcov_pmu_tool_header_t *pmu_tool_header; 681 } brm_infos_t; 682 683 /* Structures embedded in coveraged program. The structures generated 684 by write_profile must match these. */ 685 686 #if IN_LIBGCOV 687 /* Information about a single function. This uses the trailing array 688 idiom. The number of counters is determined from the counter_mask 689 in gcov_info. We hold an array of function info, so have to 690 explicitly calculate the correct array stride. */ 691 692 struct gcov_fn_info 693 { 694 gcov_unsigned_t ident; /* unique ident of function */ 695 gcov_unsigned_t lineno_checksum; /* function lineo_checksum */ 696 gcov_unsigned_t cfg_checksum; /* function cfg checksum */ 697 gcov_unsigned_t dc_offset; /* direct call offset */ 698 unsigned n_ctrs[0]; /* instrumented counters */ 699 }; 700 701 /* Type of function used to merge counters. */ 702 typedef void (*gcov_merge_fn) (gcov_type *, gcov_unsigned_t); 703 704 /* Information about counters. */ 705 struct gcov_ctr_info 706 { 707 gcov_unsigned_t num; /* number of counters. */ 708 gcov_type *values; /* their values. */ 709 gcov_merge_fn merge; /* The function used to merge them. */ 710 }; 711 712 /* Information about a single object file. */ 713 struct gcov_info 714 { 715 gcov_unsigned_t version; /* expected version number */ 716 struct gcov_module_info *mod_info; /* addtional module info. */ 717 struct gcov_info *next; /* link to next, used by libgcov */ 718 719 gcov_unsigned_t stamp; /* uniquifying time stamp */ 720 const char *filename; /* output file name */ 721 gcov_unsigned_t eof_pos; /* end position of profile data */ 722 unsigned n_functions; /* number of functions */ 723 const struct gcov_fn_info *functions; /* table of functions */ 724 725 unsigned ctr_mask; /* mask of counters instrumented. */ 726 struct gcov_ctr_info counts[0]; /* count data. The number of bits 727 set in the ctr_mask field 728 determines how big this array 729 is. */ 730 }; 731 732 /* Information about a single imported module. */ 733 struct dyn_imp_mod 734 { 735 const struct gcov_info *imp_mod; 736 double weight; 737 }; 738 739 /* Register a new object file module. */ 740 extern void __gcov_init (struct gcov_info *) ATTRIBUTE_HIDDEN; 741 742 /* Called before fork, to avoid double counting. */ 743 extern void __gcov_flush (void) ATTRIBUTE_HIDDEN; 744 745 /* The merge function that just sums the counters. */ 746 extern void __gcov_merge_add (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; 747 748 /* The merge function to choose the most common value. */ 749 extern void __gcov_merge_single (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; 750 751 /* The merge function to choose the most common difference between 752 consecutive values. */ 753 extern void __gcov_merge_delta (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; 754 755 /* The merge function that just ors the counters together. */ 756 extern void __gcov_merge_ior (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; 757 758 /* The merge function used for direct call counters. */ 759 extern void __gcov_merge_dc (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; 760 761 /* The merge function used for reuse distance counters. */ 762 extern void __gcov_merge_reusedist (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; 763 764 /* The merge function used for indirect call counters. */ 765 extern void __gcov_merge_icall_topn (gcov_type *, unsigned) ATTRIBUTE_HIDDEN; 766 767 /* The profiler functions. */ 768 extern void __gcov_interval_profiler (gcov_type *, gcov_type, int, unsigned); 769 extern void __gcov_pow2_profiler (gcov_type *, gcov_type); 770 extern void __gcov_one_value_profiler (gcov_type *, gcov_type); 771 extern void __gcov_indirect_call_profiler (gcov_type *, gcov_type, void *, void *); 772 extern void __gcov_indirect_call_topn_profiler (void *, void *, gcov_unsigned_t) ATTRIBUTE_HIDDEN; 773 extern void __gcov_direct_call_profiler (void *, void *, gcov_unsigned_t) ATTRIBUTE_HIDDEN; 774 extern void __gcov_average_profiler (gcov_type *, gcov_type); 775 extern void __gcov_ior_profiler (gcov_type *, gcov_type); 776 extern void __gcov_sort_n_vals (gcov_type *value_array, int n); 777 778 /* Initialize/start/stop/dump performance monitoring unit (PMU) profile */ 779 void __gcov_init_pmu_profiler (struct gcov_pmu_info *) ATTRIBUTE_HIDDEN; 780 void __gcov_start_pmu_profiler (void) ATTRIBUTE_HIDDEN; 781 void __gcov_stop_pmu_profiler (void) ATTRIBUTE_HIDDEN; 782 void __gcov_end_pmu_profiler (int gcda_error) ATTRIBUTE_HIDDEN; 783 784 #ifndef inhibit_libc 785 /* The wrappers around some library functions.. */ 786 extern pid_t __gcov_fork (void) ATTRIBUTE_HIDDEN; 787 extern int __gcov_execl (const char *, char *, ...) ATTRIBUTE_HIDDEN; 788 extern int __gcov_execlp (const char *, char *, ...) ATTRIBUTE_HIDDEN; 789 extern int __gcov_execle (const char *, char *, ...) ATTRIBUTE_HIDDEN; 790 extern int __gcov_execv (const char *, char *const []) ATTRIBUTE_HIDDEN; 791 extern int __gcov_execvp (const char *, char *const []) ATTRIBUTE_HIDDEN; 792 extern int __gcov_execve (const char *, char *const [], char *const []) 793 ATTRIBUTE_HIDDEN; 794 #endif 795 796 #endif /* IN_LIBGCOV */ 797 798 #if IN_LIBGCOV >= 0 799 800 /* Optimum number of gcov_unsigned_t's read from or written to disk. */ 801 #define GCOV_BLOCK_SIZE (1 << 10) 802 803 struct gcov_var 804 { 805 _GCOV_FILE *file; 806 gcov_position_t start; /* Position of first byte of block */ 807 unsigned offset; /* Read/write position within the block. */ 808 unsigned length; /* Read limit in the block. */ 809 unsigned overread; /* Number of words overread. */ 810 int error; /* < 0 overflow, > 0 disk error. */ 811 int mode; /* < 0 writing, > 0 reading */ 812 #if IN_LIBGCOV 813 /* Holds one block plus 4 bytes, thus all coverage reads & writes 814 fit within this buffer and we always can transfer GCOV_BLOCK_SIZE 815 to and from the disk. libgcov never backtracks and only writes 4 816 or 8 byte objects. */ 817 gcov_unsigned_t buffer[GCOV_BLOCK_SIZE + 1]; 818 #else 819 int endian; /* Swap endianness. */ 820 /* Holds a variable length block, as the compiler can write 821 strings and needs to backtrack. */ 822 size_t alloc; 823 gcov_unsigned_t *buffer; 824 #endif 825 }; 826 827 /* In kernel mode, move gcov_var definition to gcov-io.c 828 to avoid dulipcate definitions. */ 829 #ifndef __GCOV_KERNEL__ 830 GCOV_LINKAGE struct gcov_var gcov_var ATTRIBUTE_HIDDEN; 831 #else 832 extern struct gcov_var gcov_var; 833 #endif 834 835 /* Functions for reading and writing gcov files. In libgcov you can 836 open the file for reading then writing. Elsewhere you can open the 837 file either for reading or for writing. When reading a file you may 838 use the gcov_read_* functions, gcov_sync, gcov_position, & 839 gcov_error. When writing a file you may use the gcov_write 840 functions, gcov_seek & gcov_error. When a file is to be rewritten 841 you use the functions for reading, then gcov_rewrite then the 842 functions for writing. Your file may become corrupted if you break 843 these invariants. */ 844 #if IN_LIBGCOV 845 GCOV_LINKAGE int gcov_open (const char */*name*/) ATTRIBUTE_HIDDEN; 846 #else 847 GCOV_LINKAGE int gcov_open (const char */*name*/, int /*direction*/); 848 GCOV_LINKAGE int gcov_magic (gcov_unsigned_t, gcov_unsigned_t); 849 #endif 850 GCOV_LINKAGE int gcov_close (void) ATTRIBUTE_HIDDEN; 851 852 /* Available everywhere. */ 853 static gcov_position_t gcov_position (void); 854 static int gcov_is_error (void); 855 856 GCOV_LINKAGE const char *gcov_read_string (void) ATTRIBUTE_HIDDEN; 857 GCOV_LINKAGE gcov_unsigned_t gcov_read_unsigned (void) ATTRIBUTE_HIDDEN; 858 GCOV_LINKAGE gcov_type gcov_read_counter (void) ATTRIBUTE_HIDDEN; 859 GCOV_LINKAGE void gcov_read_summary (struct gcov_summary *) ATTRIBUTE_HIDDEN; 860 GCOV_LINKAGE char *gcov_canonical_filename (char *filename) ATTRIBUTE_HIDDEN; 861 GCOV_LINKAGE void 862 gcov_read_pmu_load_latency_info (gcov_pmu_ll_info_t *ll_info, 863 gcov_unsigned_t len) ATTRIBUTE_HIDDEN; 864 GCOV_LINKAGE void 865 gcov_read_pmu_branch_mispredict_info (gcov_pmu_brm_info_t *brm_info, 866 gcov_unsigned_t len) ATTRIBUTE_HIDDEN; 867 GCOV_LINKAGE void 868 gcov_read_pmu_tool_header (gcov_pmu_tool_header_t *tool_header, 869 gcov_unsigned_t len) ATTRIBUTE_HIDDEN; 870 #ifndef __GCOV_KERNEL__ 871 GCOV_LINKAGE float convert_unsigned_to_pct ( 872 const unsigned number) ATTRIBUTE_HIDDEN; 873 #endif /* __GCOV_KERNEL__ */ 874 875 #if !IN_LIBGCOV && IN_GCOV != 1 876 GCOV_LINKAGE void gcov_read_module_info (struct gcov_module_info *mod_info, 877 gcov_unsigned_t len) ATTRIBUTE_HIDDEN; 878 GCOV_LINKAGE void print_load_latency_line (FILE *fp, 879 const gcov_pmu_ll_info_t *ll_info, 880 const enum print_newline); 881 GCOV_LINKAGE void 882 print_branch_mispredict_line (FILE *fp, const gcov_pmu_brm_info_t *brm_info, 883 const enum print_newline); 884 GCOV_LINKAGE void print_pmu_tool_header (FILE *fp, 885 gcov_pmu_tool_header_t *tool_header, 886 const enum print_newline); 887 #endif 888 889 #if IN_GCOV != 1 890 GCOV_LINKAGE void destroy_pmu_tool_header (gcov_pmu_tool_header_t *tool_header) 891 ATTRIBUTE_HIDDEN; 892 #endif 893 894 #if IN_LIBGCOV 895 /* Available only in libgcov */ 896 GCOV_LINKAGE void gcov_write_counter (gcov_type) ATTRIBUTE_HIDDEN; 897 GCOV_LINKAGE void gcov_write_tag_length (gcov_unsigned_t, gcov_unsigned_t) 898 ATTRIBUTE_HIDDEN; 899 GCOV_LINKAGE void gcov_write_summary (gcov_unsigned_t /*tag*/, 900 const struct gcov_summary *) 901 ATTRIBUTE_HIDDEN; 902 903 GCOV_LINKAGE void gcov_write_module_infos (struct gcov_info *mod_info) 904 ATTRIBUTE_HIDDEN; 905 GCOV_LINKAGE const struct dyn_imp_mod ** 906 gcov_get_sorted_import_module_array (struct gcov_info *mod_info, unsigned *len) 907 ATTRIBUTE_HIDDEN; 908 static void gcov_rewrite (void); 909 GCOV_LINKAGE void gcov_seek (gcov_position_t /*position*/) ATTRIBUTE_HIDDEN; 910 GCOV_LINKAGE void gcov_truncate (void) ATTRIBUTE_HIDDEN; 911 GCOV_LINKAGE gcov_unsigned_t gcov_string_length (const char *) ATTRIBUTE_HIDDEN; 912 GCOV_LINKAGE unsigned gcov_gcda_file_size (struct gcov_info *); 913 #else 914 /* Available outside libgcov */ 915 GCOV_LINKAGE void gcov_sync (gcov_position_t /*base*/, 916 gcov_unsigned_t /*length */); 917 #endif 918 919 #if !IN_GCOV 920 /* Available outside gcov */ 921 GCOV_LINKAGE void gcov_write_unsigned (gcov_unsigned_t) ATTRIBUTE_HIDDEN; 922 GCOV_LINKAGE void gcov_write_string (const char *) ATTRIBUTE_HIDDEN; 923 #endif 924 925 #if !IN_GCOV && !IN_LIBGCOV 926 /* Available only in compiler */ 927 GCOV_LINKAGE gcov_position_t gcov_write_tag (gcov_unsigned_t); 928 GCOV_LINKAGE void gcov_write_length (gcov_position_t /*position*/); 929 #endif 930 931 #if IN_GCOV > 0 932 /* Available in gcov */ 933 GCOV_LINKAGE time_t gcov_time (void); 934 #endif 935 936 /* Save the current position in the gcov file. */ 937 938 static inline gcov_position_t 939 gcov_position (void) 940 { 941 return gcov_var.start + gcov_var.offset; 942 } 943 944 /* Return nonzero if the error flag is set. */ 945 946 static inline int 947 gcov_is_error (void) 948 { 949 return gcov_var.file ? gcov_var.error : 1; 950 } 951 952 #if IN_LIBGCOV 953 /* Move to beginning of file and initialize for writing. */ 954 955 static inline void 956 gcov_rewrite (void) 957 { 958 gcc_assert (gcov_var.mode > 0); 959 gcov_var.mode = -1; 960 gcov_var.start = 0; 961 gcov_var.offset = 0; 962 _GCOV_fseek (gcov_var.file, 0L, SEEK_SET); 963 } 964 #endif 965 966 #endif /* IN_LIBGCOV >= 0 */ 967 968 #endif /* GCC_GCOV_IO_H */ 969