From: Xinliang David Li Date: Thu, 5 Nov 2015 00:47:26 +0000 (+0000) Subject: [PGO] Use template file to define runtime structures X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=0bf62648ad5e726ce5bf165b50bf2a86bdaa74bf [PGO] Use template file to define runtime structures With this change, instrumentation code and reader/write code related to profile data structs are kept strictly in-sync. THis will be extended to cfe and compile-rt references as well. Differential Revision: http://reviews.llvm.org/D13843 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252113 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ProfileData/InstrProf.h b/include/llvm/ProfileData/InstrProf.h index 2be174d573d..d4119ed55c4 100644 --- a/include/llvm/ProfileData/InstrProf.h +++ b/include/llvm/ProfileData/InstrProf.h @@ -431,11 +431,8 @@ inline uint64_t getMagic() { template struct ProfileData { - const uint32_t NameSize; - const uint32_t NumCounters; - const uint64_t FuncHash; - const IntPtrT NamePtr; - const IntPtrT CounterPtr; + #define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Type Name; + #include "llvm/ProfileData/InstrProfData.inc" }; // The definition should match the header referenced in @@ -454,6 +451,18 @@ struct Header { } // end namespace RawInstrProf +namespace coverage { + +LLVM_PACKED_START +template +struct CovMapFunctionRecord { + #define COVMAP_FUNC_RECORD(Type, LLVMType, Name, Init) Type Name; + #include "llvm/ProfileData/InstrProfData.inc" +}; +LLVM_PACKED_END + +} + } // end namespace llvm namespace std { diff --git a/include/llvm/ProfileData/InstrProfData.inc b/include/llvm/ProfileData/InstrProfData.inc index 6c69e9476cc..58ce39ad83a 100644 --- a/include/llvm/ProfileData/InstrProfData.inc +++ b/include/llvm/ProfileData/InstrProfData.inc @@ -17,48 +17,45 @@ // 1. To declare a structure: // // struct ProfData { -// #define INSTR_PROF_DATA(Type, LLVMTypeVar, LLVMType, Name, Initializer) \ +// #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \ // Type Name; -// #include "ProfileData/InstrProfData.inc" +// #include "llvm/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: +// 2. 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" +// #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \ +// LLVMType, +// #include "llvm/ProfileData/InstrProfData.inc" // }; // // 4. To construct constant array for the initializers: -// #define INSTR_PROF_DATA(Type, LLVMTypeVar, LLVMType, Name, Initializer) \ +// #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \ // Initializer, // Constant *ConstantVals[] = { -// #include "ProfileData/InstrProfData.inc" +// #include "llvm/ProfileData/InstrProfData.inc" // }; //===----------------------------------------------------------------------===// #ifndef INSTR_PROF_DATA -#define INSTR_PROF_DATA(Type, LLVMTypeVar, LLVMType, Name, Initializer) +#define INSTR_PROF_DATA(Type, 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(const uint32_t, llvm::Type::getInt32Ty(Ctx), NameSize, \ + ConstantInt::get(llvm::Type::getInt32Ty(Ctx), \ + NamePtr->getType()->getPointerElementType()->getArrayNumElements())) +INSTR_PROF_DATA(const uint32_t, llvm::Type::getInt32Ty(Ctx), NumCounters, \ + ConstantInt::get(llvm::Type::getInt32Ty(Ctx), NumCounters)) +INSTR_PROF_DATA(const uint64_t, llvm::Type::getInt64Ty(Ctx), FuncHash, \ + ConstantInt::get(llvm::Type::getInt64Ty(Ctx), \ + Inc->getHash()->getZExtValue())) +INSTR_PROF_DATA(const IntPtrT, llvm::Type::getInt8PtrTy(Ctx), NamePtr, \ + ConstantExpr::getBitCast(NamePtr, llvm::Type::getInt8PtrTy(Ctx))) +INSTR_PROF_DATA(const IntPtrT, llvm::Type::getInt64PtrTy(Ctx), CounterPtr, \ + ConstantExpr::getBitCast(CounterPtr, \ + llvm::Type::getInt64PtrTy(Ctx))) // INSTR_PROF_DATA_END #ifdef INSTR_PROF_DATA @@ -67,18 +64,19 @@ INSTR_PROF_DATA(const IntPtrT, Int64PtrTy, llvm::Type::getInt64PtrTy(Ctx), Count #ifndef COVMAP_FUNC_RECORD -#define COVMAP_FUNC_RECORD(Type, LLVMTypeVar, LLVMType, Name, Initializer) +#define COVMAP_FUNC_RECORD(Type, 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(const IntPtrT, llvm::Type::getInt8PtrTy(Ctx), \ + NamePtr, llvm::ConstantExpr::getBitCast(NamePtr, \ + llvm::Type::getInt8PtrTy(Ctx))) +COVMAP_FUNC_RECORD(const uint32_t, llvm::Type::getInt32Ty(Ctx), NameSize, \ + llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx), NameSize)) +COVMAP_FUNC_RECORD(const uint32_t, llvm::Type::getInt32Ty(Ctx), DataSize, \ + llvm::ConstantInt::get(llvm::getInt32Ty(Ctx), DataSize)) +COVMAP_FUNC_RECORD(const uint64_t, llvm::Type::getInt64Ty(Ctx), FuncHash, \ + llvm::ConstantInt::get(llvm::Type::getInt64Ty(Ctx), FuncHash)) // COVMAP_FUNC_RECORD_END #ifdef COVMAP_FUNC_RECORD diff --git a/lib/ProfileData/CoverageMappingReader.cpp b/lib/ProfileData/CoverageMappingReader.cpp index 7fd5f009a91..ed737d8f04e 100644 --- a/lib/ProfileData/CoverageMappingReader.cpp +++ b/lib/ProfileData/CoverageMappingReader.cpp @@ -343,7 +343,7 @@ std::error_code readCoverageMappingData( // Skip past the function records, saving the start and end for later. const char *FunBuf = Buf; - Buf += NRecords * (sizeof(T) + 2 * sizeof(uint32_t) + sizeof(uint64_t)); + Buf += NRecords * sizeof(coverage::CovMapFunctionRecord); const char *FunEnd = Buf; // Get the filenames. @@ -366,12 +366,15 @@ std::error_code readCoverageMappingData( // before reading the next map. Buf += alignmentAdjustment(Buf, 8); - while (FunBuf < FunEnd) { + auto CFR = + reinterpret_cast *>(FunBuf); + while ((const char *)CFR < FunEnd) { // Read the function information - T NamePtr = endian::readNext(FunBuf); - uint32_t NameSize = endian::readNext(FunBuf); - uint32_t DataSize = endian::readNext(FunBuf); - uint64_t FuncHash = endian::readNext(FunBuf); + T NamePtr = endian::byte_swap(CFR->NamePtr); + uint32_t NameSize = endian::byte_swap(CFR->NameSize); + uint32_t DataSize = endian::byte_swap(CFR->DataSize); + uint64_t FuncHash = endian::byte_swap(CFR->FuncHash); + CFR++; // Now use that to read the coverage data. if (CovBuf + DataSize > CovEnd) diff --git a/lib/Transforms/Instrumentation/InstrProfiling.cpp b/lib/Transforms/Instrumentation/InstrProfiling.cpp index 493c70e8fd6..5f0ae54df23 100644 --- a/lib/Transforms/Instrumentation/InstrProfiling.cpp +++ b/lib/Transforms/Instrumentation/InstrProfiling.cpp @@ -193,8 +193,8 @@ static std::string getVarName(InstrProfIncrementInst *Inc, StringRef Prefix) { GlobalVariable * InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) { - GlobalVariable *Name = Inc->getName(); - auto It = RegionCounters.find(Name); + GlobalVariable *NamePtr = Inc->getName(); + auto It = RegionCounters.find(NamePtr); if (It != RegionCounters.end()) return It->second; @@ -207,45 +207,43 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) { if (Fn->hasComdat()) ProfileVarsComdat = M->getOrInsertComdat( StringRef(getVarName(Inc, getInstrProfComdatPrefix()))); - Name->setSection(getNameSection()); - Name->setAlignment(1); - Name->setComdat(ProfileVarsComdat); + NamePtr->setSection(getNameSection()); + NamePtr->setAlignment(1); + NamePtr->setComdat(ProfileVarsComdat); uint64_t NumCounters = Inc->getNumCounters()->getZExtValue(); LLVMContext &Ctx = M->getContext(); ArrayType *CounterTy = ArrayType::get(Type::getInt64Ty(Ctx), NumCounters); // Create the counters variable. - auto *Counters = - new GlobalVariable(*M, CounterTy, false, Name->getLinkage(), + auto *CounterPtr = + new GlobalVariable(*M, CounterTy, false, NamePtr->getLinkage(), Constant::getNullValue(CounterTy), getVarName(Inc, getInstrProfCountersVarPrefix())); - Counters->setVisibility(Name->getVisibility()); - Counters->setSection(getCountersSection()); - Counters->setAlignment(8); - Counters->setComdat(ProfileVarsComdat); + CounterPtr->setVisibility(NamePtr->getVisibility()); + CounterPtr->setSection(getCountersSection()); + CounterPtr->setAlignment(8); + CounterPtr->setComdat(ProfileVarsComdat); - RegionCounters[Inc->getName()] = Counters; + RegionCounters[Inc->getName()] = CounterPtr; // Create data variable. - auto *NameArrayTy = Name->getType()->getPointerElementType(); - auto *Int32Ty = Type::getInt32Ty(Ctx); - auto *Int64Ty = Type::getInt64Ty(Ctx); - auto *Int8PtrTy = Type::getInt8PtrTy(Ctx); - auto *Int64PtrTy = Type::getInt64PtrTy(Ctx); - Type *DataTypes[] = {Int32Ty, Int32Ty, Int64Ty, Int8PtrTy, Int64PtrTy}; + Type *DataTypes[] = { + #define INSTR_PROF_DATA(Type, LLVMType, Name, Init) LLVMType, + #include "llvm/ProfileData/InstrProfData.inc" + }; auto *DataTy = StructType::get(Ctx, makeArrayRef(DataTypes)); + Constant *DataVals[] = { - ConstantInt::get(Int32Ty, NameArrayTy->getArrayNumElements()), - ConstantInt::get(Int32Ty, NumCounters), - ConstantInt::get(Int64Ty, Inc->getHash()->getZExtValue()), - ConstantExpr::getBitCast(Name, Int8PtrTy), - ConstantExpr::getBitCast(Counters, Int64PtrTy)}; - auto *Data = new GlobalVariable(*M, DataTy, true, Name->getLinkage(), + #define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Init, + #include "llvm/ProfileData/InstrProfData.inc" + }; + + auto *Data = new GlobalVariable(*M, DataTy, true, NamePtr->getLinkage(), ConstantStruct::get(DataTy, DataVals), getVarName(Inc, getInstrProfDataVarPrefix())); - Data->setVisibility(Name->getVisibility()); + Data->setVisibility(NamePtr->getVisibility()); Data->setSection(getDataSection()); Data->setAlignment(8); Data->setComdat(ProfileVarsComdat); @@ -253,7 +251,7 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) { // Mark the data variable as used so that it isn't stripped out. UsedVars.push_back(Data); - return Counters; + return CounterPtr; } void InstrProfiling::emitRegistration() {