[llvm] r196358 - llvm-cov: Added support for function checksums.
Daniel Jasper
djasper at google.com
Wed Dec 4 00:29:48 PST 2013
On Wed, Dec 4, 2013 at 8:15 AM, Lang Hames <lhames at gmail.com> wrote:
> Hi Yuchen,
>
> This seems to have broken the clang/test/CodeGen/code-coverage.c test.
> Could you please take a look at it and fix or revert the patch?
>
> Thanks very much!
>
> Cheers,
> Lang.
>
>
>
> On Tue, Dec 3, 2013 at 10:00 PM, Yuchen Wu <yuchenericwu at hotmail.com>wrote:
>
>> Author: ywu
>> Date: Wed Dec 4 00:00:17 2013
>> New Revision: 196358
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=196358&view=rev
>> Log:
>> llvm-cov: Added support for function checksums.
>>
>> The function checksums are hashed from the concatenation of the function
>> name and line number.
>>
>> Added:
>> llvm/trunk/test/tools/llvm-cov/Inputs/test_file_checksum_fail.gcda
>> llvm/trunk/test/tools/llvm-cov/Inputs/test_func_checksum_fail.gcda
>> Removed:
>> llvm/trunk/test/tools/llvm-cov/Inputs/test_checksum_mismatch.gcda
>> Modified:
>> llvm/trunk/include/llvm/Support/GCOV.h
>> llvm/trunk/lib/IR/GCOV.cpp
>> llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp
>> llvm/trunk/test/tools/llvm-cov/Inputs/test.gcda
>> llvm/trunk/test/tools/llvm-cov/Inputs/test.gcno
>> llvm/trunk/test/tools/llvm-cov/Inputs/test_read_fail.gcno
>> llvm/trunk/test/tools/llvm-cov/llvm-cov.test
>>
>> Modified: llvm/trunk/include/llvm/Support/GCOV.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/GCOV.h?rev=196358&r1=196357&r2=196358&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Support/GCOV.h (original)
>> +++ llvm/trunk/include/llvm/Support/GCOV.h Wed Dec 4 00:00:17 2013
>> @@ -250,6 +250,7 @@ public:
>> private:
>> GCOVFile &Parent;
>> uint32_t Ident;
>> + uint32_t Checksum;
>> uint32_t LineNumber;
>> StringRef Name;
>> StringRef Filename;
>>
>> Modified: llvm/trunk/lib/IR/GCOV.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/GCOV.cpp?rev=196358&r1=196357&r2=196358&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/IR/GCOV.cpp (original)
>> +++ llvm/trunk/lib/IR/GCOV.cpp Wed Dec 4 00:00:17 2013
>> @@ -125,7 +125,7 @@ bool GCOVFunction::readGCNO(GCOVBuffer &
>> uint32_t Dummy;
>> if (!Buff.readInt(Dummy)) return false; // Function header length
>> if (!Buff.readInt(Ident)) return false;
>> - if (!Buff.readInt(Dummy)) return false; // Checksum #1
>> + if (!Buff.readInt(Checksum)) return false;
>> if (Version != GCOV::V402) {
>> uint32_t CfgChecksum;
>> if (!Buff.readInt(CfgChecksum)) return false;
>> @@ -212,6 +212,7 @@ bool GCOVFunction::readGCNO(GCOVBuffer &
>> bool GCOVFunction::readGCDA(GCOVBuffer &Buff, GCOV::GCOVVersion Version)
>> {
>> uint32_t Dummy;
>> if (!Buff.readInt(Dummy)) return false; // Function header length
>> +
>> uint32_t GCDAIdent;
>> if (!Buff.readInt(GCDAIdent)) return false;
>> if (Ident != GCDAIdent) {
>> @@ -220,8 +221,13 @@ bool GCOVFunction::readGCDA(GCOVBuffer &
>> return false;
>> }
>>
>> - if (!Buff.readInt(Dummy)) return false; // Checksum #1
>> -
>> + uint32_t GCDAChecksum;
>> + if (!Buff.readInt(GCDAChecksum)) return false;
>> + if (Checksum != GCDAChecksum) {
>> + errs() << "Function checksums do not match: " << Checksum << " != "
>> + << GCDAChecksum << " (in " << Name << ").\n";
>> + return false;
>> + }
>>
>> uint32_t CfgChecksum;
>> if (Version != GCOV::V402) {
>>
>> Modified: llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp?rev=196358&r1=196357&r2=196358&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp Wed Dec
>> 4 00:00:17 2013
>> @@ -314,12 +314,18 @@ namespace {
>> this->os = os;
>>
>> Function *F = SP.getFunction();
>> - DEBUG(dbgs() << "Function: " << F->getName() << "\n");
>> + DEBUG(dbgs() << "Function: " << getFunctionName(SP) << "\n");
>> uint32_t i = 0;
>> for (Function::iterator BB = F->begin(), E = F->end(); BB != E;
>> ++BB) {
>> Blocks[BB] = new GCOVBlock(i++, os);
>> }
>> ReturnBlock = new GCOVBlock(i++, os);
>> +
>> + std::string FunctionNameAndLine;
>> + raw_string_ostream FNLOS(FunctionNameAndLine);
>> + FNLOS << getFunctionName(SP) << SP.getLineNumber();
>> + FNLOS.flush();
>> + FuncChecksum = hash_value(FunctionNameAndLine);
>> }
>>
>> ~GCOVFunction() {
>> @@ -347,6 +353,10 @@ namespace {
>> return EdgeDestinations;
>> }
>>
>> + uint32_t getFuncChecksum() {
>> + return FuncChecksum;
>> + }
>> +
>> void setCfgChecksum(uint32_t Checksum) {
>> CfgChecksum = Checksum;
>> }
>> @@ -359,7 +369,7 @@ namespace {
>> ++BlockLen;
>> write(BlockLen);
>> write(Ident);
>> - write(0); // lineno checksum
>> + write(FuncChecksum);
>> if (UseCfgChecksum)
>> write(CfgChecksum);
>> writeGCOVString(getFunctionName(SP));
>> @@ -401,6 +411,7 @@ namespace {
>> private:
>> DISubprogram SP;
>> uint32_t Ident;
>> + uint32_t FuncChecksum;
>> bool UseCfgChecksum;
>> uint32_t CfgChecksum;
>> DenseMap<BasicBlock *, GCOVBlock *> Blocks;
>> @@ -731,6 +742,7 @@ Constant *GCOVProfiler::getEmitFunctionF
>> Type *Args[] = {
>> Type::getInt32Ty(*Ctx), // uint32_t ident
>> Type::getInt8PtrTy(*Ctx), // const char *function_name
>> + Type::getInt32Ty(*Ctx), // uint32_t func_checksum
>> Type::getInt8Ty(*Ctx), // uint8_t use_extra_checksum
>> Type::getInt32Ty(*Ctx), // uint32_t cfg_checksum
>> };
>> @@ -813,11 +825,12 @@ Function *GCOVProfiler::insertCounterWri
>> Builder.getInt32(CfgChecksum));
>> for (unsigned j = 0, e = CountersBySP.size(); j != e; ++j) {
>> DISubprogram SP(CountersBySP[j].second);
>> - Builder.CreateCall4(
>> + Builder.CreateCall5(
>> EmitFunction, Builder.getInt32(j),
>> Options.FunctionNamesInData ?
>> Builder.CreateGlobalStringPtr(getFunctionName(SP)) :
>> Constant::getNullValue(Builder.getInt8PtrTy()),
>> + Builder.getInt32(Funcs[j]->getFuncChecksum()),
>>
>
The problem is that Funcs[j] is out of bounds (j is zero, but Funcs is
empty). However, I don't know how to fix this so I have rolled it back
in r196365. Sorry if this causes extra trouble.
Cheers,
Daniel
> Builder.getInt8(Options.UseCfgChecksum),
>> Builder.getInt32(CfgChecksum));
>>
>>
>> Modified: llvm/trunk/test/tools/llvm-cov/Inputs/test.gcda
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/test.gcda?rev=196358&r1=196357&r2=196358&view=diff
>>
>> ==============================================================================
>> Binary files llvm/trunk/test/tools/llvm-cov/Inputs/test.gcda (original)
>> and llvm/trunk/test/tools/llvm-cov/Inputs/test.gcda Wed Dec 4 00:00:17
>> 2013 differ
>>
>> Modified: llvm/trunk/test/tools/llvm-cov/Inputs/test.gcno
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/test.gcno?rev=196358&r1=196357&r2=196358&view=diff
>>
>> ==============================================================================
>> Binary files llvm/trunk/test/tools/llvm-cov/Inputs/test.gcno (original)
>> and llvm/trunk/test/tools/llvm-cov/Inputs/test.gcno Wed Dec 4 00:00:17
>> 2013 differ
>>
>> Removed: llvm/trunk/test/tools/llvm-cov/Inputs/test_checksum_mismatch.gcda
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/test_checksum_mismatch.gcda?rev=196357&view=auto
>>
>> ==============================================================================
>> Binary files
>> llvm/trunk/test/tools/llvm-cov/Inputs/test_checksum_mismatch.gcda
>> (original) and
>> llvm/trunk/test/tools/llvm-cov/Inputs/test_checksum_mismatch.gcda (removed)
>> differ
>>
>> Added: llvm/trunk/test/tools/llvm-cov/Inputs/test_file_checksum_fail.gcda
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/test_file_checksum_fail.gcda?rev=196358&view=auto
>>
>> ==============================================================================
>> Binary files
>> llvm/trunk/test/tools/llvm-cov/Inputs/test_file_checksum_fail.gcda (added)
>> and llvm/trunk/test/tools/llvm-cov/Inputs/test_file_checksum_fail.gcda Wed
>> Dec 4 00:00:17 2013 differ
>>
>> Added: llvm/trunk/test/tools/llvm-cov/Inputs/test_func_checksum_fail.gcda
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/test_func_checksum_fail.gcda?rev=196358&view=auto
>>
>> ==============================================================================
>> Binary files
>> llvm/trunk/test/tools/llvm-cov/Inputs/test_func_checksum_fail.gcda (added)
>> and llvm/trunk/test/tools/llvm-cov/Inputs/test_func_checksum_fail.gcda Wed
>> Dec 4 00:00:17 2013 differ
>>
>> Modified: llvm/trunk/test/tools/llvm-cov/Inputs/test_read_fail.gcno
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/test_read_fail.gcno?rev=196358&r1=196357&r2=196358&view=diff
>>
>> ==============================================================================
>> Binary files llvm/trunk/test/tools/llvm-cov/Inputs/test_read_fail.gcno
>> (original) and llvm/trunk/test/tools/llvm-cov/Inputs/test_read_fail.gcno
>> Wed Dec 4 00:00:17 2013 differ
>>
>> Modified: llvm/trunk/test/tools/llvm-cov/llvm-cov.test
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/llvm-cov.test?rev=196358&r1=196357&r2=196358&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-cov/llvm-cov.test (original)
>> +++ llvm/trunk/test/tools/llvm-cov/llvm-cov.test Wed Dec 4 00:00:17 2013
>> @@ -11,6 +11,8 @@ RUN: rm test.cpp.llcov
>>
>> RUN: not llvm-cov -gcno=test_read_fail.gcno -gcda=test.gcda
>>
>> -RUN: not llvm-cov -gcno=test.gcno -gcda=test_checksum_mismatch.gcda
>> +RUN: not llvm-cov -gcno=test.gcno -gcda=test_file_checksum_fail.gcda
>> +
>> +RUN: not llvm-cov -gcno=test.gcno -gcda=test_func_checksum_fail.gcda
>>
>> XFAIL: powerpc64, s390x, mips
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131204/6696ba7e/attachment.html>
More information about the llvm-commits
mailing list