[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