65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
//= ProgramPoint.cpp - Program Points for Path-Sensitive Analysis --*- C++ -*-//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
//  This file implements methods for subclasses of ProgramPoint.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "clang/AST/CFG.h"
 | 
						|
#include "clang/Analysis/ProgramPoint.h"
 | 
						|
 | 
						|
using namespace clang;
 | 
						|
 | 
						|
BlockEdge::BlockEdge(CFG& cfg, const CFGBlock* B1, const CFGBlock* B2) {    
 | 
						|
  if (B1->succ_size() == 1) {
 | 
						|
    assert (*(B1->succ_begin()) == B2);
 | 
						|
    setRawData(B1, BlockEdgeSrcKind);
 | 
						|
  }
 | 
						|
  else if (B2->pred_size() == 1) {
 | 
						|
    assert (*(B2->pred_begin()) == B1);
 | 
						|
    setRawData(B2, BlockEdgeDstKind);
 | 
						|
  }
 | 
						|
  else 
 | 
						|
    setRawData(cfg.getBlockEdgeImpl(B1,B2), BlockEdgeAuxKind);
 | 
						|
}
 | 
						|
 | 
						|
CFGBlock* BlockEdge::getSrc() const {
 | 
						|
  switch (getKind()) {
 | 
						|
    default:
 | 
						|
      assert (false && "Invalid BlockEdgeKind.");
 | 
						|
      return NULL;
 | 
						|
      
 | 
						|
    case BlockEdgeSrcKind:
 | 
						|
      return reinterpret_cast<CFGBlock*>(getRawPtr());
 | 
						|
      
 | 
						|
    case BlockEdgeDstKind:
 | 
						|
      return *(reinterpret_cast<CFGBlock*>(getRawPtr())->pred_begin());        
 | 
						|
      
 | 
						|
    case BlockEdgeAuxKind:
 | 
						|
      return reinterpret_cast<BPair*>(getRawPtr())->first;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
CFGBlock* BlockEdge::getDst() const {
 | 
						|
  switch (getKind()) {
 | 
						|
    default:
 | 
						|
      assert (false && "Invalid BlockEdgeKind.");
 | 
						|
      return NULL;
 | 
						|
      
 | 
						|
    case BlockEdgeSrcKind:
 | 
						|
      return *(reinterpret_cast<CFGBlock*>(getRawPtr())->succ_begin());
 | 
						|
      
 | 
						|
    case BlockEdgeDstKind:
 | 
						|
      return reinterpret_cast<CFGBlock*>(getRawPtr());
 | 
						|
      
 | 
						|
    case BlockEdgeAuxKind:
 | 
						|
      return reinterpret_cast<BPair*>(getRawPtr())->second;
 | 
						|
  }
 | 
						|
}
 |