1ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek//==- ProgramPoint.cpp - Program Points for Path-Sensitive Analysis -*- C++ -*-/
2ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek//
3ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek//                     The LLVM Compiler Infrastructure
4ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek//
5ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek// This file is distributed under the University of Illinois Open Source
6ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek// License. See LICENSE.TXT for details.
7ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek//
8ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek//===----------------------------------------------------------------------===//
9ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek//
10ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek//  This file defines the interface ProgramPoint, which identifies a
11ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek//  distinct location in a function.
12ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek//
13ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek//===----------------------------------------------------------------------===//
14ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek
15ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek#include "clang/Analysis/ProgramPoint.h"
16ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek
17ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenekusing namespace clang;
18ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek
19ca804539d908d3a0e8c72a0df5f1f571d29490bbTed KremenekProgramPointTag::~ProgramPointTag() {}
20ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek
2163d3201619fdac284adfd3b9328562fa20a01c40Anna ZaksProgramPoint ProgramPoint::getProgramPoint(const Stmt *S, ProgramPoint::Kind K,
2263d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks                                           const LocationContext *LC,
2363d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks                                           const ProgramPointTag *tag){
2463d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks  switch (K) {
2563d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks    default:
2663d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks      llvm_unreachable("Unhandled ProgramPoint kind");
2763d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks    case ProgramPoint::PreStmtKind:
2863d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks      return PreStmt(S, LC, tag);
2963d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks    case ProgramPoint::PostStmtKind:
3063d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks      return PostStmt(S, LC, tag);
3163d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks    case ProgramPoint::PreLoadKind:
3263d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks      return PreLoad(S, LC, tag);
3363d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks    case ProgramPoint::PostLoadKind:
3463d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks      return PostLoad(S, LC, tag);
3563d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks    case ProgramPoint::PreStoreKind:
3663d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks      return PreStore(S, LC, tag);
3763d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks    case ProgramPoint::PostLValueKind:
3863d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks      return PostLValue(S, LC, tag);
390b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks    case ProgramPoint::PostStmtPurgeDeadSymbolsKind:
400b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks      return PostStmtPurgeDeadSymbols(S, LC, tag);
410b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks    case ProgramPoint::PreStmtPurgeDeadSymbolsKind:
420b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks      return PreStmtPurgeDeadSymbols(S, LC, tag);
4363d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks  }
4463d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks}
4563d3201619fdac284adfd3b9328562fa20a01c40Anna Zaks
46651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesSimpleProgramPointTag::SimpleProgramPointTag(StringRef MsgProvider,
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                             StringRef Msg)
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  : Desc((MsgProvider + " : " + Msg).str()) {}
49ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek
50ca804539d908d3a0e8c72a0df5f1f571d29490bbTed KremenekStringRef SimpleProgramPointTag::getTagDescription() const {
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Desc;
52ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek}
53