From 373c216e8e2f6de58c0ba261f5fc36a01cdbca15 Mon Sep 17 00:00:00 2001 From: Xinliang David Li Date: Fri, 16 Oct 2015 23:17:34 +0000 Subject: [PATCH] Instroduce a template file to define InstrPGO core data structures. Changing PGO data format layout can be a pain. Many different places need to be touched and kept in sync. Failing to do so usually results in errors very time consuming to debug. This file is intended to be the master file that defines the layout of the core runtime data structures. Currently only two structure is covered: Per function ProfData structure and the function record structure used in coverage mapping. No client code has been made yet, so this commit is NFC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250574 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ProfileData/InstrProfData.inc | 88 ++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 include/llvm/ProfileData/InstrProfData.inc diff --git a/include/llvm/ProfileData/InstrProfData.inc b/include/llvm/ProfileData/InstrProfData.inc new file mode 100644 index 00000000000..6c69e9476cc --- /dev/null +++ b/include/llvm/ProfileData/InstrProfData.inc @@ -0,0 +1,88 @@ +//===-- InstrProfData.inc - instr profiling runtime structures-----===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines templates for core runtime data structures used by +// instrumentation based profiling and coverage mapping. The instrumentation +// runtime library, the compiler IR lowering, and profile reader/writer need +// to use the same template to make sure the same data structure is defined +// consistently. +// +// Examples of how the template is used: +// 1. To declare a structure: +// +// struct ProfData { +// #define INSTR_PROF_DATA(Type, LLVMTypeVar, LLVMType, Name, Initializer) \ +// Type Name; +// #include "ProfileData/InstrProfData.inc" +// }; +// +// 2. To define local variables for struct member's LLVM types" +// +// #define INSTR_PROF_DATA(Type, LLVMTypeVar, LLVMType, Name, Initializer) \ +// LLVMTypeVar = LLVMType; +// #include "ProfileData/InstrProfData.inc" +// +// 3. To construct LLVM type arrays for the struct type: +// +// Type *DataTypes[] = { +// #define INSTR_PROF_DATA(Type, LLVMTypeVar, LLVMType, Name, Initializer) \ +// LLVMTypeVar, +// #include "ProfileData/InstrProfData.inc" +// }; +// +// 4. To construct constant array for the initializers: +// #define INSTR_PROF_DATA(Type, LLVMTypeVar, LLVMType, Name, Initializer) \ +// Initializer, +// Constant *ConstantVals[] = { +// #include "ProfileData/InstrProfData.inc" +// }; +//===----------------------------------------------------------------------===// + +#ifndef INSTR_PROF_DATA +#define INSTR_PROF_DATA(Type, LLVMTypeVar, LLVMType, Name, Initializer) +#endif + +// INSTR_PROF_DATA_START +INSTR_PROF_DATA(const uint32_t, Int32Ty, llvm::Type::getInt32Ty(Ctx), NameSize, \ + ConstantInt::get(Int32Ty, NameSize)) +INSTR_PROF_DATA(const uint32_t, Int32Ty, llvm::Type::getInt32Ty(Ctx), NumCounters, \ + ConstantInt::get(Int32Ty, NumCounters)) +INSTR_PROF_DATA(const uint64_t, Int64Ty, llvm::Type::getInt64Ty(Ctx), FuncHash, \ + ConstantInt::get(Int64Ty, FuncHash)) +INSTR_PROF_DATA(const IntPtrT, Int8PtrTy,llvm::Type::getInt8PtrTy(Ctx), NamePtr, \ + ConstantExpr::getBitCast(Name, Int8PtrTy)) +INSTR_PROF_DATA(const IntPtrT, Int64PtrTy, llvm::Type::getInt64PtrTy(Ctx), CounterPtr, \ + ConstantExpr::getBitCast(CounterPtr, Int8PtrTy)) +// INSTR_PROF_DATA_END + +#ifdef INSTR_PROF_DATA +#undef INSTR_PROF_DATA +#endif + + +#ifndef COVMAP_FUNC_RECORD +#define COVMAP_FUNC_RECORD(Type, LLVMTypeVar, LLVMType, Name, Initializer) +#endif + +// COVMAP_FUNC_RECORD_START +COVMAP_FUNC_RECORD(const IntPtrT, Int8PtrTy, llvm::Type::getInt8PtrTy(Ctx), \ + NamePtr, llvm::ConstantExpr::getBitCast(NamePtr, Int8PtrTy)) +COVMAP_FUNC_RECORD(const uint32_t, Int32Ty, llvm::Type::getInt32Ty(Ctx), \ + NameSize, llvm::ConstantInt::get(Int32Ty, NameSize)) +COVMAP_FUNC_RECORD(const uint32_t, Int32Ty, llvm::Type::getInt32Ty(Ctx), \ + DataSize, llvm::ConstantInt::get(Int32Ty, DataSize)) +COVMAP_FUNC_RECORD(const uint64_t, Int64Ty, llvm::Type::getInt64Ty(Ctx), \ + FuncHash, llvm::ConstantInt::get(Int64Ty, FuncSize)) +// COVMAP_FUNC_RECORD_END + +#ifdef COVMAP_FUNC_RECORD +#undef COVMAP_FUNC_RECORD +#endif + + -- 2.34.1