1*67e74705SXin Li //==- ProgramPoint.cpp - Program Points for Path-Sensitive Analysis -*- C++ -*-/
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file defines the interface ProgramPoint, which identifies a
11*67e74705SXin Li // distinct location in a function.
12*67e74705SXin Li //
13*67e74705SXin Li //===----------------------------------------------------------------------===//
14*67e74705SXin Li
15*67e74705SXin Li #include "clang/Analysis/ProgramPoint.h"
16*67e74705SXin Li
17*67e74705SXin Li using namespace clang;
18*67e74705SXin Li
~ProgramPointTag()19*67e74705SXin Li ProgramPointTag::~ProgramPointTag() {}
20*67e74705SXin Li
getProgramPoint(const Stmt * S,ProgramPoint::Kind K,const LocationContext * LC,const ProgramPointTag * tag)21*67e74705SXin Li ProgramPoint ProgramPoint::getProgramPoint(const Stmt *S, ProgramPoint::Kind K,
22*67e74705SXin Li const LocationContext *LC,
23*67e74705SXin Li const ProgramPointTag *tag){
24*67e74705SXin Li switch (K) {
25*67e74705SXin Li default:
26*67e74705SXin Li llvm_unreachable("Unhandled ProgramPoint kind");
27*67e74705SXin Li case ProgramPoint::PreStmtKind:
28*67e74705SXin Li return PreStmt(S, LC, tag);
29*67e74705SXin Li case ProgramPoint::PostStmtKind:
30*67e74705SXin Li return PostStmt(S, LC, tag);
31*67e74705SXin Li case ProgramPoint::PreLoadKind:
32*67e74705SXin Li return PreLoad(S, LC, tag);
33*67e74705SXin Li case ProgramPoint::PostLoadKind:
34*67e74705SXin Li return PostLoad(S, LC, tag);
35*67e74705SXin Li case ProgramPoint::PreStoreKind:
36*67e74705SXin Li return PreStore(S, LC, tag);
37*67e74705SXin Li case ProgramPoint::PostLValueKind:
38*67e74705SXin Li return PostLValue(S, LC, tag);
39*67e74705SXin Li case ProgramPoint::PostStmtPurgeDeadSymbolsKind:
40*67e74705SXin Li return PostStmtPurgeDeadSymbols(S, LC, tag);
41*67e74705SXin Li case ProgramPoint::PreStmtPurgeDeadSymbolsKind:
42*67e74705SXin Li return PreStmtPurgeDeadSymbols(S, LC, tag);
43*67e74705SXin Li }
44*67e74705SXin Li }
45*67e74705SXin Li
SimpleProgramPointTag(StringRef MsgProvider,StringRef Msg)46*67e74705SXin Li SimpleProgramPointTag::SimpleProgramPointTag(StringRef MsgProvider,
47*67e74705SXin Li StringRef Msg)
48*67e74705SXin Li : Desc((MsgProvider + " : " + Msg).str()) {}
49*67e74705SXin Li
getTagDescription() const50*67e74705SXin Li StringRef SimpleProgramPointTag::getTagDescription() const {
51*67e74705SXin Li return Desc;
52*67e74705SXin Li }
53