diff options
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp | 26 | 
1 files changed, 19 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp index 293bad32c82..f01c6d5a9e2 100644 --- a/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp +++ b/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp @@ -91,7 +91,7 @@ namespace {      void insertCounterWriteout(ArrayRef<std::pair<GlobalVariable*, MDNode*> >);      void insertIndirectCounterIncrement(); -    std::string mangleName(DICompileUnit CU, std::string NewStem); +    std::string mangleName(DICompileUnit CU, const char *NewStem);      bool EmitNotes;      bool EmitData; @@ -328,7 +328,10 @@ namespace {    };  } -std::string GCOVProfiler::mangleName(DICompileUnit CU, std::string NewStem) { +std::string GCOVProfiler::mangleName(DICompileUnit CU, const char *NewStem) { +  SmallString<128> Filename = CU.getFilename(); +  bool AsString = false; +    if (NamedMDNode *GCov = M->getNamedMetadata("llvm.gcov")) {      for (int i = 0, e = GCov->getNumOperands(); i != e; ++i) {        MDNode *N = GCov->getOperand(i); @@ -337,16 +340,25 @@ std::string GCOVProfiler::mangleName(DICompileUnit CU, std::string NewStem) {        MDNode *CompileUnit = dyn_cast<MDNode>(N->getOperand(1));        if (!GCovFile || !CompileUnit) continue;        if (CompileUnit == CU) { -        SmallString<128> Filename = GCovFile->getString(); -        sys::path::replace_extension(Filename, NewStem); -        return Filename.str(); +        Filename = GCovFile->getString(); +        AsString = true; +        break;        }      }    } -  SmallString<128> Filename = CU.getFilename(); +  if (sys::path::is_relative(Filename.c_str())) { +    SmallString<128> FullPath = CU.getDirectory(); +    sys::path::append(FullPath, Filename.begin(), Filename.end()); +    Filename = FullPath; +  } +    sys::path::replace_extension(Filename, NewStem); -  return sys::path::filename(Filename.str()); + +  if (!AsString) +    return sys::path::filename(Filename.str()); + +  return Filename.str();  }  bool GCOVProfiler::runOnModule(Module &M) {  | 

