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
diff --git a/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/lib/Transforms/Instrumentation/GCOVProfiling.cpp
index 4e63a43..a3ad5fe 100644
--- a/lib/Transforms/Instrumentation/GCOVProfiling.cpp
+++ b/lib/Transforms/Instrumentation/GCOVProfiling.cpp
@@ -43,7 +43,13 @@
     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 @@
                                SmallVector<std::pair<GlobalVariable *,
                                                      uint32_t>, 8> &);
 
+    bool EmitNotes;
+    bool EmitData;
+
     Module *Mod;
     LLVMContext *Ctx;
   };
@@ -79,7 +88,9 @@
 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 @@
   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) {