//===--- 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/Checker/PathSensitive/CheckerVisitor.h" #include "clang/Checker/PathSensitive/GRState.h" #include "clang/Checker/Checkers/LocalCheckers.h" using namespace clang; namespace { class CallInliner : public Checker { public: static void *getTag() { static int x; return &x; } virtual bool EvalCallExpr(CheckerContext &C, const CallExpr *CE); }; } void clang::RegisterCallInliner(GRExprEngine &Eng) { Eng.registerCheck(new CallInliner()); } bool CallInliner::EvalCallExpr(CheckerContext &C, const CallExpr *CE) { const GRState *state = C.getState(); const Expr *Callee = CE->getCallee(); SVal L = state->getSVal(Callee); const FunctionDecl *FD = L.getAsFunctionDecl(); if (!FD) return false; if (!FD->hasBody(FD)) return false; // Now we have the definition of the callee, create a CallEnter node. CallEnter Loc(CE, FD, C.getPredecessor()->getLocationContext()); C.addTransition(state, Loc); return true; }