166c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek//===--- CFGStmtMap.h - Map from Stmt* to CFGBlock* -----------*- C++ -*-===// 266c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek// 366c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek// The LLVM Compiler Infrastructure 466c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek// 566c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek// This file is distributed under the University of Illinois Open Source 666c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek// License. See LICENSE.TXT for details. 766c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek// 866c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek//===----------------------------------------------------------------------===// 966c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek// 1066c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek// This file defines the CFGStmtMap class, which defines a mapping from 1166c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek// Stmt* to CFGBlock* 1266c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek// 1366c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek//===----------------------------------------------------------------------===// 1466c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek 1566c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek#ifndef LLVM_CLANG_CFGSTMTMAP_H 1666c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek#define LLVM_CLANG_CFGSTMTMAP_H 1766c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek 1866c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek#include "clang/Analysis/CFG.h" 1966c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek 2066c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremeneknamespace clang { 2166c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek 2266c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenekclass CFG; 2366c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenekclass CFGBlock; 2466c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenekclass ParentMap; 2566c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenekclass Stmt; 2666c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek 2766c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenekclass CFGStmtMap { 2866c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek ParentMap *PM; 2966c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek void *M; 3066c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek 3166c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek CFGStmtMap(ParentMap *pm, void *m) : PM(pm), M(m) {} 3266c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek 3366c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenekpublic: 3466c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek ~CFGStmtMap(); 3566c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek 3666c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek /// Returns a new CFGMap for the given CFG. It is the caller's 3766c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek /// responsibility to 'delete' this object when done using it. 3866c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek static CFGStmtMap *Build(CFG* C, ParentMap *PM); 3966c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek 4066c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek /// Returns the CFGBlock the specified Stmt* appears in. For Stmt* that 4166c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek /// are terminators, the CFGBlock is the block they appear as a terminator, 4266c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek /// and not the block they appear as a block-level expression (e.g, '&&'). 4366c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek /// CaseStmts and LabelStmts map to the CFGBlock they label. 4466c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek CFGBlock *getBlock(Stmt * S); 4566c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek 4666c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek const CFGBlock *getBlock(const Stmt * S) const { 4766c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek return const_cast<CFGStmtMap*>(this)->getBlock(const_cast<Stmt*>(S)); 4866c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek } 4966c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek}; 5066c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek 5166c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek} // end clang namespace 5266c1eaa34103a89e127f5759755cab0c1937ce35Ted Kremenek#endif 53