aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Instrumentation/GCOVProfiling.cpp40
1 files changed, 25 insertions, 15 deletions
diff --git a/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/lib/Transforms/Instrumentation/GCOVProfiling.cpp
index ec05872179..4e63a43f83 100644
--- a/lib/Transforms/Instrumentation/GCOVProfiling.cpp
+++ b/lib/Transforms/Instrumentation/GCOVProfiling.cpp
@@ -54,6 +54,10 @@ namespace {
// Create the GCNO files for the Module based on DebugInfo.
void EmitGCNO(DebugInfoFinder &DIF);
+ // Modify the program to track transitions along edges and call into the
+ // profiling runtime to emit .gcda files when run.
+ bool EmitProfileArcs(DebugInfoFinder &DIF);
+
// Get pointers to the functions in the runtime library.
Constant *getStartFileFunc();
Constant *getEmitFunctionFunc();
@@ -285,6 +289,22 @@ namespace {
};
}
+// Replace the stem of a file, or add one if missing.
+static std::string ReplaceStem(std::string orig_filename, std::string new_stem){
+ return (sys::path::stem(orig_filename) + "." + new_stem).str();
+}
+
+bool GCOVProfiler::runOnModule(Module &M) {
+ Mod = &M;
+ Ctx = &M.getContext();
+
+ DebugInfoFinder DIF;
+ DIF.processModule(*Mod);
+
+ EmitGCNO(DIF);
+ return EmitProfileArcs(DIF);
+}
+
void GCOVProfiler::EmitGCNO(DebugInfoFinder &DIF) {
DenseMap<const MDNode *, raw_fd_ostream *> gcno_files;
for (DebugInfoFinder::iterator I = DIF.compile_unit_begin(),
@@ -296,9 +316,8 @@ void GCOVProfiler::EmitGCNO(DebugInfoFinder &DIF) {
DICompileUnit CU(*I);
raw_fd_ostream *&Out = gcno_files[CU];
std::string ErrorInfo;
- Out = new raw_fd_ostream(
- (sys::path::stem(CU.getFilename()) + ".gcno").str().c_str(),
- ErrorInfo, raw_fd_ostream::F_Binary);
+ Out = new raw_fd_ostream(ReplaceStem(CU.getFilename(), "gcno").c_str(),
+ ErrorInfo, raw_fd_ostream::F_Binary);
Out->write("oncg*404MVLL", 12);
}
@@ -342,14 +361,9 @@ void GCOVProfiler::EmitGCNO(DebugInfoFinder &DIF) {
}
}
-bool GCOVProfiler::runOnModule(Module &M) {
- Mod = &M;
- Ctx = &M.getContext();
-
- DebugInfoFinder DIF;
- DIF.processModule(*Mod);
-
- EmitGCNO(DIF);
+bool GCOVProfiler::EmitProfileArcs(DebugInfoFinder &DIF) {
+ if (DIF.subprogram_begin() == DIF.subprogram_end())
+ return false;
SmallVector<std::pair<GlobalVariable *, uint32_t>, 8> counters_by_ident;
for (DebugInfoFinder::iterator SPI = DIF.subprogram_begin(),
@@ -459,10 +473,6 @@ Constant *GCOVProfiler::getEndFileFunc() {
return Mod->getOrInsertFunction("llvm_gcda_end_file", FTy);
}
-static std::string ReplaceStem(std::string orig_filename, std::string new_stem){
- return (sys::path::stem(orig_filename) + "." + new_stem).str();
-}
-
void GCOVProfiler::InsertCounterWriteout(
DebugInfoFinder &DIF,
SmallVector<std::pair<GlobalVariable *, uint32_t>, 8> &counters_by_ident) {