forked from OSchip/llvm-project
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:
parent
1dbbc5f640
commit
40eb622325
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue