12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/*===- InstrProfiling.c - Support library for PGO instrumentation ---------===*\ 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|* 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|* The LLVM Compiler Infrastructure 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|* 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|* This file is distributed under the University of Illinois Open Source 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|* License. See LICENSE.TXT for details. 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|* 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines\*===----------------------------------------------------------------------===*/ 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "InstrProfiling.h" 113d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#include "InstrProfilingInternal.h" 123d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#include <limits.h> 133d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#include <stdio.h> 143d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#include <stdlib.h> 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <string.h> 163d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#define INSTR_PROF_VALUE_PROF_DATA 173d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#include "InstrProfData.inc" 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 193d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainarchar *(*GetEnvHook)(const char *) = 0; 203d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 213d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarCOMPILER_RT_VISIBILITY uint64_t __llvm_profile_get_magic(void) { 223d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return sizeof(void *) == sizeof(uint64_t) ? (INSTR_PROF_RAW_MAGIC_64) 233d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar : (INSTR_PROF_RAW_MAGIC_32); 243d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar} 253d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 263d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar/* Return the number of bytes needed to add to SizeInBytes to make it 273d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar * the result a multiple of 8. 283d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar */ 293d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarCOMPILER_RT_VISIBILITY uint8_t 303d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar__llvm_profile_get_num_padding_bytes(uint64_t SizeInBytes) { 313d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return 7 & (sizeof(uint64_t) - SizeInBytes % sizeof(uint64_t)); 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 343d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarCOMPILER_RT_VISIBILITY uint64_t __llvm_profile_get_version(void) { 353d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar return INSTR_PROF_RAW_VERSION; 362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 383d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarCOMPILER_RT_VISIBILITY void __llvm_profile_reset_counters(void) { 396d1862363c88c183b0ed7740fca876342cf0474bStephen Hines uint64_t *I = __llvm_profile_begin_counters(); 406d1862363c88c183b0ed7740fca876342cf0474bStephen Hines uint64_t *E = __llvm_profile_end_counters(); 412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 423d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar memset(I, 0, sizeof(uint64_t) * (E - I)); 433d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 443d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar const __llvm_profile_data *DataBegin = __llvm_profile_begin_data(); 453d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar const __llvm_profile_data *DataEnd = __llvm_profile_end_data(); 463d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar const __llvm_profile_data *DI; 473d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar for (DI = DataBegin; DI != DataEnd; ++DI) { 483d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar uint64_t CurrentVSiteCount = 0; 493d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar uint32_t VKI, i; 503d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar if (!DI->Values) 513d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar continue; 523d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 533d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar ValueProfNode **ValueCounters = (ValueProfNode **)DI->Values; 543d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 553d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar for (VKI = IPVK_First; VKI <= IPVK_Last; ++VKI) 563d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar CurrentVSiteCount += DI->NumValueSites[VKI]; 573d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 583d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar for (i = 0; i < CurrentVSiteCount; ++i) { 593d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar ValueProfNode *CurrentVNode = ValueCounters[i]; 603d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 613d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar while (CurrentVNode) { 623d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar CurrentVNode->VData.Count = 0; 633d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar CurrentVNode = CurrentVNode->Next; 643d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar } 653d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar } 663d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar } 672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 683d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar 69