c422787859aac8337100170e620a960be25ff55b
[oota-llvm.git] / include / llvm / ProfileData / InstrProfData.inc
1 //===-- InstrProfData.inc - instr profiling runtime structures-----===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines templates for core runtime data structures used by  
11 // instrumentation based profiling and coverage mapping. The instrumentation  
12 // runtime library, the compiler IR lowering, and profile reader/writer need
13 // to use the same template to make sure the same data structure is defined
14 // consistently.
15 //
16 // Examples of how the template is used:
17 // 1. To declare a structure:
18 // 
19 // struct ProfData {
20 // #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
21 //    Type Name;
22 // #include "llvm/ProfileData/InstrProfData.inc"
23 // };
24 //
25 // 2. To construct LLVM type arrays for the struct type:
26 //
27 // Type *DataTypes[] = {
28 // #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
29 //   LLVMType,
30 // #include "llvm/ProfileData/InstrProfData.inc"
31 // };
32 //
33 // 4. To construct constant array for the initializers:
34 // #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
35 //   Initializer,
36 // Constant *ConstantVals[] = {
37 // #include "llvm/ProfileData/InstrProfData.inc"
38 // };
39 //===----------------------------------------------------------------------===//
40
41 /* INSTR_PROF_DATA start. */
42 /* Definition of member fields of the per-function control structure. */
43 #ifndef INSTR_PROF_DATA
44 #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer)
45 #else
46 #define INSTR_PROF_DATA_DEFINED
47 #endif
48
49 INSTR_PROF_DATA(const uint32_t, llvm::Type::getInt32Ty(Ctx), NameSize, \
50                 ConstantInt::get(llvm::Type::getInt32Ty(Ctx), \
51                 NamePtr->getType()->getPointerElementType()->getArrayNumElements()))
52 INSTR_PROF_DATA(const uint32_t, llvm::Type::getInt32Ty(Ctx), NumCounters, \
53                 ConstantInt::get(llvm::Type::getInt32Ty(Ctx), NumCounters))
54 INSTR_PROF_DATA(const uint64_t, llvm::Type::getInt64Ty(Ctx), FuncHash, \
55                 ConstantInt::get(llvm::Type::getInt64Ty(Ctx), \
56                 Inc->getHash()->getZExtValue()))
57 INSTR_PROF_DATA(const IntPtrT, llvm::Type::getInt8PtrTy(Ctx), NamePtr, \
58                 ConstantExpr::getBitCast(NamePtr, llvm::Type::getInt8PtrTy(Ctx)))
59 INSTR_PROF_DATA(const IntPtrT, llvm::Type::getInt64PtrTy(Ctx), CounterPtr, \
60                 ConstantExpr::getBitCast(CounterPtr, \
61                 llvm::Type::getInt64PtrTy(Ctx)))
62 INSTR_PROF_DATA(const IntPtrT, llvm::Type::getInt8PtrTy(Ctx), FunctionPointer, \
63                 FunctionAddr)
64 INSTR_PROF_DATA(IntPtrT, llvm::Type::getInt8PtrTy(Ctx), Values, \
65                 ConstantPointerNull::get(Int8PtrTy))
66 INSTR_PROF_DATA(const uint16_t, Int16ArrayTy, NumValueSites[IPVK_Last+1], \
67                 ConstantArray::get(Int16ArrayTy, Int16ArrayVals))
68 #undef INSTR_PROF_DATA
69 /* INSTR_PROF_DATA end. */
70
71 /* INSTR_PROF_RAW_HEADER  start */
72 /* Definition of member fields of the raw profile header data structure. */
73 #ifndef INSTR_PROF_RAW_HEADER
74 #define INSTR_PROF_RAW_HEADER(Type, Name, Initializer)
75 #else
76 #define INSTR_PROF_DATA_DEFINED
77 #endif
78 INSTR_PROF_RAW_HEADER(const uint64_t, Magic, __llvm_profile_get_magic())
79 INSTR_PROF_RAW_HEADER(const uint64_t, Version, __llvm_profile_get_version())
80 INSTR_PROF_RAW_HEADER(const uint64_t, DataSize, DataSize)
81 INSTR_PROF_RAW_HEADER(const uint64_t, CountersSize, CountersSize)
82 INSTR_PROF_RAW_HEADER(const uint64_t, NamesSize,  NameSize)
83 INSTR_PROF_RAW_HEADER(const uint64_t, CountersDelta, (uintptr_t)CountersBegin)
84 INSTR_PROF_RAW_HEADER(const uint64_t, NamesDelta, (uintptr_t)NamesBegin)
85 INSTR_PROF_RAW_HEADER(const uint64_t, ValueKindLast, IPVK_Last)
86 INSTR_PROF_RAW_HEADER(const uint64_t, ValueDataSize, ValueDataSize)
87 INSTR_PROF_RAW_HEADER(const uint64_t, ValueDataDelta, (uintptr_t)ValueDataBegin)
88 #undef INSTR_PROF_RAW_HEADER
89 /* INSTR_PROF_RAW_HEADER  end */
90
91 /* VALUE_PROF_FUNC_PARAM start */
92 /* Definition of parameter types of the runtime API used to do value profiling
93  * for a given value site.
94  */
95 #ifndef VALUE_PROF_FUNC_PARAM
96 #define VALUE_PROF_FUNC_PARAM(ArgType, ArgName, ArgLLVMType)
97 #define INSTR_PROF_COMMA
98 #else
99 #define INSTR_PROF_DATA_DEFINED
100 #define INSTR_PROF_COMMA ,
101 #endif
102 VALUE_PROF_FUNC_PARAM(uint64_t, TargetValue, Type::getInt64Ty(Ctx)) \
103                       INSTR_PROF_COMMA
104 VALUE_PROF_FUNC_PARAM(void *, Data, Type::getInt8PtrTy(Ctx)) INSTR_PROF_COMMA
105 VALUE_PROF_FUNC_PARAM(uint32_t, CounterIndex, Type::getInt32Ty(Ctx))
106 #undef VALUE_PROF_FUNC_PARAM
107 #undef INSTR_PROF_COMMA
108 /* VALUE_PROF_FUNC_PARAM end */
109
110 /* COVMAP_FUNC_RECORD start */
111 /* Definition of member fields of the function record structure in coverage
112  * map.
113  */
114 #ifndef COVMAP_FUNC_RECORD
115 #define COVMAP_FUNC_RECORD(Type, LLVMType, Name, Initializer)
116 #else
117 #define INSTR_PROF_DATA_DEFINED
118 #endif
119 COVMAP_FUNC_RECORD(const IntPtrT, llvm::Type::getInt8PtrTy(Ctx), \
120                    NamePtr, llvm::ConstantExpr::getBitCast(NamePtr, \
121                    llvm::Type::getInt8PtrTy(Ctx))) 
122 COVMAP_FUNC_RECORD(const uint32_t, llvm::Type::getInt32Ty(Ctx), NameSize, \
123                    llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx),\
124                    NameValue.size()))
125 COVMAP_FUNC_RECORD(const uint32_t, llvm::Type::getInt32Ty(Ctx), DataSize, \
126                    llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx),\
127                    CoverageMapping.size()))
128 COVMAP_FUNC_RECORD(const uint64_t, llvm::Type::getInt64Ty(Ctx), FuncHash, \
129                    llvm::ConstantInt::get(llvm::Type::getInt64Ty(Ctx), FuncHash))
130 #undef COVMAP_FUNC_RECORD
131 /* COVMAP_FUNC_RECORD end.  */
132
133