forked from OSchip/llvm-project
Start to add a new transfer function that inlines callee. To be continued.
llvm-svn: 81501
This commit is contained in:
parent
bae6914314
commit
dc299bc481
|
@ -81,6 +81,8 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
GRTransferFuncs *CreateCallInliner(ASTContext &ctx);
|
||||
|
||||
} // end clang namespace
|
||||
|
||||
#endif
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
Loading…
Reference in New Issue