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