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
This commit is contained in:
Nick Lewycky 2011-04-21 01:56:25 +00:00
parent 333ed454d0
commit a61e52c9b7
3 changed files with 18 additions and 6 deletions

View File

@ -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();

View File

@ -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

View File

@ -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<std::pair<GlobalVariable *,
uint32_t>, 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) {