From a61e52c9b7cf874b46cef687c1c4627a35952542 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Thu, 21 Apr 2011 01:56:25 +0000 Subject: [PATCH] Add independent controls for whether GCOV profiling should emit .gcno files or instrument the program to emit .gcda. TODO: we should emit slightly different .gcda files when .gcno emission is off. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129903 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/LinkAllPasses.h | 2 +- include/llvm/Transforms/Instrumentation.h | 2 +- .../Instrumentation/GCOVProfiling.cpp | 20 +++++++++++++++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/include/llvm/LinkAllPasses.h b/include/llvm/LinkAllPasses.h index 56c113b4528..88ee65ac311 100644 --- a/include/llvm/LinkAllPasses.h +++ b/include/llvm/LinkAllPasses.h @@ -70,7 +70,7 @@ namespace { (void) llvm::createEdgeProfilerPass(); (void) llvm::createOptimalEdgeProfilerPass(); (void) llvm::createPathProfilerPass(); - (void) llvm::createGCOVProfilerPass(); + (void) llvm::createGCOVProfilerPass(true, true); (void) llvm::createFunctionInliningPass(); (void) llvm::createAlwaysInlinerPass(); (void) llvm::createGlobalDCEPass(); diff --git a/include/llvm/Transforms/Instrumentation.h b/include/llvm/Transforms/Instrumentation.h index 3ef2f5a14d0..088775a9dfe 100644 --- a/include/llvm/Transforms/Instrumentation.h +++ b/include/llvm/Transforms/Instrumentation.h @@ -28,7 +28,7 @@ ModulePass *createOptimalEdgeProfilerPass(); ModulePass *createPathProfilerPass(); // Insert GCOV profiling instrumentation -ModulePass *createGCOVProfilerPass(); +ModulePass *createGCOVProfilerPass(bool EmitNotes = true, bool EmitData = true); } // End llvm namespace diff --git a/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/lib/Transforms/Instrumentation/GCOVProfiling.cpp index 4e63a43f831..a3ad5fe2e2d 100644 --- a/lib/Transforms/Instrumentation/GCOVProfiling.cpp +++ b/lib/Transforms/Instrumentation/GCOVProfiling.cpp @@ -43,7 +43,13 @@ namespace { bool runOnModule(Module &M); public: static char ID; - GCOVProfiler() : ModulePass(ID) { + GCOVProfiler() + : ModulePass(ID), EmitNotes(true), EmitData(true) { + initializeGCOVProfilerPass(*PassRegistry::getPassRegistry()); + } + GCOVProfiler(bool EmitNotes, bool EmitData) + : ModulePass(ID), EmitNotes(EmitNotes), EmitData(EmitData) { + assert((EmitNotes || EmitData) && "GCOVProfiler asked to do nothing?"); initializeGCOVProfilerPass(*PassRegistry::getPassRegistry()); } virtual const char *getPassName() const { @@ -70,6 +76,9 @@ namespace { SmallVector, 8> &); + bool EmitNotes; + bool EmitData; + Module *Mod; LLVMContext *Ctx; }; @@ -79,7 +88,9 @@ char GCOVProfiler::ID = 0; INITIALIZE_PASS(GCOVProfiler, "insert-gcov-profiling", "Insert instrumentation for GCOV profiling", false, false) -ModulePass *llvm::createGCOVProfilerPass() { return new GCOVProfiler(); } +ModulePass *llvm::createGCOVProfilerPass(bool EmitNotes, bool EmitData) { + return new GCOVProfiler(EmitNotes, EmitData); +} static DISubprogram FindSubprogram(DIScope scope) { while (!scope.isSubprogram()) { @@ -301,8 +312,9 @@ bool GCOVProfiler::runOnModule(Module &M) { DebugInfoFinder DIF; DIF.processModule(*Mod); - EmitGCNO(DIF); - return EmitProfileArcs(DIF); + if (EmitNotes) EmitGCNO(DIF); + if (EmitData) return EmitProfileArcs(DIF); + return false; } void GCOVProfiler::EmitGCNO(DebugInfoFinder &DIF) {