[llvm] r348203 - Adapt gcov to changes in CFE.

Ilya Biryukov via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 4 08:35:03 PST 2018


Reverted in r348279. Sorry for the inconvenience, I'm happy to provide more
details if needed, but simply running "clang++ -coverage ./foo.cpp" shows
the problem: before the patch, the paths produced in .gcno is relative,
after the patch they're absolute.

On Tue, Dec 4, 2018 at 4:40 PM Ilya Biryukov <ibiryukov at google.com> wrote:

> Hi Adrian,
>
> After this change, the .gcno produced by clang store all the paths as
> absolute (adding the working directory).
> We rely on them being relative internally to produce code coverage.
>
> I'm afraid I'll have to revert this change (and prior changes that broke
> compiler-rt) to unbreak our integrate.
> Sorry for the inconvenience.
>
> On Mon, Dec 3, 2018 at 11:40 PM Adrian Prantl via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: adrian
>> Date: Mon Dec  3 14:37:48 2018
>> New Revision: 348203
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=348203&view=rev
>> Log:
>> Adapt gcov to changes in CFE.
>>
>> The clang frontend no longer emits the current working directory for
>> DIFiles containing an absolute path in the filename: and will move the
>> common prefix between current working directory and the file into the
>> directory: component.
>>
>> This fixes the GCOV tests in compiler-rt that were broken by the Clang
>> change.
>>
>> Modified:
>>     llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp
>>
>> Modified: llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp?rev=348203&r1=348202&r2=348203&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp Mon Dec
>> 3 14:37:48 2018
>> @@ -180,6 +180,12 @@ static StringRef getFunctionName(const D
>>    return SP->getName();
>>  }
>>
>> +template<class DINode> SmallString<128> getFilename(const DINode *N) {
>> +  SmallString<128> Path;
>> +  sys::path::append(Path, N->getDirectory(), N->getFilename());
>> +  return Path;
>> +}
>> +
>>  namespace {
>>    class GCOVRecord {
>>     protected:
>> @@ -256,7 +262,7 @@ namespace {
>>      }
>>
>>     private:
>> -    StringRef Filename;
>> +    std::string Filename;
>>      SmallVector<uint32_t, 32> Lines;
>>    };
>>
>> @@ -377,8 +383,9 @@ namespace {
>>
>>      void writeOut() {
>>        writeBytes(FunctionTag, 4);
>> +      SmallString<128> Filename = getFilename(SP);
>>        uint32_t BlockLen = 1 + 1 + 1 +
>> lengthOfGCOVString(getFunctionName(SP)) +
>> -                          1 + lengthOfGCOVString(SP->getFilename()) + 1;
>> +                          1 + lengthOfGCOVString(Filename) + 1;
>>        if (UseCfgChecksum)
>>          ++BlockLen;
>>        write(BlockLen);
>> @@ -387,7 +394,7 @@ namespace {
>>        if (UseCfgChecksum)
>>          write(CfgChecksum);
>>        writeGCOVString(getFunctionName(SP));
>> -      writeGCOVString(SP->getFilename());
>> +      writeGCOVString(Filename);
>>        write(SP->getLine());
>>
>>        // Emit count of blocks.
>> @@ -466,7 +473,7 @@ bool GCOVProfiler::isFunctionInstrumente
>>    if (FilterRe.empty() && ExcludeRe.empty()) {
>>      return true;
>>    }
>> -  const StringRef Filename = F.getSubprogram()->getFilename();
>> +  SmallString<128> Filename = getFilename(F.getSubprogram());
>>    auto It = InstrumentedFiles.find(Filename);
>>    if (It != InstrumentedFiles.end()) {
>>      return It->second;
>> @@ -531,7 +538,7 @@ std::string GCOVProfiler::mangleName(con
>>      }
>>    }
>>
>> -  SmallString<128> Filename = CU->getFilename();
>> +  SmallString<128> Filename = getFilename(CU);
>>    sys::path::replace_extension(Filename, Notes ? "gcno" : "gcda");
>>    StringRef FName = sys::path::filename(Filename);
>>    SmallString<128> CurPath;
>> @@ -688,7 +695,8 @@ void GCOVProfiler::emitProfileNotes() {
>>        // Add the function line number to the lines of the entry block
>>        // to have a counter for the function definition.
>>        uint32_t Line = SP->getLine();
>> -
>> Func.getBlock(&EntryBlock).getFile(SP->getFilename()).addLine(Line);
>> +      auto Filename = getFilename(SP);
>> +      Func.getBlock(&EntryBlock).getFile(Filename).addLine(Line);
>>
>>        for (auto &BB : F) {
>>          GCOVBlock &Block = Func.getBlock(&BB);
>> @@ -719,7 +727,7 @@ void GCOVProfiler::emitProfileNotes() {
>>            if (SP != getDISubprogram(Loc.getScope()))
>>              continue;
>>
>> -          GCOVLines &Lines = Block.getFile(SP->getFilename());
>> +          GCOVLines &Lines = Block.getFile(Filename);
>>            Lines.addLine(Loc.getLine());
>>          }
>>          Line = 0;
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
> --
> Regards,
> Ilya Biryukov
>


-- 
Regards,
Ilya Biryukov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181204/df15de70/attachment.html>


More information about the llvm-commits mailing list