1c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/*===-- InstrProfData.inc - instr profiling runtime structures -*- C++ -*-=== *\
2799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar|*
3799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar|*                     The LLVM Compiler Infrastructure
4799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar|*
5799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar|* This file is distributed under the University of Illinois Open Source
6799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar|* License. See LICENSE.TXT for details.
7799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar|*
8799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar\*===----------------------------------------------------------------------===*/
9799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/*
10799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * This is the master file that defines all the data structure, signature,
11799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * constant literals that are shared across profiling runtime library,
12799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * compiler (instrumentation), and host tools (reader/writer). The entities
13799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * defined in this file affect the profile runtime ABI, the raw profile format,
14799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * or both.
15799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *
16799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * The file has two identical copies. The master copy lives in LLVM and
17799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * the other one  sits in compiler-rt/lib/profile directory. To make changes
18799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * in this file, first modify the master copy and copy it over to compiler-rt.
19799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * Testing of any change in this file can start only after the two copies are
20799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * synced up.
21799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *
22799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * The first part of the file includes macros that defines types, names, and
23799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * initializers for the member fields of the core data structures. The field
24799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * declarations for one structure is enabled by defining the field activation
25799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * macro associated with that structure. Only one field activation record
26799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * can be defined at one time and the rest definitions will be filtered out by
27799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * the preprocessor.
28799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *
29799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * Examples of how the template is used to instantiate structure definition:
30799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * 1. To declare a structure:
31c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar *
32799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * struct ProfData {
33799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
34799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *    Type Name;
35799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * #include "llvm/ProfileData/InstrProfData.inc"
36799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * };
37799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *
38799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * 2. To construct LLVM type arrays for the struct type:
39799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *
40799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * Type *DataTypes[] = {
41799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
42799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *   LLVMType,
43799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * #include "llvm/ProfileData/InstrProfData.inc"
44799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * };
45799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *
46799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * 4. To construct constant array for the initializers:
47799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
48799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *   Initializer,
49799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * Constant *ConstantVals[] = {
50799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * #include "llvm/ProfileData/InstrProfData.inc"
51799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * };
52799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *
53799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *
54799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * The second part of the file includes definitions all other entities that
55799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * are related to runtime ABI and format. When no field activation macro is
56799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * defined, this file can be included to introduce the definitions.
57799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *
58799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar\*===----------------------------------------------------------------------===*/
59799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
60c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* Functions marked with INSTR_PROF_VISIBILITY must have hidden visibility in
61c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * the compiler runtime. */
62c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#ifndef INSTR_PROF_VISIBILITY
63c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_VISIBILITY
64c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif
65c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
66799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* INSTR_PROF_DATA start. */
67799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* Definition of member fields of the per-function control structure. */
68799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifndef INSTR_PROF_DATA
69799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer)
70799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else
71799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_DATA_DEFINED
72799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
73c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_DATA(const uint64_t, llvm::Type::getInt64Ty(Ctx), NameRef, \
74c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                ConstantInt::get(llvm::Type::getInt64Ty(Ctx), \
75c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar		IndexedInstrProf::ComputeHash(getPGOFuncNameVarInitializer(Inc->getName()))))
76799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_DATA(const uint64_t, llvm::Type::getInt64Ty(Ctx), FuncHash, \
77799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                ConstantInt::get(llvm::Type::getInt64Ty(Ctx), \
78799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                Inc->getHash()->getZExtValue()))
79799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_DATA(const IntPtrT, llvm::Type::getInt64PtrTy(Ctx), CounterPtr, \
80799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                ConstantExpr::getBitCast(CounterPtr, \
81799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                llvm::Type::getInt64PtrTy(Ctx)))
82c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* This is used to map function pointers for the indirect call targets to
83c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * function name hashes during the conversion from raw to merged profile
84c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * data.
85c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar */
86799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_DATA(const IntPtrT, llvm::Type::getInt8PtrTy(Ctx), FunctionPointer, \
87799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                FunctionAddr)
88799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_DATA(IntPtrT, llvm::Type::getInt8PtrTy(Ctx), Values, \
89c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                ValuesPtrExpr)
90c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_DATA(const uint32_t, llvm::Type::getInt32Ty(Ctx), NumCounters, \
91c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                ConstantInt::get(llvm::Type::getInt32Ty(Ctx), NumCounters))
92799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_DATA(const uint16_t, Int16ArrayTy, NumValueSites[IPVK_Last+1], \
93799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                ConstantArray::get(Int16ArrayTy, Int16ArrayVals))
94799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#undef INSTR_PROF_DATA
95799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* INSTR_PROF_DATA end. */
96799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
97c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
98c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* This is an internal data structure used by value profiler. It
99c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * is defined here to allow serialization code sharing by LLVM
100c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * to be used in unit test.
101c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar *
102c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * typedef struct ValueProfNode {
103c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar *   // InstrProfValueData VData;
104c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar *   uint64_t Value;
105c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar *   uint64_t Count;
106c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar *   struct ValueProfNode *Next;
107c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * } ValueProfNode;
108c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar */
109c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* INSTR_PROF_VALUE_NODE start. */
110c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#ifndef INSTR_PROF_VALUE_NODE
111c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Initializer)
112c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#else
113c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_DATA_DEFINED
114c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif
115c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VALUE_NODE(uint64_t, llvm::Type::getInt64Ty(Ctx), Value, \
116c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                      ConstantInt::get(llvm::Type::GetInt64Ty(Ctx), 0))
117c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VALUE_NODE(uint64_t, llvm::Type::getInt64Ty(Ctx), Count, \
118c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                      ConstantInt::get(llvm::Type::GetInt64Ty(Ctx), 0))
119c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VALUE_NODE(PtrToNodeT, llvm::Type::getInt8PtrTy(Ctx), Next, \
120c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                      ConstantInt::get(llvm::Type::GetInt8PtrTy(Ctx), 0))
121c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#undef INSTR_PROF_VALUE_NODE
122c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* INSTR_PROF_VALUE_NODE end. */
123c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
124799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* INSTR_PROF_RAW_HEADER  start */
125799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* Definition of member fields of the raw profile header data structure. */
126799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifndef INSTR_PROF_RAW_HEADER
127799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_RAW_HEADER(Type, Name, Initializer)
128799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else
129799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_DATA_DEFINED
130799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
131799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_RAW_HEADER(uint64_t, Magic, __llvm_profile_get_magic())
132799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_RAW_HEADER(uint64_t, Version, __llvm_profile_get_version())
133799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_RAW_HEADER(uint64_t, DataSize, DataSize)
134799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_RAW_HEADER(uint64_t, CountersSize, CountersSize)
135799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_RAW_HEADER(uint64_t, NamesSize,  NamesSize)
136799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_RAW_HEADER(uint64_t, CountersDelta, (uintptr_t)CountersBegin)
137799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_RAW_HEADER(uint64_t, NamesDelta, (uintptr_t)NamesBegin)
138799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarINSTR_PROF_RAW_HEADER(uint64_t, ValueKindLast, IPVK_Last)
139799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#undef INSTR_PROF_RAW_HEADER
140799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* INSTR_PROF_RAW_HEADER  end */
141799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
142799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* VALUE_PROF_FUNC_PARAM start */
143799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* Definition of parameter types of the runtime API used to do value profiling
144799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * for a given value site.
145799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
146799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifndef VALUE_PROF_FUNC_PARAM
147799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define VALUE_PROF_FUNC_PARAM(ArgType, ArgName, ArgLLVMType)
148799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_COMMA
149799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else
150799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_DATA_DEFINED
151799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_COMMA ,
152799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
153799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarVALUE_PROF_FUNC_PARAM(uint64_t, TargetValue, Type::getInt64Ty(Ctx)) \
154799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                      INSTR_PROF_COMMA
155799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarVALUE_PROF_FUNC_PARAM(void *, Data, Type::getInt8PtrTy(Ctx)) INSTR_PROF_COMMA
156799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarVALUE_PROF_FUNC_PARAM(uint32_t, CounterIndex, Type::getInt32Ty(Ctx))
157799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#undef VALUE_PROF_FUNC_PARAM
158799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#undef INSTR_PROF_COMMA
159799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* VALUE_PROF_FUNC_PARAM end */
160799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
161799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* VALUE_PROF_KIND start */
162799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifndef VALUE_PROF_KIND
163799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define VALUE_PROF_KIND(Enumerator, Value)
164799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else
165799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_DATA_DEFINED
166799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
167c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* For indirect function call value profiling, the addresses of the target
168c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * functions are profiled by the instrumented code. The target addresses are
169c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * written in the raw profile data and converted to target function name's MD5
170c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * hash by the profile reader during deserialization.  Typically, this happens
171c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * when the the raw profile data is read during profile merging.
172c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar *
173c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * For this remapping the ProfData is used.  ProfData contains both the function
174c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * name hash and the function address.
175c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar */
176799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarVALUE_PROF_KIND(IPVK_IndirectCallTarget, 0)
177799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* These two kinds must be the last to be
178799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * declared. This is to make sure the string
179799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * array created with the template can be
180799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * indexed with the kind value.
181799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
182799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarVALUE_PROF_KIND(IPVK_First, IPVK_IndirectCallTarget)
183799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarVALUE_PROF_KIND(IPVK_Last, IPVK_IndirectCallTarget)
184799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
185799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#undef VALUE_PROF_KIND
186799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* VALUE_PROF_KIND end */
187799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
188799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* COVMAP_FUNC_RECORD start */
189799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* Definition of member fields of the function record structure in coverage
190799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * map.
191799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
192799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifndef COVMAP_FUNC_RECORD
193799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define COVMAP_FUNC_RECORD(Type, LLVMType, Name, Initializer)
194799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else
195799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_DATA_DEFINED
196799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
197c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#ifdef COVMAP_V1
198799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarCOVMAP_FUNC_RECORD(const IntPtrT, llvm::Type::getInt8PtrTy(Ctx), \
199799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                   NamePtr, llvm::ConstantExpr::getBitCast(NamePtr, \
200c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                   llvm::Type::getInt8PtrTy(Ctx)))
201799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarCOVMAP_FUNC_RECORD(const uint32_t, llvm::Type::getInt32Ty(Ctx), NameSize, \
202c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                   llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx), \
203799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                   NameValue.size()))
204c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#else
205c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarCOVMAP_FUNC_RECORD(const int64_t, llvm::Type::getInt64Ty(Ctx), NameRef, \
206c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                   llvm::ConstantInt::get(llvm::Type::getInt64Ty(Ctx), \
207c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar	           llvm::IndexedInstrProf::ComputeHash(NameValue)))
208c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif
209799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarCOVMAP_FUNC_RECORD(const uint32_t, llvm::Type::getInt32Ty(Ctx), DataSize, \
210799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                   llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx),\
211799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                   CoverageMapping.size()))
212799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarCOVMAP_FUNC_RECORD(const uint64_t, llvm::Type::getInt64Ty(Ctx), FuncHash, \
213799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                   llvm::ConstantInt::get(llvm::Type::getInt64Ty(Ctx), FuncHash))
214799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#undef COVMAP_FUNC_RECORD
215799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* COVMAP_FUNC_RECORD end.  */
216799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
217c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* COVMAP_HEADER start */
218c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* Definition of member fields of coverage map header.
219c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar */
220c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#ifndef COVMAP_HEADER
221c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define COVMAP_HEADER(Type, LLVMType, Name, Initializer)
222c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#else
223c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_DATA_DEFINED
224c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif
225c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarCOVMAP_HEADER(uint32_t, Int32Ty, NRecords, \
226c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar              llvm::ConstantInt::get(Int32Ty,  FunctionRecords.size()))
227c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarCOVMAP_HEADER(uint32_t, Int32Ty, FilenamesSize, \
228c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar              llvm::ConstantInt::get(Int32Ty, FilenamesSize))
229c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarCOVMAP_HEADER(uint32_t, Int32Ty, CoverageSize, \
230c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar              llvm::ConstantInt::get(Int32Ty, CoverageMappingSize))
231c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarCOVMAP_HEADER(uint32_t, Int32Ty, Version, \
232c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar              llvm::ConstantInt::get(Int32Ty, CovMapVersion::CurrentVersion))
233c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#undef COVMAP_HEADER
234c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* COVMAP_HEADER end.  */
235c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
236799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
237799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef INSTR_PROF_VALUE_PROF_DATA
238799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_DATA_DEFINED
239799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
240c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_MAX_NUM_VAL_PER_SITE 255
241c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/*!
242799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * This is the header of the data structure that defines the on-disk
243799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * layout of the value profile data of a particular kind for one function.
244799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
245799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct ValueProfRecord {
246799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /* The kind of the value profile record. */
247799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t Kind;
248799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*
249799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * The number of value profile sites. It is guaranteed to be non-zero;
250799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * otherwise the record for this kind won't be emitted.
251799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
252799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t NumValueSites;
253c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /*
254799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * The first element of the array that stores the number of profiled
255799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * values for each value site. The size of the array is NumValueSites.
256799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Since NumValueSites is greater than zero, there is at least one
257799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * element in the array.
258799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
259799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint8_t SiteCountArray[1];
260799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
261799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*
262799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * The fake declaration is for documentation purpose only.
263799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Align the start of next field to be on 8 byte boundaries.
264799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint8_t Padding[X];
265799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
266799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
267799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /* The array of value profile data. The size of the array is the sum
268799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * of all elements in SiteCountArray[].
269799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  InstrProfValueData ValueData[];
270799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
271799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
272799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef __cplusplus
273799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*!
274799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * \brief Return the number of value sites.
275799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
276799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t getNumValueSites() const { return NumValueSites; }
277c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /*!
278799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * \brief Read data from this record and save it to Record.
279799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
280799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  void deserializeTo(InstrProfRecord &Record,
281799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                     InstrProfRecord::ValueMapType *VMap);
282799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*
283799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * In-place byte swap:
284799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Do byte swap for this instance. \c Old is the original order before
285799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * the swap, and \c New is the New byte order.
286799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
287799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  void swapBytes(support::endianness Old, support::endianness New);
288799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
289799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar} ValueProfRecord;
290799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
291799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/*!
292799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * Per-function header/control data structure for value profiling
293799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * data in indexed format.
294799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
295799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct ValueProfData {
296799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*
297799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Total size in bytes including this field. It must be a multiple
298c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar   * of sizeof(uint64_t).
299799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
300799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t TotalSize;
301c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /*
302799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   *The number of value profile kinds that has value profile data.
303799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * In this implementation, a value profile kind is considered to
304799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * have profile data if the number of value profile sites for the
305799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * kind is not zero. More aggressively, the implementation can
306799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * choose to check the actual data value: if none of the value sites
307799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * has any profiled values, the kind can be skipped.
308799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
309799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t NumValueKinds;
310799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
311c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /*
312799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Following are a sequence of variable length records. The prefix/header
313799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * of each record is defined by ValueProfRecord type. The number of
314799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * records is NumValueKinds.
315799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * ValueProfRecord Record_1;
316799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * ValueProfRecord Record_N;
317799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
318799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
319799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#if __cplusplus
320799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*!
321799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Return the total size in bytes of the on-disk value profile data
322799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * given the data stored in Record.
323799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
324799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  static uint32_t getSize(const InstrProfRecord &Record);
325799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*!
326799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Return a pointer to \c ValueProfData instance ready to be streamed.
327799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
328799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  static std::unique_ptr<ValueProfData>
329799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  serializeFrom(const InstrProfRecord &Record);
330799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*!
331c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar   * Check the integrity of the record.
332799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
333c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  Error checkIntegrity();
334799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*!
335799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Return a pointer to \c ValueProfileData instance ready to be read.
336799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * All data in the instance are properly byte swapped. The input
337799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * data is assumed to be in little endian order.
338799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
339c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  static Expected<std::unique_ptr<ValueProfData>>
340799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  getValueProfData(const unsigned char *SrcBuffer,
341799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                   const unsigned char *const SrcBufferEnd,
342799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                   support::endianness SrcDataEndianness);
343799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*!
344799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Swap byte order from \c Endianness order to host byte order.
345799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
346799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  void swapBytesToHost(support::endianness Endianness);
347799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*!
348799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Swap byte order from host byte order to \c Endianness order.
349799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
350799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  void swapBytesFromHost(support::endianness Endianness);
351799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*!
352799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Return the total size of \c ValueProfileData.
353799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
354799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t getSize() const { return TotalSize; }
355799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /*!
356799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * Read data from this data and save it to \c Record.
357799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
358799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  void deserializeTo(InstrProfRecord &Record,
359799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                     InstrProfRecord::ValueMapType *VMap);
360799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  void operator delete(void *ptr) { ::operator delete(ptr); }
361799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
362799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar} ValueProfData;
363799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
364c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/*
365799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * The closure is designed to abstact away two types of value profile data:
366799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * - InstrProfRecord which is the primary data structure used to
367799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *   represent profile data in host tools (reader, writer, and profile-use)
368799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * - value profile runtime data structure suitable to be used by C
369799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *   runtime library.
370799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *
371799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * Both sources of data need to serialize to disk/memory-buffer in common
372799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * format: ValueProfData. The abstraction allows compiler-rt's raw profiler
373799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * writer to share the same format and code with indexed profile writer.
374799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar *
375799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * For documentation of the member methods below, refer to corresponding methods
376799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * in class InstrProfRecord.
377799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
378799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct ValueProfRecordClosure {
379799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  const void *Record;
380799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t (*GetNumValueKinds)(const void *Record);
381799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t (*GetNumValueSites)(const void *Record, uint32_t VKind);
382799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t (*GetNumValueData)(const void *Record, uint32_t VKind);
383799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t (*GetNumValueDataForSite)(const void *R, uint32_t VK, uint32_t S);
384799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
385c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /*
386799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * After extracting the value profile data from the value profile record,
387799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * this method is used to map the in-memory value to on-disk value. If
388799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   * the method is null, value will be written out untranslated.
389799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar   */
390799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint64_t (*RemapValueData)(uint32_t, uint64_t Value);
391799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  void (*GetValueForSite)(const void *R, InstrProfValueData *Dst, uint32_t K,
392c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                          uint32_t S);
393799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  ValueProfData *(*AllocValueProfData)(size_t TotalSizeInBytes);
394799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar} ValueProfRecordClosure;
395799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
396c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY ValueProfRecord *
397c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainargetFirstValueProfRecord(ValueProfData *VPD);
398c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY ValueProfRecord *
399c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainargetValueProfRecordNext(ValueProfRecord *VPR);
400c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY InstrProfValueData *
401c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainargetValueProfRecordValueData(ValueProfRecord *VPR);
402c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY uint32_t
403c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainargetValueProfRecordHeaderSize(uint32_t NumValueSites);
404799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
405799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#undef INSTR_PROF_VALUE_PROF_DATA
406c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif  /* INSTR_PROF_VALUE_PROF_DATA */
407799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
408799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
409799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef INSTR_PROF_COMMON_API_IMPL
410799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_DATA_DEFINED
411799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef __cplusplus
412799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_INLINE inline
413c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_NULLPTR nullptr
414799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else
415799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_INLINE
416c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_NULLPTR NULL
417799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
418799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
419799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifndef offsetof
420799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
421799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
422799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
423799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/*!
424799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * \brief Return the \c ValueProfRecord header size including the
425799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * padding bytes.
426799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
427c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY INSTR_PROF_INLINE
428799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainaruint32_t getValueProfRecordHeaderSize(uint32_t NumValueSites) {
429799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t Size = offsetof(ValueProfRecord, SiteCountArray) +
430799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                  sizeof(uint8_t) * NumValueSites;
431799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /* Round the size to multiple of 8 bytes. */
432799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  Size = (Size + 7) & ~7;
433799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  return Size;
434799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
435799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
436c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/*!
437799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * \brief Return the total size of the value profile record including the
438799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * header and the value data.
439799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
440c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY INSTR_PROF_INLINE
441799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainaruint32_t getValueProfRecordSize(uint32_t NumValueSites,
442799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                                uint32_t NumValueData) {
443799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  return getValueProfRecordHeaderSize(NumValueSites) +
444799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar         sizeof(InstrProfValueData) * NumValueData;
445799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
446799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
447799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/*!
448799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * \brief Return the pointer to the start of value data array.
449799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
450c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY INSTR_PROF_INLINE
451799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarInstrProfValueData *getValueProfRecordValueData(ValueProfRecord *This) {
452799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  return (InstrProfValueData *)((char *)This + getValueProfRecordHeaderSize(
453799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                                                   This->NumValueSites));
454799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
455799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
456c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/*!
457799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * \brief Return the total number of value data for \c This record.
458799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
459c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY INSTR_PROF_INLINE
460799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainaruint32_t getValueProfRecordNumValueData(ValueProfRecord *This) {
461799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t NumValueData = 0;
462799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t I;
463799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  for (I = 0; I < This->NumValueSites; I++)
464799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    NumValueData += This->SiteCountArray[I];
465799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  return NumValueData;
466799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
467799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
468c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/*!
469799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * \brief Use this method to advance to the next \c This \c ValueProfRecord.
470799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
471c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY INSTR_PROF_INLINE
472799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarValueProfRecord *getValueProfRecordNext(ValueProfRecord *This) {
473799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t NumValueData = getValueProfRecordNumValueData(This);
474799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  return (ValueProfRecord *)((char *)This +
475799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                             getValueProfRecordSize(This->NumValueSites,
476799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                                                    NumValueData));
477799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
478799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
479799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/*!
480799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * \brief Return the first \c ValueProfRecord instance.
481799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
482c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY INSTR_PROF_INLINE
483799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarValueProfRecord *getFirstValueProfRecord(ValueProfData *This) {
484799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  return (ValueProfRecord *)((char *)This + sizeof(ValueProfData));
485799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
486799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
487799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* Closure based interfaces.  */
488799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
489c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/*!
490799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * Return the total size in bytes of the on-disk value profile data
491799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * given the data stored in Record.
492799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
493c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY uint32_t
494c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainargetValueProfDataSize(ValueProfRecordClosure *Closure) {
495799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t Kind;
496799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t TotalSize = sizeof(ValueProfData);
497799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  const void *Record = Closure->Record;
498799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
499799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  for (Kind = IPVK_First; Kind <= IPVK_Last; Kind++) {
500799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    uint32_t NumValueSites = Closure->GetNumValueSites(Record, Kind);
501799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (!NumValueSites)
502799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      continue;
503799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    TotalSize += getValueProfRecordSize(NumValueSites,
504799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                                        Closure->GetNumValueData(Record, Kind));
505799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  }
506799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  return TotalSize;
507799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
508799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
509799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/*!
510799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * Extract value profile data of a function for the profile kind \c ValueKind
511799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * from the \c Closure and serialize the data into \c This record instance.
512799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
513c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY void
514c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarserializeValueProfRecordFrom(ValueProfRecord *This,
515c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                             ValueProfRecordClosure *Closure,
516c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                             uint32_t ValueKind, uint32_t NumValueSites) {
517799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t S;
518799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  const void *Record = Closure->Record;
519799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  This->Kind = ValueKind;
520799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  This->NumValueSites = NumValueSites;
521799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  InstrProfValueData *DstVD = getValueProfRecordValueData(This);
522799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
523799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  for (S = 0; S < NumValueSites; S++) {
524799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    uint32_t ND = Closure->GetNumValueDataForSite(Record, ValueKind, S);
525799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    This->SiteCountArray[S] = ND;
526c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    Closure->GetValueForSite(Record, DstVD, ValueKind, S);
527799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    DstVD += ND;
528799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  }
529799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
530799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
531799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/*!
532799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * Extract value profile data of a function  from the \c Closure
533799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * and serialize the data into \c DstData if it is not NULL or heap
534c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * memory allocated by the \c Closure's allocator method. If \c
535c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * DstData is not null, the caller is expected to set the TotalSize
536c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * in DstData.
537799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
538c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarINSTR_PROF_VISIBILITY ValueProfData *
539c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarserializeValueProfDataFrom(ValueProfRecordClosure *Closure,
540c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar                           ValueProfData *DstData) {
541799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint32_t Kind;
542c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  uint32_t TotalSize =
543c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar      DstData ? DstData->TotalSize : getValueProfDataSize(Closure);
544799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
545799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  ValueProfData *VPD =
546799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      DstData ? DstData : Closure->AllocValueProfData(TotalSize);
547799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
548799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  VPD->TotalSize = TotalSize;
549799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  VPD->NumValueKinds = Closure->GetNumValueKinds(Closure->Record);
550799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  ValueProfRecord *VR = getFirstValueProfRecord(VPD);
551799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  for (Kind = IPVK_First; Kind <= IPVK_Last; Kind++) {
552799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    uint32_t NumValueSites = Closure->GetNumValueSites(Closure->Record, Kind);
553799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (!NumValueSites)
554799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      continue;
555799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    serializeValueProfRecordFrom(VR, Closure, Kind, NumValueSites);
556799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    VR = getValueProfRecordNext(VR);
557799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  }
558799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  return VPD;
559799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
560799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
561799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#undef INSTR_PROF_COMMON_API_IMPL
562799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif /* INSTR_PROF_COMMON_API_IMPL */
563799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
564799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/*============================================================================*/
565799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
566799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifndef INSTR_PROF_DATA_DEFINED
567799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
568c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#ifndef INSTR_PROF_DATA_INC
569c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_DATA_INC
570799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
571799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* Helper macros.  */
572799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_SIMPLE_QUOTE(x) #x
573799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_QUOTE(x) INSTR_PROF_SIMPLE_QUOTE(x)
574799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_SIMPLE_CONCAT(x,y) x ## y
575799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_CONCAT(x,y) INSTR_PROF_SIMPLE_CONCAT(x,y)
576799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
577799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* Magic number to detect file format and endianness.
578799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * Use 255 at one end, since no UTF-8 file can use that character.  Avoid 0,
579799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * so that utilities, like strings, don't grab it as a string.  129 is also
580799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * invalid UTF-8, and high enough to be interesting.
581799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * Use "lprofr" in the centre to stand for "LLVM Profile Raw", or "lprofR"
582799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * for 32-bit platforms.
583799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
584799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_RAW_MAGIC_64 (uint64_t)255 << 56 | (uint64_t)'l' << 48 | \
585799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar       (uint64_t)'p' << 40 | (uint64_t)'r' << 32 | (uint64_t)'o' << 24 |  \
586799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        (uint64_t)'f' << 16 | (uint64_t)'r' << 8 | (uint64_t)129
587799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_RAW_MAGIC_32 (uint64_t)255 << 56 | (uint64_t)'l' << 48 | \
588799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar       (uint64_t)'p' << 40 | (uint64_t)'r' << 32 | (uint64_t)'o' << 24 |  \
589799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        (uint64_t)'f' << 16 | (uint64_t)'R' << 8 | (uint64_t)129
590799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
591c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* Raw profile format version (start from 1). */
592c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_RAW_VERSION 4
593c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* Indexed profile format version (start from 1). */
594c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_INDEX_VERSION 4
595c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* Coverage mapping format vresion (start from 0). */
596c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_COVMAP_VERSION 1
597c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
598c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* Profile version is always of type uint64_t. Reserve the upper 8 bits in the
599c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * version for other variants of profile. We set the lowest bit of the upper 8
600c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * bits (i.e. bit 56) to 1 to indicate if this is an IR-level instrumentaiton
601c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * generated profile, and 0 if this is a Clang FE generated profile.
602c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar */
603c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define VARIANT_MASKS_ALL 0xff00000000000000ULL
604c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define GET_VERSION(V) ((V) & ~VARIANT_MASKS_ALL)
605c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define VARIANT_MASK_IR_PROF (0x1ULL << 56)
606c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define IR_LEVEL_PROF_VERSION_VAR __llvm_profile_raw_version
607799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
608799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* Runtime section names and name strings.  */
609799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_DATA_SECT_NAME __llvm_prf_data
610799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_NAME_SECT_NAME __llvm_prf_names
611799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_CNTS_SECT_NAME __llvm_prf_cnts
612c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* Array of pointers. Each pointer points to a list
613c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar * of value nodes associated with one value site.
614c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar */
615c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_VALS_SECT_NAME __llvm_prf_vals
616c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* Value profile nodes section. */
617c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_VNODES_SECT_NAME __llvm_prf_vnds
618c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_COVMAP_SECT_NAME __llvm_covmap
619c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
620c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_DATA_SECT_NAME_STR                                          \
621c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  INSTR_PROF_QUOTE(INSTR_PROF_DATA_SECT_NAME)
622c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_NAME_SECT_NAME_STR                                          \
623c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  INSTR_PROF_QUOTE(INSTR_PROF_NAME_SECT_NAME)
624c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_CNTS_SECT_NAME_STR                                          \
625c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  INSTR_PROF_QUOTE(INSTR_PROF_CNTS_SECT_NAME)
626c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_COVMAP_SECT_NAME_STR                                        \
627c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  INSTR_PROF_QUOTE(INSTR_PROF_COVMAP_SECT_NAME)
628c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_VALS_SECT_NAME_STR                                          \
629c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  INSTR_PROF_QUOTE(INSTR_PROF_VALS_SECT_NAME)
630c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define INSTR_PROF_VNODES_SECT_NAME_STR                                        \
631c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  INSTR_PROF_QUOTE(INSTR_PROF_VNODES_SECT_NAME)
632799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
633799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* Macros to define start/stop section symbol for a given
634799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * section on Linux. For instance
635799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * INSTR_PROF_SECT_START(INSTR_PROF_DATA_SECT_NAME) will
636799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * expand to __start___llvm_prof_data
637799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
638799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_SECT_START(Sect) \
639799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        INSTR_PROF_CONCAT(__start_,Sect)
640799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_SECT_STOP(Sect) \
641799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        INSTR_PROF_CONCAT(__stop_,Sect)
642799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
643799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* Value Profiling API linkage name.  */
644799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_VALUE_PROF_FUNC __llvm_profile_instrument_target
645799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_VALUE_PROF_FUNC_STR \
646799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        INSTR_PROF_QUOTE(INSTR_PROF_VALUE_PROF_FUNC)
647799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
648799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* InstrProfile per-function control data alignment.  */
649799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define INSTR_PROF_DATA_ALIGNMENT 8
650799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
651799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar/* The data structure that represents a tracked value by the
652799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar * value profiler.
653799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar */
654799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct InstrProfValueData {
655799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /* Profiled value. */
656799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint64_t Value;
657799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  /* Number of times the value appears in the training run. */
658799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  uint64_t Count;
659799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar} InstrProfValueData;
660799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
661c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif /* INSTR_PROF_DATA_INC */
662799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
663799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else
664799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#undef INSTR_PROF_DATA_DEFINED
665799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
666