[llvm] r250574 - Instroduce a template file to define InstrPGO core data structures.

Xinliang David Li via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 16 16:17:35 PDT 2015


Author: davidxl
Date: Fri Oct 16 18:17:34 2015
New Revision: 250574

URL: http://llvm.org/viewvc/llvm-project?rev=250574&view=rev
Log:
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.



Added:
    llvm/trunk/include/llvm/ProfileData/InstrProfData.inc

Added: llvm/trunk/include/llvm/ProfileData/InstrProfData.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/InstrProfData.inc?rev=250574&view=auto
==============================================================================
--- llvm/trunk/include/llvm/ProfileData/InstrProfData.inc (added)
+++ llvm/trunk/include/llvm/ProfileData/InstrProfData.inc Fri Oct 16 18:17:34 2015
@@ -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
+
+




More information about the llvm-commits mailing list