Start to add a new transfer function that inlines callee. To be continued.

llvm-svn: 81501
This commit is contained in:
Zhongxing Xu 2009-09-11 04:13:42 +00:00
parent bae6914314
commit dc299bc481
4 changed files with 69 additions and 0 deletions

View File

@ -81,6 +81,8 @@ public:
}
};
GRTransferFuncs *CreateCallInliner(ASTContext &ctx);
} // end clang namespace
#endif

View File

@ -48,6 +48,10 @@ ANALYSIS(WarnObjCUnusedIvars, "warn-objc-unused-ivars",
ANALYSIS(CheckerCFRef, "checker-cfref",
"Run the [Core] Foundation reference count checker", Code)
ANALYSIS(InlineCall, "inline-call",
"Experimental transfer function inling callees when its definition"
" is available.", TranslationUnit)
#ifndef ANALYSIS_STORE
#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN)
#endif

View File

@ -0,0 +1,41 @@
//===--- CallInliner.cpp - Transfer function that inlines callee ----------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements the callee inlining transfer function.
//
//===----------------------------------------------------------------------===//
#include "clang/Analysis/PathSensitive/GRTransferFuncs.h"
using namespace clang;
namespace {
class VISIBILITY_HIDDEN CallInliner : public GRTransferFuncs {
ASTContext &Ctx;
public:
CallInliner(ASTContext &ctx) : Ctx(ctx) {}
void EvalCall(ExplodedNodeSet& Dst, GRExprEngine& Engine,
GRStmtNodeBuilder& Builder, CallExpr* CE, SVal L,
ExplodedNode* Pred);
};
}
void CallInliner::EvalCall(ExplodedNodeSet& Dst, GRExprEngine& Engine,
GRStmtNodeBuilder& Builder, CallExpr* CE, SVal L,
ExplodedNode* Pred) {
assert(0 && "TO BE IMPLEMENTED");
}
GRTransferFuncs *clang::CreateCallInliner(ASTContext &ctx) {
return new CallInliner(ctx);
}

View File

@ -412,6 +412,28 @@ static void ActionWarnObjCMethSigs(AnalysisManager& mgr, Decl *D) {
CheckObjCInstMethSignature(cast<ObjCImplementationDecl>(D), BR);
}
static void ActionInlineCall(AnalysisManager &mgr, Decl *D) {
if (!D)
return;
llvm::OwningPtr<GRTransferFuncs> TF(CreateCallInliner(mgr.getASTContext()));
// Construct the analysis engine.
GRExprEngine Eng(mgr);
Eng.setTransferFunctions(TF.get());
Eng.RegisterInternalChecks();
RegisterAppleChecks(Eng, *D);
// Execute the worklist algorithm.
Eng.ExecuteWorkList(mgr.getStackFrame(D));
// Visualize the exploded graph.
if (mgr.shouldVisualizeGraphviz())
Eng.ViewGraph(mgr.shouldTrimGraph());
}
//===----------------------------------------------------------------------===//
// AnalysisConsumer creation.
//===----------------------------------------------------------------------===//