[PATCH] Coverage Mapping: store function's hash in the function's coverage record.
Justin Bogner
mail at justinbogner.com
Wed Aug 20 23:36:44 PDT 2014
LGTM.
Alex Lorenz <arphaman at gmail.com> writes:
> Hi bogner, bob.wilson,
>
> Recently, the profile data format was updated to allow for multiple
> functions with the same name. The updated indexing api requires the
> code coverage tool to know the function's hash as well as the
> function's name to get the execution counts for a function. This patch
> updates clang which now also stores function hashes in function's
> coverage records.
>
> http://reviews.llvm.org/D4995
>
> Files:
> lib/CodeGen/CodeGenPGO.cpp
> lib/CodeGen/CoverageMappingGen.cpp
> lib/CodeGen/CoverageMappingGen.h
> test/CoverageMapping/ir.c
>
> Index: lib/CodeGen/CodeGenPGO.cpp
> ===================================================================
> --- lib/CodeGen/CodeGenPGO.cpp
> +++ lib/CodeGen/CodeGenPGO.cpp
> @@ -168,8 +168,8 @@
>
> // Create coverage mapping data variable.
> if (!CoverageMapping.empty())
> - CGM.getCoverageMapping()->addFunctionMappingRecord(Name,
> - getFuncName(),
> + CGM.getCoverageMapping()->addFunctionMappingRecord(Name, getFuncName(),
> + FunctionHash,
> CoverageMapping);
>
> // Hide all these symbols so that we correctly get a copy for each
> Index: lib/CodeGen/CoverageMappingGen.cpp
> ===================================================================
> --- lib/CodeGen/CoverageMappingGen.cpp
> +++ lib/CodeGen/CoverageMappingGen.cpp
> @@ -1094,12 +1094,13 @@
>
> void CoverageMappingModuleGen::addFunctionMappingRecord(
> llvm::GlobalVariable *FunctionName, StringRef FunctionNameValue,
> - const std::string &CoverageMapping) {
> + uint64_t FunctionHash, const std::string &CoverageMapping) {
> llvm::LLVMContext &Ctx = CGM.getLLVMContext();
> auto *Int32Ty = llvm::Type::getInt32Ty(Ctx);
> + auto *Int64Ty = llvm::Type::getInt64Ty(Ctx);
> auto *Int8PtrTy = llvm::Type::getInt8PtrTy(Ctx);
> if (!FunctionRecordTy) {
> - llvm::Type *FunctionRecordTypes[] = {Int8PtrTy, Int32Ty, Int32Ty};
> + llvm::Type *FunctionRecordTypes[] = {Int8PtrTy, Int32Ty, Int32Ty, Int64Ty};
> FunctionRecordTy =
> llvm::StructType::get(Ctx, makeArrayRef(FunctionRecordTypes));
> }
> @@ -1107,7 +1108,8 @@
> llvm::Constant *FunctionRecordVals[] = {
> llvm::ConstantExpr::getBitCast(FunctionName, Int8PtrTy),
> llvm::ConstantInt::get(Int32Ty, FunctionNameValue.size()),
> - llvm::ConstantInt::get(Int32Ty, CoverageMapping.size())};
> + llvm::ConstantInt::get(Int32Ty, CoverageMapping.size()),
> + llvm::ConstantInt::get(Int64Ty, FunctionHash)};
> FunctionRecords.push_back(llvm::ConstantStruct::get(
> FunctionRecordTy, makeArrayRef(FunctionRecordVals)));
> CoverageMappings += CoverageMapping;
> Index: lib/CodeGen/CoverageMappingGen.h
> ===================================================================
> --- lib/CodeGen/CoverageMappingGen.h
> +++ lib/CodeGen/CoverageMappingGen.h
> @@ -69,6 +69,7 @@
> /// function mapping records.
> void addFunctionMappingRecord(llvm::GlobalVariable *FunctionName,
> StringRef FunctionNameValue,
> + uint64_t FunctionHash,
> const std::string &CoverageMapping);
>
> /// \brief Emit the coverage mapping data for a translation unit.
> Index: test/CoverageMapping/ir.c
> ===================================================================
> --- test/CoverageMapping/ir.c
> +++ test/CoverageMapping/ir.c
> @@ -9,4 +9,4 @@
> return 0;
> }
>
> -// CHECK: @__llvm_coverage_mapping = internal constant { i32, i32, i32, i32, [2 x { i8*, i32, i32 }], [{{[0-9]+}} x i8] } { i32 2, i32 {{[0-9]+}}, i32 {{[0-9]+}}, i32 0, [2 x { i8*, i32, i32 }] [{ i8*, i32, i32 } { i8* getelementptr inbounds ([3 x i8]* @__llvm_profile_name_foo, i32 0, i32 0), i32 3, i32 9 }, { i8*, i32, i32 } { i8* getelementptr inbounds ([4 x i8]* @__llvm_profile_name_main, i32 0, i32 0), i32 4, i32 9 }]
> +// CHECK: @__llvm_coverage_mapping = internal constant { i32, i32, i32, i32, [2 x { i8*, i32, i32, i64 }], [{{[0-9]+}} x i8] } { i32 2, i32 {{[0-9]+}}, i32 {{[0-9]+}}, i32 0, [2 x { i8*, i32, i32, i64 }] [{ i8*, i32, i32, i64 } { i8* getelementptr inbounds ([3 x i8]* @__llvm_profile_name_foo, i32 0, i32 0), i32 3, i32 9, i64 {{[0-9]+}} }, { i8*, i32, i32, i64 } { i8* getelementptr inbounds ([4 x i8]* @__llvm_profile_name_main, i32 0, i32 0), i32 4, i32 9, i64 {{[0-9]+}} }]
More information about the cfe-commits
mailing list