diff --git a/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp index e580503a9124..d98dc7838825 100644 --- a/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp +++ b/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp @@ -180,6 +180,12 @@ static StringRef getFunctionName(const DISubprogram *SP) { return SP->getName(); } +template 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 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::isFunctionInstrumented(const Function &F) { 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(const DICompileUnit *CU, } } - 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;