blob: c089e4869880f2d1ab830c7b735966f9a3e796c1 [file] [log] [blame]
Ted Kremenek33bfb5c2008-01-11 16:36:20 +00001//= ProgramPoint.cpp - Program Points for Path-Sensitive Analysis --*- C++ -*-//
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 methods for subclasses of ProgramPoint.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/CFG.h"
15#include "clang/Analysis/ProgramPoint.h"
16
17using namespace clang;
18
19BlockEdge::BlockEdge(CFG& cfg, const CFGBlock* B1, const CFGBlock* B2) {
20 if (B1->succ_size() == 1) {
21 assert (*(B1->succ_begin()) == B2);
22 Data = reinterpret_cast<uintptr_t>(B1) | BlockEdgeSrcKind;
23 }
24 else if (B2->pred_size() == 1) {
25 assert (*(B2->pred_begin()) == B1);
26 Data = reinterpret_cast<uintptr_t>(B2) | BlockEdgeDstKind;
27 }
28 else
29 Data = reinterpret_cast<uintptr_t>(cfg.getBlockEdgeImpl(B1,B2))
30 | BlockEdgeAuxKind;
31}
32
33CFGBlock* BlockEdge::getSrc() const {
34 switch (getKind()) {
35 default:
36 assert (false && "Invalid BlockEdgeKind.");
37 return NULL;
38
39 case BlockEdgeSrcKind:
40 return reinterpret_cast<CFGBlock*>(getRawPtr());
41
42 case BlockEdgeDstKind:
43 return *(reinterpret_cast<CFGBlock*>(getRawPtr())->pred_begin());
44
45 case BlockEdgeAuxKind:
46 return reinterpret_cast<BPair*>(getRawPtr())->first;
47 }
48}
49
50CFGBlock* BlockEdge::getDst() const {
51 switch (getKind()) {
52 default:
53 assert (false && "Invalid BlockEdgeKind.");
54 return NULL;
55
56 case BlockEdgeSrcKind:
57 return *(reinterpret_cast<CFGBlock*>(getRawPtr())->succ_begin());
58
59 case BlockEdgeDstKind:
60 return reinterpret_cast<CFGBlock*>(getRawPtr());
61
62 case BlockEdgeAuxKind:
63 return reinterpret_cast<BPair*>(getRawPtr())->second;
64 }
65}