| /*===- InstrProfilingMergeFile.c - Profile in-process Merging ------------===*\ |
| |* |
| |* The LLVM Compiler Infrastructure |
| |* |
| |* This file is distributed under the University of Illinois Open Source |
| |* License. See LICENSE.TXT for details. |
| |* |
| |*===----------------------------------------------------------------------=== |
| |* This file defines APIs needed to support in-process merging for profile data |
| |* stored in files. |
| \*===----------------------------------------------------------------------===*/ |
| |
| #include "InstrProfiling.h" |
| #include "InstrProfilingInternal.h" |
| #include "InstrProfilingUtil.h" |
| |
| #define INSTR_PROF_VALUE_PROF_DATA |
| #include "InstrProfData.inc" |
| |
| void (*VPMergeHook)(ValueProfData *, |
| __llvm_profile_data *) = &lprofMergeValueProfData; |
| |
| /* Merge value profile data pointed to by SrcValueProfData into |
| * in-memory profile counters pointed by to DstData. */ |
| void lprofMergeValueProfData(ValueProfData *SrcValueProfData, |
| __llvm_profile_data *DstData) { |
| unsigned I, S, V, C; |
| InstrProfValueData *VData; |
| ValueProfRecord *VR = getFirstValueProfRecord(SrcValueProfData); |
| for (I = 0; I < SrcValueProfData->NumValueKinds; I++) { |
| VData = getValueProfRecordValueData(VR); |
| for (S = 0; S < VR->NumValueSites; S++) { |
| uint8_t NV = VR->SiteCountArray[S]; |
| for (V = 0; V < NV; V++) { |
| for (C = 0; C < VData[V].Count; C++) |
| __llvm_profile_instrument_target(VData[V].Value, DstData, S); |
| } |
| } |
| VR = getValueProfRecordNext(VR); |
| } |
| } |