blob: 88e1a05d1191b9d4c090bf24b988190b3486b570 [file] [log] [blame]
Zhongxing Xu66847a22009-09-11 04:13:42 +00001//===--- CallInliner.cpp - Transfer function that inlines callee ----------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the callee inlining transfer function.
11//
12//===----------------------------------------------------------------------===//
13
Ted Kremenek1309f9a2010-01-25 04:41:41 +000014#include "clang/Checker/PathSensitive/CheckerVisitor.h"
15#include "clang/Checker/PathSensitive/GRState.h"
Ted Kremenek97053092010-01-26 22:59:55 +000016#include "clang/Checker/Checkers/LocalCheckers.h"
Zhongxing Xu66847a22009-09-11 04:13:42 +000017
18using namespace clang;
19
20namespace {
Zhongxing Xu3ff84812009-12-23 08:56:18 +000021class CallInliner : public Checker {
Zhongxing Xu66847a22009-09-11 04:13:42 +000022public:
Zhongxing Xu3ff84812009-12-23 08:56:18 +000023 static void *getTag() {
24 static int x;
25 return &x;
26 }
Zhongxing Xu66847a22009-09-11 04:13:42 +000027
Zhongxing Xu3ff84812009-12-23 08:56:18 +000028 virtual bool EvalCallExpr(CheckerContext &C, const CallExpr *CE);
Zhongxing Xu66847a22009-09-11 04:13:42 +000029};
Zhongxing Xu66847a22009-09-11 04:13:42 +000030}
31
Zhongxing Xu3ff84812009-12-23 08:56:18 +000032void clang::RegisterCallInliner(GRExprEngine &Eng) {
33 Eng.registerCheck(new CallInliner());
34}
35
36bool CallInliner::EvalCallExpr(CheckerContext &C, const CallExpr *CE) {
37 const GRState *state = C.getState();
38 const Expr *Callee = CE->getCallee();
Ted Kremenek13976632010-02-08 16:18:51 +000039 SVal L = state->getSVal(Callee);
Zhongxing Xu62d399e2009-12-24 03:34:38 +000040
Zhongxing Xu3ff84812009-12-23 08:56:18 +000041 const FunctionDecl *FD = L.getAsFunctionDecl();
Zhongxing Xuc9f4af62009-10-13 02:36:42 +000042 if (!FD)
Zhongxing Xu3ff84812009-12-23 08:56:18 +000043 return false;
44
Zhongxing Xu6b601392010-02-28 06:39:11 +000045 if (!FD->getBody(FD))
Zhongxing Xu3ff84812009-12-23 08:56:18 +000046 return false;
Zhongxing Xuc9f4af62009-10-13 02:36:42 +000047
Douglas Gregor102acd52010-02-25 19:01:53 +000048 // Now we have the definition of the callee, create a CallEnter node.
49 CallEnter Loc(CE, FD, C.getPredecessor()->getLocationContext());
50 C.addTransition(state, Loc);
Zhongxing Xu3ff84812009-12-23 08:56:18 +000051
52 return true;
Zhongxing Xu66847a22009-09-11 04:13:42 +000053}
Zhongxing Xu3ff84812009-12-23 08:56:18 +000054