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.

llvm-svn: 348203
This commit is contained in:
Adrian Prantl 2018-12-03 22:37:48 +00:00
parent 1dbbc5f640
commit 40eb622325
1 changed files with 15 additions and 7 deletions

View File

@ -180,6 +180,12 @@ static StringRef getFunctionName(const DISubprogram *SP) {
return SP->getName(); 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 { namespace {
class GCOVRecord { class GCOVRecord {
protected: protected:
@ -256,7 +262,7 @@ namespace {
} }
private: private:
StringRef Filename; std::string Filename;
SmallVector<uint32_t, 32> Lines; SmallVector<uint32_t, 32> Lines;
}; };
@ -377,8 +383,9 @@ namespace {
void writeOut() { void writeOut() {
writeBytes(FunctionTag, 4); writeBytes(FunctionTag, 4);
SmallString<128> Filename = getFilename(SP);
uint32_t BlockLen = 1 + 1 + 1 + lengthOfGCOVString(getFunctionName(SP)) + uint32_t BlockLen = 1 + 1 + 1 + lengthOfGCOVString(getFunctionName(SP)) +
1 + lengthOfGCOVString(SP->getFilename()) + 1; 1 + lengthOfGCOVString(Filename) + 1;
if (UseCfgChecksum) if (UseCfgChecksum)
++BlockLen; ++BlockLen;
write(BlockLen); write(BlockLen);
@ -387,7 +394,7 @@ namespace {
if (UseCfgChecksum) if (UseCfgChecksum)
write(CfgChecksum); write(CfgChecksum);
writeGCOVString(getFunctionName(SP)); writeGCOVString(getFunctionName(SP));
writeGCOVString(SP->getFilename()); writeGCOVString(Filename);
write(SP->getLine()); write(SP->getLine());
// Emit count of blocks. // Emit count of blocks.
@ -466,7 +473,7 @@ bool GCOVProfiler::isFunctionInstrumented(const Function &F) {
if (FilterRe.empty() && ExcludeRe.empty()) { if (FilterRe.empty() && ExcludeRe.empty()) {
return true; return true;
} }
const StringRef Filename = F.getSubprogram()->getFilename(); SmallString<128> Filename = getFilename(F.getSubprogram());
auto It = InstrumentedFiles.find(Filename); auto It = InstrumentedFiles.find(Filename);
if (It != InstrumentedFiles.end()) { if (It != InstrumentedFiles.end()) {
return It->second; return It->second;
@ -531,7 +538,7 @@ std::string GCOVProfiler::mangleName(const DICompileUnit *CU,
} }
} }
SmallString<128> Filename = CU->getFilename(); SmallString<128> Filename = getFilename(CU);
sys::path::replace_extension(Filename, Notes ? "gcno" : "gcda"); sys::path::replace_extension(Filename, Notes ? "gcno" : "gcda");
StringRef FName = sys::path::filename(Filename); StringRef FName = sys::path::filename(Filename);
SmallString<128> CurPath; SmallString<128> CurPath;
@ -688,7 +695,8 @@ void GCOVProfiler::emitProfileNotes() {
// Add the function line number to the lines of the entry block // Add the function line number to the lines of the entry block
// to have a counter for the function definition. // to have a counter for the function definition.
uint32_t Line = SP->getLine(); 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) { for (auto &BB : F) {
GCOVBlock &Block = Func.getBlock(&BB); GCOVBlock &Block = Func.getBlock(&BB);
@ -719,7 +727,7 @@ void GCOVProfiler::emitProfileNotes() {
if (SP != getDISubprogram(Loc.getScope())) if (SP != getDISubprogram(Loc.getScope()))
continue; continue;
GCOVLines &Lines = Block.getFile(SP->getFilename()); GCOVLines &Lines = Block.getFile(Filename);
Lines.addLine(Loc.getLine()); Lines.addLine(Loc.getLine());
} }
Line = 0; Line = 0;