diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2011-05-04 04:03:04 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2011-05-04 04:03:04 +0000 |
commit | 269687fa350c1aa044bc063c64362a04ecabaa33 (patch) | |
tree | 86810c831524ea19b9477f0395b1982af74633bd /lib/Transforms/Instrumentation | |
parent | d006ddc195934cf896d2f5e512d38e196923c79b (diff) | |
download | external_llvm-269687fa350c1aa044bc063c64362a04ecabaa33.zip external_llvm-269687fa350c1aa044bc063c64362a04ecabaa33.tar.gz external_llvm-269687fa350c1aa044bc063c64362a04ecabaa33.tar.bz2 |
Emit gcov data files to the directory specified in the metadata produced by the
frontend, if applicable.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130835 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Instrumentation')
-rw-r--r-- | lib/Transforms/Instrumentation/GCOVProfiling.cpp | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/lib/Transforms/Instrumentation/GCOVProfiling.cpp index 2425342..8dd82d3 100644 --- a/lib/Transforms/Instrumentation/GCOVProfiling.cpp +++ b/lib/Transforms/Instrumentation/GCOVProfiling.cpp @@ -40,7 +40,6 @@ using namespace llvm; namespace { class GCOVProfiler : public ModulePass { - bool runOnModule(Module &M); public: static char ID; GCOVProfiler() @@ -57,6 +56,8 @@ namespace { } private: + bool runOnModule(Module &M); + // Create the GCNO files for the Module based on DebugInfo. void emitGCNO(DebugInfoFinder &DIF); @@ -88,6 +89,8 @@ namespace { SmallVector<std::pair<GlobalVariable *, uint32_t>, 8> &); + std::string mangleName(DICompileUnit CU, std::string NewStem); + bool EmitNotes; bool EmitData; @@ -323,6 +326,22 @@ static std::string replaceStem(std::string OrigFilename, std::string NewStem) { return (sys::path::stem(OrigFilename) + "." + NewStem).str(); } +std::string GCOVProfiler::mangleName(DICompileUnit CU, std::string NewStem) { + if (NamedMDNode *GCov = M->getNamedMetadata("llvm.gcov")) { + for (int i = 0, e = GCov->getNumOperands(); i != e; ++i) { + MDNode *N = GCov->getOperand(i); + if (N->getNumOperands() != 2) continue; + MDString *Path = dyn_cast<MDString>(N->getOperand(0)); + MDNode *CompileUnit = dyn_cast<MDNode>(N->getOperand(1)); + if (!Path || !CompileUnit) continue; + if (CompileUnit == CU) + return (Path->getString() + "/" + + replaceStem(CU.getFilename(), NewStem)).str(); + } + } + return replaceStem(CU.getFilename(), NewStem); +} + bool GCOVProfiler::runOnModule(Module &M) { this->M = &M; Ctx = &M.getContext(); @@ -346,8 +365,8 @@ void GCOVProfiler::emitGCNO(DebugInfoFinder &DIF) { DICompileUnit CU(*I); raw_fd_ostream *&out = GcnoFiles[CU]; std::string ErrorInfo; - out = new raw_fd_ostream(replaceStem(CU.getFilename(), "gcno").c_str(), - ErrorInfo, raw_fd_ostream::F_Binary); + out = new raw_fd_ostream(mangleName(CU, "gcno").c_str(), ErrorInfo, + raw_fd_ostream::F_Binary); out->write("oncg*404MVLL", 12); } @@ -615,7 +634,7 @@ void GCOVProfiler::insertCounterWriteout( for (DebugInfoFinder::iterator CUI = DIF.compile_unit_begin(), CUE = DIF.compile_unit_end(); CUI != CUE; ++CUI) { DICompileUnit compile_unit(*CUI); - std::string FilenameGcda = replaceStem(compile_unit.getFilename(), "gcda"); + std::string FilenameGcda = mangleName(compile_unit, "gcda"); Builder.CreateCall(StartFile, Builder.CreateGlobalStringPtr(FilenameGcda)); for (SmallVector<std::pair<GlobalVariable *, uint32_t>, 8>::iterator |