aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Driver/ASTConsumers.cpp34
-rw-r--r--Driver/ASTConsumers.h4
-rw-r--r--Driver/clang.cpp12
3 files changed, 41 insertions, 9 deletions
diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp
index 73f843f27a..9759e9af73 100644
--- a/Driver/ASTConsumers.cpp
+++ b/Driver/ASTConsumers.cpp
@@ -23,6 +23,7 @@
#include "clang/Analysis/Analyses/GRSimpleVals.h"
#include "clang/Analysis/LocalCheckers.h"
#include "llvm/Support/Streams.h"
+#include "llvm/Support/Timer.h"
using namespace clang;
//===----------------------------------------------------------------------===//
@@ -581,22 +582,43 @@ namespace {
Diagnostic &Diags;
ASTContext* Ctx;
bool Visualize;
+ std::string FName;
public:
- GRSimpleValsVisitor(Diagnostic &diags, bool visualize)
- : Diags(diags), Visualize(visualize) {}
+ GRSimpleValsVisitor(Diagnostic &diags, const std::string& fname, bool visualize)
+ : Diags(diags), Visualize(visualize), FName(fname) {}
virtual void Initialize(ASTContext &Context) { Ctx = &Context; }
virtual void VisitCFG(CFG& C, FunctionDecl&);
- virtual bool printFuncDeclStart() { return Visualize; }
+ virtual bool printFuncDeclStart() { return false; }
};
} // end anonymous namespace
-ASTConsumer* clang::CreateGRSimpleVals(Diagnostic &Diags, bool Visualize) {
- return new GRSimpleValsVisitor(Diags, Visualize);
+ASTConsumer* clang::CreateGRSimpleVals(Diagnostic &Diags,
+ const std::string& FunctionName,
+ bool Visualize) {
+
+ return new GRSimpleValsVisitor(Diags, FunctionName, Visualize);
}
void GRSimpleValsVisitor::VisitCFG(CFG& C, FunctionDecl& FD) {
- RunGRSimpleVals(C, FD, *Ctx, Diags, Visualize);
+ if (FName.size() > 0 && FName != FD.getIdentifier()->getName())
+ return;
+
+ if (!Visualize) {
+ llvm::cerr << "ANALYZE: " << FD.getIdentifier()->getName() << ' '
+ << Ctx->getSourceManager().getSourceName(FD.getLocation())
+ << ' ';
+
+ llvm::Timer T("GRSimpleVals");
+ T.startTimer();
+ RunGRSimpleVals(C, FD, *Ctx, Diags, Visualize);
+ T.stopTimer();
+ llvm::cerr << T.getWallTime() << '\n';
+ }
+ else {
+ llvm::cerr << '\n';
+ RunGRSimpleVals(C, FD, *Ctx, Diags, Visualize);
+ }
}
//===----------------------------------------------------------------------===//
diff --git a/Driver/ASTConsumers.h b/Driver/ASTConsumers.h
index 1ea8b1490b..005f797e43 100644
--- a/Driver/ASTConsumers.h
+++ b/Driver/ASTConsumers.h
@@ -42,7 +42,9 @@ ASTConsumer *CreateDeadStoreChecker(Diagnostic &Diags);
ASTConsumer *CreateUnitValsChecker(Diagnostic &Diags);
-ASTConsumer *CreateGRSimpleVals(Diagnostic &Diags, bool Visualize = false);
+ASTConsumer *CreateGRSimpleVals(Diagnostic &Diags,
+ const std::string& Function,
+ bool Visualize = false);
ASTConsumer *CreateCodeRewriterTest(const std::string& InFile,
Diagnostic &Diags);
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index 4c6a47c90d..08eef52acc 100644
--- a/Driver/clang.cpp
+++ b/Driver/clang.cpp
@@ -449,6 +449,14 @@ static void InitializeDiagnostics(Diagnostic &Diags) {
}
//===----------------------------------------------------------------------===//
+// Analysis-specific options.
+//===----------------------------------------------------------------------===//
+
+static llvm::cl::opt<std::string>
+AnalyzeSpecificFunction("analyze-function",
+ llvm::cl::desc("Run analysis on specific function."));
+
+//===----------------------------------------------------------------------===//
// Target Triple Processing.
//===----------------------------------------------------------------------===//
@@ -982,10 +990,10 @@ static ASTConsumer* CreateASTConsumer(const std::string& InFile,
return CreateUnitValsChecker(Diag);
case AnalysisGRSimpleVals:
- return CreateGRSimpleVals(Diag);
+ return CreateGRSimpleVals(Diag, AnalyzeSpecificFunction);
case AnalysisGRSimpleValsView:
- return CreateGRSimpleVals(Diag, true);
+ return CreateGRSimpleVals(Diag, AnalyzeSpecificFunction, true);
case TestSerialization:
return CreateSerializationTest(Diag, FileMgr, LangOpts);