Static Value-Flow Analysis
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
SVF::TCT Class Reference

#include <TCT.h>

Inheritance diagram for SVF::TCT:
SVF::GenericGraph< NodeTy, EdgeTy >

Public Types

typedef SVFLoopAndDomInfo::LoopBBs LoopBBs
 
typedef TCTEdge::ThreadCreateEdgeSet ThreadCreateEdgeSet
 
typedef ThreadCreateEdgeSet::iterator TCTNodeIter
 
typedef Set< const SVFFunction * > FunSet
 
typedef std::vector< const ICFGNode * > InstVec
 
typedef Set< const ICFGNode * > InstSet
 
typedef Set< const PTACallGraphNode * > PTACGNodeSet
 
typedef Map< CxtThread, TCTNode * > CxtThreadToNodeMap
 
typedef Map< CxtThread, CallStrCxtCxtThreadToForkCxt
 
typedef Map< CxtThread, const SVFFunction * > CxtThreadToFun
 
typedef Map< const ICFGNode *, LoopBBsInstToLoopMap
 
typedef FIFOWorkList< CxtThreadProcCxtThreadProcVec
 
typedef Set< CxtThreadProcCxtThreadProcSet
 
typedef SCCDetection< PTACallGraph * > ThreadCallGraphSCC
 
- Public Types inherited from SVF::GenericGraph< NodeTy, EdgeTy >
typedef NodeTy NodeType
 
typedef EdgeTy EdgeType
 
typedef OrderedMap< NodeID, NodeType * > IDToNodeMapTy
 NodeID to GenericNode map.
 
typedef IDToNodeMapTy::iterator iterator
 Node Iterators.
 
typedef IDToNodeMapTy::const_iterator const_iterator
 

Public Member Functions

 TCT (PointerAnalysis *p)
 Constructor.
 
virtual ~TCT ()
 Destructor.
 
SVFModulegetSVFModule () const
 Get SVFFModule.
 
ThreadCallGraphgetThreadCallGraph () const
 Get TCG.
 
PointerAnalysisgetPTA () const
 Get PTA.
 
TCTNodegetTCTNode (NodeID id) const
 Get TCT node.
 
TCTEdgehasGraphEdge (TCTNode *src, TCTNode *dst, TCTEdge::CEDGEK kind) const
 Whether we have already created this call graph edge.
 
TCTEdgegetGraphEdge (TCTNode *src, TCTNode *dst, TCTEdge::CEDGEK kind)
 Get call graph edge via nodes.
 
ThreadCreateEdgeSet::const_iterator getChildrenBegin (const TCTNode *node) const
 Get children and parent nodes.
 
ThreadCreateEdgeSet::const_iterator getChildrenEnd (const TCTNode *node) const
 
ThreadCreateEdgeSet::const_iterator getParentsBegin (const TCTNode *node) const
 
ThreadCreateEdgeSet::const_iterator getParentsEnd (const TCTNode *node) const
 
const FunSetgetMakredProcs () const
 Get marked candidate functions.
 
const FunSetgetEntryProcs () const
 Get marked candidate functions.
 
u32_t getTCTNodeNum () const
 Get Statistics.
 
u32_t getTCTEdgeNum () const
 
u32_t getMaxCxtSize () const
 
bool isExtCall (const ICFGNode *inst)
 Whether it is calling an external function.
 
bool isCallSite (const ICFGNode *inst)
 Whether it is a callsite.
 
bool hasTCTNode (const CxtThread &ct) const
 Find/Get TCT node.
 
TCTNodegetTCTNode (const CxtThread &ct) const
 
bool isCandidateFun (const PTACallGraph::FunctionSet &callees) const
 Whether it is a candidate function for indirect call.
 
bool isCandidateFun (const SVFFunction *fun) const
 
bool inSameCallGraphSCC (const PTACallGraphNode *src, const PTACallGraphNode *dst)
 Whether two functions in the same callgraph scc.
 
bool hasParentThread (NodeID tid) const
 Get parent and sibling threads.
 
NodeID getParentThread (NodeID tid) const
 Get parent thread.
 
const NodeBS getAncestorThread (NodeID tid) const
 Get all ancestor threads.
 
const NodeBS getSiblingThread (NodeID tid) const
 Get sibling threads.
 
const CallStrCxtgetCxtOfCxtThread (const CxtThread &ct) const
 get the context of a thread at its spawning site (fork site)
 
const SVFFunctiongetStartRoutineOfCxtThread (const CxtThread &ct) const
 get the start routine function of a thread
 
LoopBBsgetJoinLoop (const CallICFGNode *join)
 Get loop for join site.
 
bool hasJoinLoop (const CallICFGNode *join) const
 
bool hasLoop (const SVFBasicBlock *bb) const
 
bool hasLoop (const ICFGNode *inst) const
 
bool isJoinMustExecutedInLoop (const LoopBBs &lp, const ICFGNode *join)
 Return true if a join instruction must be executed inside a loop.
 
const LoopBBsgetLoop (const ICFGNode *inst)
 Get loop for an instruction.
 
const LoopBBsgetLoop (const SVFBasicBlock *bb)
 Get loop for fork/join site.
 
void pushCxt (CallStrCxt &cxt, const CallICFGNode *call, const SVFFunction *callee)
 Push calling context.
 
bool matchCxt (CallStrCxt &cxt, const CallICFGNode *call, const SVFFunction *callee)
 Match context.
 
void pushCxt (CallStrCxt &cxt, CallSiteID csId)
 
bool isJoinSiteInRecursion (const CallICFGNode *join) const
 Whether a join site is in recursion.
 
void dumpCxt (CallStrCxt &cxt)
 Dump calling context.
 
void dump (const std::string &filename)
 Dump the graph.
 
void print () const
 Print TCT information.
 
- Public Member Functions inherited from SVF::GenericGraph< NodeTy, EdgeTy >
 GenericGraph ()
 Constructor.
 
virtual ~GenericGraph ()
 Destructor.
 
void destroy ()
 Release memory.
 
iterator begin ()
 Iterators.
 
iterator end ()
 
const_iterator begin () const
 
const_iterator end () const
 
void addGNode (NodeID id, NodeType *node)
 Add a Node.
 
NodeTypegetGNode (NodeID id) const
 Get a node.
 
bool hasGNode (NodeID id) const
 Has a node.
 
void removeGNode (NodeType *node)
 Delete a node.
 
u32_t getTotalNodeNum () const
 Get total number of node/edge.
 
u32_t getTotalEdgeNum () const
 
void incNodeNum ()
 Increase number of node/edge.
 
void incEdgeNum ()
 

Private Member Functions

TCTNodeaddTCTNode (const CxtThread &ct)
 Add TCT node.
 
bool addTCTEdge (TCTNode *src, TCTNode *dst)
 Add TCT edge.
 
void build ()
 Build TCT.
 
void markRelProcs ()
 Mark relevant procedures that are backward reachable from any fork/join site.
 
void markRelProcs (const SVFFunction *fun)
 
void collectEntryFunInCallGraph ()
 Get entry functions that are neither called by other functions nor extern functions.
 
void collectMultiForkedThreads ()
 
void collectLoopInfoForJoin ()
 Handle join site in loop.
 
bool isLoopHeaderOfJoinLoop (const SVFBasicBlock *bb)
 Whether a given bb is a loop head of a inloop join site.
 
bool isLoopExitOfJoinLoop (const SVFBasicBlock *bb)
 Whether a given bb is an exit of a inloop join site.
 
bool isInLoopInstruction (const ICFGNode *inst)
 Multi-forked threads.
 
bool isInRecursion (const ICFGNode *inst) const
 Whether an instruction is in a recursion.
 
void handleCallRelation (CxtThreadProc &ctp, const PTACallGraphEdge *cgEdge, const CallICFGNode *call)
 Handle call relations.
 
TCTNodegetOrCreateTCTNode (const CallStrCxt &cxt, const ICFGNode *fork, const CallStrCxt &oldCxt, const SVFFunction *routine)
 Get or create a tct node based on CxtThread.
 
void setMultiForkedAttrs (CxtThread &ct)
 Set multi-forked thread attributes.
 
void addCxtOfCxtThread (const CallStrCxt &cxt, const CxtThread &ct)
 Add context for a thread at its spawning site (fork site)
 
void addStartRoutineOfCxtThread (const SVFFunction *fun, const CxtThread &ct)
 Add start routine function of a cxt thread.
 
bool pushToCTPWorkList (const CxtThreadProc &ctp)
 WorkList helper functions.
 
CxtThreadProc popFromCTPWorkList ()
 
bool isVisitedCTPs (const CxtThreadProc &ctp) const
 
void destroy ()
 Clean up memory.
 

Private Attributes

ThreadCallGraphtcg
 
PointerAnalysispta
 
u32_t TCTNodeNum
 
u32_t TCTEdgeNum
 
u32_t MaxCxtSize
 
FunSet entryFuncSet
 
FunSet candidateFuncSet
 Procedures that are neither called by other functions nor extern functions.
 
ThreadCallGraphSCCtcgSCC
 Procedures we care about during call graph traversing when creating TCT.
 
CxtThreadProcVec ctpList
 Thread call graph SCC.
 
CxtThreadProcSet visitedCTPs
 CxtThreadProc List.
 
CxtThreadToNodeMap ctpToNodeMap
 Record all visited ctps.
 
CxtThreadToForkCxt ctToForkCxtMap
 Map a ctp to its graph node.
 
CxtThreadToFun ctToRoutineFunMap
 Map a CxtThread to the context at its spawning site (fork site).
 
InstToLoopMap joinSiteToLoopMap
 Map a CxtThread to its start routine function.
 
Set< const ICFGNode * > inRecurJoinSites
 Fork or Join sites in recursions.
 

Additional Inherited Members

- Public Attributes inherited from SVF::GenericGraph< NodeTy, EdgeTy >
u32_t edgeNum
 total num of node
 
u32_t nodeNum
 total num of edge
 
- Protected Attributes inherited from SVF::GenericGraph< NodeTy, EdgeTy >
IDToNodeMapTy IDToNodeMap
 node map
 

Detailed Description

Definition at line 153 of file TCT.h.

Member Typedef Documentation

◆ CxtThreadProcSet

Definition at line 169 of file TCT.h.

◆ CxtThreadProcVec

Definition at line 168 of file TCT.h.

◆ CxtThreadToForkCxt

Definition at line 165 of file TCT.h.

◆ CxtThreadToFun

Definition at line 166 of file TCT.h.

◆ CxtThreadToNodeMap

Definition at line 164 of file TCT.h.

◆ FunSet

Definition at line 160 of file TCT.h.

◆ InstSet

Definition at line 162 of file TCT.h.

◆ InstToLoopMap

Definition at line 167 of file TCT.h.

◆ InstVec

Definition at line 161 of file TCT.h.

◆ LoopBBs

Definition at line 157 of file TCT.h.

◆ PTACGNodeSet

Definition at line 163 of file TCT.h.

◆ TCTNodeIter

typedef ThreadCreateEdgeSet::iterator SVF::TCT::TCTNodeIter

Definition at line 159 of file TCT.h.

◆ ThreadCallGraphSCC

Definition at line 170 of file TCT.h.

◆ ThreadCreateEdgeSet

Definition at line 158 of file TCT.h.

Constructor & Destructor Documentation

◆ TCT()

SVF::TCT::TCT ( PointerAnalysis p)
inline

Constructor.

Definition at line 173 of file TCT.h.

174 {
175 tcg = SVFUtil::cast<ThreadCallGraph>(pta->getCallGraph());
177 //tcg->updateJoinEdge(pta);
179 tcgSCC->find();
180 build();
181 }
cJSON * p
Definition cJSON.cpp:2559
PTACallGraph * getCallGraph() const
Return call graph.
CallGraphSCC * getCallGraphSCC() const
Return call graph SCC.
ThreadCallGraphSCC * tcgSCC
Procedures we care about during call graph traversing when creating TCT.
Definition TCT.h:590
u32_t TCTNodeNum
Definition TCT.h:445
u32_t TCTEdgeNum
Definition TCT.h:446
PointerAnalysis * pta
Definition TCT.h:444
u32_t MaxCxtSize
Definition TCT.h:447
void build()
Build TCT.
Definition TCT.cpp:384
ThreadCallGraph * tcg
Definition TCT.h:443
void updateCallGraph(PointerAnalysis *pta)
Update call graph using pointer results.

◆ ~TCT()

virtual SVF::TCT::~TCT ( )
inlinevirtual

Destructor.

Definition at line 184 of file TCT.h.

185 {
186 destroy();
187 }
void destroy()
Clean up memory.
Definition TCT.h:581

Member Function Documentation

◆ addCxtOfCxtThread()

void SVF::TCT::addCxtOfCxtThread ( const CallStrCxt cxt,
const CxtThread ct 
)
inlineprivate

Add context for a thread at its spawning site (fork site)

Definition at line 549 of file TCT.h.

550 {
551 ctToForkCxtMap[ct] = cxt;
552 }
CxtThreadToForkCxt ctToForkCxtMap
Map a ctp to its graph node.
Definition TCT.h:594
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:74

◆ addStartRoutineOfCxtThread()

void SVF::TCT::addStartRoutineOfCxtThread ( const SVFFunction fun,
const CxtThread ct 
)
inlineprivate

Add start routine function of a cxt thread.

Definition at line 554 of file TCT.h.

555 {
556 ctToRoutineFunMap[ct] = fun;
557 }
CxtThreadToFun ctToRoutineFunMap
Map a CxtThread to the context at its spawning site (fork site).
Definition TCT.h:595

◆ addTCTEdge()

bool SVF::TCT::addTCTEdge ( TCTNode src,
TCTNode dst 
)
inlineprivate

Add TCT edge.

Definition at line 461 of file TCT.h.

462 {
464 {
465 TCTEdge* edge = new TCTEdge(src, dst, TCTEdge::ThreadCreateEdge);
466 dst->addIncomingEdge(edge);
467 src->addOutgoingEdge(edge);
468 TCTEdgeNum++;
469 return true;
470 }
471 return false;
472 }
@ ThreadCreateEdge
Definition TCT.h:55
TCTEdge * hasGraphEdge(TCTNode *src, TCTNode *dst, TCTEdge::CEDGEK kind) const
Whether we have already created this call graph edge.
Definition TCT.cpp:535

◆ addTCTNode()

TCTNode * SVF::TCT::addTCTNode ( const CxtThread ct)
inlineprivate

Add TCT node.

Definition at line 450 of file TCT.h.

451 {
452 assert(ctpToNodeMap.find(ct)==ctpToNodeMap.end() && "Already has this node!!");
453 NodeID id = TCTNodeNum;
454 TCTNode* node = new TCTNode(id, ct);
455 addGNode(id, node);
456 TCTNodeNum++;
457 ctpToNodeMap[ct] = node;
458 return node;
459 }
void addGNode(NodeID id, NodeType *node)
Add a Node.
CxtThreadToNodeMap ctpToNodeMap
Record all visited ctps.
Definition TCT.h:593
u32_t NodeID
Definition GeneralType.h:55

◆ build()

void TCT::build ( )
private

Build TCT.

Start building TCT

Definition at line 384 of file TCT.cpp.

385{
386
387 markRelProcs();
388
390
391 // the fork site of main function is initialized with nullptr.
392 // the context of main is initialized with empty
393 // start routine is empty
394
396 for (FunSet::iterator it=entryFuncSet.begin(), eit=entryFuncSet.end(); it!=eit; ++it)
397 {
398 if (!isCandidateFun(*it))
399 continue;
400 CallStrCxt cxt;
401 TCTNode* mainTCTNode = getOrCreateTCTNode(cxt, nullptr, cxt, *it);
402 CxtThreadProc t(mainTCTNode->getId(), cxt, *it);
404 }
405
406 while(!ctpList.empty())
407 {
410 if(isCandidateFun(cgNode->getFunction()) == false)
411 continue;
412
413 for(PTACallGraphNode::const_iterator nit = cgNode->OutEdgeBegin(), neit = cgNode->OutEdgeEnd(); nit!=neit; nit++)
414 {
415 const PTACallGraphEdge* cgEdge = (*nit);
416
417 for(PTACallGraphEdge::CallInstSet::const_iterator cit = cgEdge->directCallsBegin(),
418 ecit = cgEdge->directCallsEnd(); cit!=ecit; ++cit)
419 {
420 DBOUT(DMTA,outs() << "\nTCT handling direct call:" << **cit << "\t" << cgEdge->getSrcNode()->getFunction()->getName() << "-->" << cgEdge->getDstNode()->getFunction()->getName() << "\n");
422 }
423 for(PTACallGraphEdge::CallInstSet::const_iterator ind = cgEdge->indirectCallsBegin(),
424 eind = cgEdge->indirectCallsEnd(); ind!=eind; ++ind)
425 {
426 DBOUT(DMTA,outs() << "\nTCT handling indirect call:" << **ind << "\t" << cgEdge->getSrcNode()->getFunction()->getName() << "-->" << cgEdge->getDstNode()->getFunction()->getName() << "\n");
428 }
429 }
430 }
431
433
435 {
436 print();
437 dump("tct");
438 }
439
440}
#define DBOUT(TYPE, X)
LLVM debug macros, define type of your DBUG model of each pass.
Definition SVFType.h:484
#define DMTA
Definition SVFType.h:505
bool empty() const
Definition WorkList.h:146
GEdgeSetTy::const_iterator const_iterator
static const Option< bool > TCTDotGraph
Definition Options.h:166
PTACallGraphNode * getCallGraphNode(NodeID id) const
Get call graph node.
bool pushToCTPWorkList(const CxtThreadProc &ctp)
WorkList helper functions.
Definition TCT.h:561
FunSet entryFuncSet
Definition TCT.h:588
void collectLoopInfoForJoin()
Handle join site in loop.
Definition TCT.cpp:315
void collectEntryFunInCallGraph()
Get entry functions that are neither called by other functions nor extern functions.
Definition TCT.cpp:187
void dump(const std::string &filename)
Dump the graph.
Definition TCT.cpp:514
CxtThreadProcVec ctpList
Thread call graph SCC.
Definition TCT.h:591
void markRelProcs()
Mark relevant procedures that are backward reachable from any fork/join site.
Definition TCT.cpp:133
void handleCallRelation(CxtThreadProc &ctp, const PTACallGraphEdge *cgEdge, const CallICFGNode *call)
Handle call relations.
Definition TCT.cpp:245
TCTNode * getOrCreateTCTNode(const CallStrCxt &cxt, const ICFGNode *fork, const CallStrCxt &oldCxt, const SVFFunction *routine)
Get or create a tct node based on CxtThread.
Definition TCT.h:513
bool isCandidateFun(const PTACallGraph::FunctionSet &callees) const
Whether it is a candidate function for indirect call.
Definition TCT.h:291
void print() const
Print TCT information.
Definition TCT.cpp:523
void collectMultiForkedThreads()
Definition TCT.cpp:207
CxtThreadProc popFromCTPWorkList()
Definition TCT.h:570
std::ostream & outs()
Overwrite llvm::outs()
Definition SVFUtil.h:50
std::vector< u32_t > CallStrCxt

◆ collectEntryFunInCallGraph()

void TCT::collectEntryFunInCallGraph ( )
private

Get entry functions that are neither called by other functions nor extern functions.

Get Main function

Definition at line 187 of file TCT.cpp.

188{
190 for (const auto& item: *svfirCallGraph)
191 {
192 const SVFFunction* fun = item.second->getFunction();
193 if (SVFUtil::isExtCall(fun))
194 continue;
196 if (!node->hasIncomingEdge())
197 {
198 entryFuncSet.insert(fun);
199 }
200 }
201 assert(!entryFuncSet.empty() && "Can't find any function in module!");
202}
cJSON * item
Definition cJSON.h:222
bool hasIncomingEdge() const
Has incoming/outgoing edge set.
CallGraph * getCallGraph()
Definition SVFIR.h:193
static SVFIR * getPAG(bool buildFromFile=false)
Singleton design here to make sure we only have one instance during any analysis.
Definition SVFIR.h:116
bool isExtCall(const SVFFunction *fun)
Definition SVFUtil.h:278

◆ collectLoopInfoForJoin()

void TCT::collectLoopInfoForJoin ( )
private

Handle join site in loop.

collect loop info for join sites

Collect loop info for join sites the in-loop join site must be joined if the loop is executed

Definition at line 315 of file TCT.cpp.

316{
317 for(ThreadCallGraph::CallSiteSet::const_iterator it = tcg->joinsitesBegin(), eit = tcg->joinsitesEnd(); it!=eit; ++it)
318 {
319 const ICFGNode* join = *it;
320 const SVFFunction* svffun = join->getFun();
321 const SVFBasicBlock* svfbb = join->getBB();
322
323 if(svffun->hasLoopInfo(svfbb))
324 {
325 const LoopBBs& lp = svffun->getLoopInfo(svfbb);
326 if(!lp.empty() && isJoinMustExecutedInLoop(lp,join))
327 {
329 }
330 }
331
333 inRecurJoinSites.insert(join);
334 }
335}
bool isInRecursion(const ICFGNode *inst) const
Whether an instruction is in a recursion.
Definition TCT.cpp:91
InstToLoopMap joinSiteToLoopMap
Map a CxtThread to its start routine function.
Definition TCT.h:596
bool isJoinMustExecutedInLoop(const LoopBBs &lp, const ICFGNode *join)
Return true if a join instruction must be executed inside a loop.
Definition TCT.cpp:291
Set< const ICFGNode * > inRecurJoinSites
Fork or Join sites in recursions.
Definition TCT.h:597
SVFLoopAndDomInfo::LoopBBs LoopBBs
Definition TCT.h:157
CallSiteSet::const_iterator joinsitesEnd() const
CallSiteSet::const_iterator joinsitesBegin() const
Join sites iterators.

◆ collectMultiForkedThreads()

void TCT::collectMultiForkedThreads ( )
private

Collect multi-forked threads whose 1, cxt is in loop or recursion; 2, parent thread is a multi-forked thread.

Collect all multi-forked threads

Definition at line 207 of file TCT.cpp.

208{
209 if (this->nodeNum == 0 )
210 return;
211
212 FIFOWorkList<TCTNode*> worklist;
213 worklist.push(getTCTNode(0));
214
215 while(!worklist.empty())
216 {
217 TCTNode* node = worklist.pop();
218 const CxtThread &ct = node->getCxtThread();
219
220 if(ct.isIncycle() || ct.isInloop())
221 {
222 node->setMultiforked(true);
223 }
224 else
225 {
226 for (TCT::ThreadCreateEdgeSet::const_iterator it = node->getInEdges().begin(), eit = node->getInEdges().end(); it != eit;
227 ++it)
228 {
229 if ((*it)->getSrcNode()->isMultiforked())
230 node->setMultiforked(true);
231 }
232 }
233 for (TCT::ThreadCreateEdgeSet::const_iterator it = node->getOutEdges().begin(), eit = node->getOutEdges().end(); it != eit;
234 ++it)
235 {
236 worklist.push((*it)->getDstNode());
237 }
238 }
239}
bool push(const Data &data)
Definition WorkList.h:165
u32_t nodeNum
total num of edge
const GEdgeSetTy & getOutEdges() const
const GEdgeSetTy & getInEdges() const
const CxtThread & getCxtThread() const
Get CxtThread.
Definition TCT.h:101
void setMultiforked(bool value)
Definition TCT.h:116
TCTNode * getTCTNode(NodeID id) const
Get TCT node.
Definition TCT.h:206

◆ destroy()

void SVF::TCT::destroy ( )
inlineprivate

Clean up memory.

Definition at line 581 of file TCT.h.

582 {
583 if(tcgSCC)
584 delete tcgSCC;
585 tcgSCC=nullptr;
586 }

◆ dump()

void TCT::dump ( const std::string &  filename)

Dump the graph.

Dump call graph into dot file

Definition at line 514 of file TCT.cpp.

515{
518}
static void WriteGraphToFile(SVF::OutStream &O, const std::string &GraphName, const GraphType &GT, bool simple=false)

◆ dumpCxt()

void TCT::dumpCxt ( CallStrCxt cxt)

Dump calling context.

Dump calling context information

Definition at line 496 of file TCT.cpp.

497{
498 std::string str;
499 std::stringstream rawstr(str);
500 rawstr << "[:";
501 for(CallStrCxt::const_iterator it = cxt.begin(), eit = cxt.end(); it!=eit; ++it)
502 {
503 rawstr << " ' "<< *it << " ' ";
504 rawstr << (tcg->getCallSite(*it))->valueOnlyToString();
505 rawstr << " call " << tcg->getCallSite(*it)->getCaller()->getName() << "-->" << tcg->getCalleeOfCallSite(*it)->getName() << ", \n";
506 }
507 rawstr << " ]";
508 outs() << "max cxt = " << cxt.size() << rawstr.str() << "\n";
509}
const SVFFunction * getCaller() const
Return callsite.
Definition ICFGNode.h:470
const CallICFGNode * getCallSite(CallSiteID id) const
const SVFFunction * getCalleeOfCallSite(CallSiteID id) const
const std::string & getName() const
Definition SVFValue.h:243

◆ getAncestorThread()

const NodeBS SVF::TCT::getAncestorThread ( NodeID  tid) const
inline

Get all ancestor threads.

Definition at line 329 of file TCT.h.

330 {
331 NodeBS tds;
332 if(hasParentThread(tid) == false)
333 return tds;
334
335 FIFOWorkList<NodeID> worklist;
336 worklist.push(getParentThread(tid));
337
338 while(!worklist.empty())
339 {
340 NodeID t = worklist.pop();
341 if(tds.test_and_set(t))
342 {
343 if(hasParentThread(t))
344 worklist.push(getParentThread(t));
345 }
346 }
347 return tds;
348 }
NodeID getParentThread(NodeID tid) const
Get parent thread.
Definition TCT.h:320
bool hasParentThread(NodeID tid) const
Get parent and sibling threads.
Definition TCT.h:314
SparseBitVector NodeBS
Definition GeneralType.h:62

◆ getChildrenBegin()

ThreadCreateEdgeSet::const_iterator SVF::TCT::getChildrenBegin ( const TCTNode node) const
inline

Get children and parent nodes.

Definition at line 217 of file TCT.h.

218 {
219 return node->OutEdgeBegin();
220 }

◆ getChildrenEnd()

ThreadCreateEdgeSet::const_iterator SVF::TCT::getChildrenEnd ( const TCTNode node) const
inline

Definition at line 221 of file TCT.h.

222 {
223 return node->OutEdgeEnd();
224 }

◆ getCxtOfCxtThread()

const CallStrCxt & SVF::TCT::getCxtOfCxtThread ( const CxtThread ct) const
inline

get the context of a thread at its spawning site (fork site)

Definition at line 369 of file TCT.h.

370 {
371 CxtThreadToForkCxt::const_iterator it = ctToForkCxtMap.find(ct);
372 assert(it!=ctToForkCxtMap.end() && "Cxt Thread not found!!");
373 return it->second;
374 }

◆ getEntryProcs()

const FunSet & SVF::TCT::getEntryProcs ( ) const
inline

Get marked candidate functions.

Definition at line 242 of file TCT.h.

243 {
244 return entryFuncSet;
245 }

◆ getGraphEdge()

TCTEdge * TCT::getGraphEdge ( TCTNode src,
TCTNode dst,
TCTEdge::CEDGEK  kind 
)

Get call graph edge via nodes.

get PTACallGraph edge via nodes

Definition at line 552 of file TCT.cpp.

553{
554 for (TCTEdge::ThreadCreateEdgeSet::const_iterator iter = src->OutEdgeBegin(); iter != src->OutEdgeEnd(); ++iter)
555 {
556 TCTEdge* edge = (*iter);
557 if (edge->getEdgeKind() == kind && edge->getDstID() == dst->getId())
558 return edge;
559 }
560 return nullptr;
561}
iterator OutEdgeEnd()
iterator OutEdgeBegin()
iterators
NodeID getId() const
Get ID.

◆ getJoinLoop()

LoopBBs & SVF::TCT::getJoinLoop ( const CallICFGNode join)
inline

Get loop for join site.

Definition at line 385 of file TCT.h.

386 {
387 assert(tcg->getThreadAPI()->isTDJoin(join) && "not a join site");
388 InstToLoopMap::iterator it = joinSiteToLoopMap.find(join);
389 assert(it!=joinSiteToLoopMap.end() && "loop not found");
390 return it->second;
391 }
bool isTDJoin(const CallICFGNode *inst) const
Return true if this call wait for a worker thread.
ThreadAPI * getThreadAPI() const
Thread API.

◆ getLoop() [1/2]

const LoopBBs & SVF::TCT::getLoop ( const ICFGNode inst)

Get loop for an instruction.

◆ getLoop() [2/2]

const TCT::LoopBBs & TCT::getLoop ( const SVFBasicBlock bb)

Get loop for fork/join site.

Get loop for fork/join site

Definition at line 375 of file TCT.cpp.

376{
377 const SVFFunction* fun = bb->getParent();
378 return fun->getLoopInfo(bb);
379}
const SVFFunction * getParent() const
Definition SVFValue.h:595
const LoopBBs & getLoopInfo(const SVFBasicBlock *bb) const
Definition SVFValue.h:486

◆ getMakredProcs()

const FunSet & SVF::TCT::getMakredProcs ( ) const
inline

Get marked candidate functions.

Definition at line 236 of file TCT.h.

237 {
238 return candidateFuncSet;
239 }
FunSet candidateFuncSet
Procedures that are neither called by other functions nor extern functions.
Definition TCT.h:589

◆ getMaxCxtSize()

u32_t SVF::TCT::getMaxCxtSize ( ) const
inline

Definition at line 257 of file TCT.h.

258 {
259 return MaxCxtSize;
260 }

◆ getOrCreateTCTNode()

TCTNode * SVF::TCT::getOrCreateTCTNode ( const CallStrCxt cxt,
const ICFGNode fork,
const CallStrCxt oldCxt,
const SVFFunction routine 
)
inlineprivate

Get or create a tct node based on CxtThread.

Definition at line 513 of file TCT.h.

514 {
515 CxtThread ct(cxt,fork);
516 CxtThreadToNodeMap::const_iterator it = ctpToNodeMap.find(ct);
517 if(it!=ctpToNodeMap.end())
518 {
519 return it->second;
520 }
521
524
526 return addTCTNode(ct);
527 }
void setMultiForkedAttrs(CxtThread &ct)
Set multi-forked thread attributes.
Definition TCT.h:531
void addCxtOfCxtThread(const CallStrCxt &cxt, const CxtThread &ct)
Add context for a thread at its spawning site (fork site)
Definition TCT.h:549
void addStartRoutineOfCxtThread(const SVFFunction *fun, const CxtThread &ct)
Add start routine function of a cxt thread.
Definition TCT.h:554
TCTNode * addTCTNode(const CxtThread &ct)
Add TCT node.
Definition TCT.h:450

◆ getParentsBegin()

ThreadCreateEdgeSet::const_iterator SVF::TCT::getParentsBegin ( const TCTNode node) const
inline

Definition at line 225 of file TCT.h.

226 {
227 return node->InEdgeBegin();
228 }

◆ getParentsEnd()

ThreadCreateEdgeSet::const_iterator SVF::TCT::getParentsEnd ( const TCTNode node) const
inline

Definition at line 229 of file TCT.h.

230 {
231 return node->InEdgeEnd();
232 }

◆ getParentThread()

NodeID SVF::TCT::getParentThread ( NodeID  tid) const
inline

Get parent thread.

Definition at line 320 of file TCT.h.

321 {
322 const TCTNode* node = getTCTNode(tid);
323 assert(node->getInEdges().size()<=1 && "should have at most one parent thread");
324 assert(node->getInEdges().size()==1 && "does not have a parent thread");
325 const TCTEdge* edge = *(node->getInEdges().begin());
326 return edge->getSrcID();
327 }

◆ getPTA()

PointerAnalysis * SVF::TCT::getPTA ( ) const
inline

Get PTA.

Definition at line 201 of file TCT.h.

202 {
203 return pta;
204 }

◆ getSiblingThread()

const NodeBS SVF::TCT::getSiblingThread ( NodeID  tid) const
inline

Get sibling threads.

Definition at line 350 of file TCT.h.

351 {
352 NodeBS tds;
353 if(hasParentThread(tid) == false)
354 return tds;
355
356 const TCTNode* node = getTCTNode(getParentThread(tid));
357 for(ThreadCreateEdgeSet::const_iterator it = getChildrenBegin(node), eit = getChildrenEnd(node); it!=eit; ++it)
358 {
359 NodeID child = (*it)->getDstNode()->getId();
360 if(child!=tid)
361 tds.set(child);
362 }
363
364 return tds;
365 }
cJSON * child
Definition cJSON.cpp:2723
ThreadCreateEdgeSet::const_iterator getChildrenBegin(const TCTNode *node) const
Get children and parent nodes.
Definition TCT.h:217
ThreadCreateEdgeSet::const_iterator getChildrenEnd(const TCTNode *node) const
Definition TCT.h:221

◆ getStartRoutineOfCxtThread()

const SVFFunction * SVF::TCT::getStartRoutineOfCxtThread ( const CxtThread ct) const
inline

get the start routine function of a thread

Definition at line 377 of file TCT.h.

378 {
379 CxtThreadToFun::const_iterator it = ctToRoutineFunMap.find(ct);
380 assert(it!=ctToRoutineFunMap.end() && "Cxt Thread not found!!");
381 return it->second;
382 }

◆ getSVFModule()

SVFModule * SVF::TCT::getSVFModule ( ) const
inline

Get SVFFModule.

Definition at line 190 of file TCT.h.

191 {
192 return pta->getModule();
193 }
SVFModule * getModule() const
Module.

◆ getTCTEdgeNum()

u32_t SVF::TCT::getTCTEdgeNum ( ) const
inline

Definition at line 253 of file TCT.h.

254 {
255 return TCTEdgeNum;
256 }

◆ getTCTNode() [1/2]

TCTNode * SVF::TCT::getTCTNode ( const CxtThread ct) const
inline

Definition at line 282 of file TCT.h.

283 {
284 CxtThreadToNodeMap::const_iterator it = ctpToNodeMap.find(ct);
285 assert(it!=ctpToNodeMap.end() && "TCT node not found??");
286 return it->second;
287 }

◆ getTCTNode() [2/2]

TCTNode * SVF::TCT::getTCTNode ( NodeID  id) const
inline

Get TCT node.

Definition at line 206 of file TCT.h.

207 {
208 return getGNode(id);
209 }
NodeType * getGNode(NodeID id) const
Get a node.

◆ getTCTNodeNum()

u32_t SVF::TCT::getTCTNodeNum ( ) const
inline

Get Statistics.

Definition at line 249 of file TCT.h.

250 {
251 return TCTNodeNum;
252 }

◆ getThreadCallGraph()

ThreadCallGraph * SVF::TCT::getThreadCallGraph ( ) const
inline

Get TCG.

Definition at line 196 of file TCT.h.

197 {
198 return tcg;
199 }

◆ handleCallRelation()

void TCT::handleCallRelation ( CxtThreadProc ctp,
const PTACallGraphEdge cgEdge,
const CallICFGNode cs 
)
private

Handle call relations.

Handle call relations

Create spawnee TCT node

Add TCT nodes and edge

Definition at line 245 of file TCT.cpp.

246{
247 const SVFFunction* callee = cgEdge->getDstNode()->getFunction();
248
249 CallStrCxt cxt(ctp.getContext());
250 CallStrCxt oldCxt = cxt;
251 const CallICFGNode* callNode = cs;
253
254 if(cgEdge->getEdgeKind() == PTACallGraphEdge::CallRetEdge)
255 {
256 CxtThreadProc newctp(ctp.getTid(),cxt,callee);
258 {
259 DBOUT(DMTA,outs() << "TCT Process CallRet old ctp --"; ctp.dump());
260 DBOUT(DMTA,outs() << "TCT Process CallRet new ctp --"; newctp.dump());
261 }
262 }
263
264 else if(cgEdge->getEdgeKind() == PTACallGraphEdge::TDForkEdge)
265 {
269
271 {
273 if(addTCTEdge(this->getGNode(ctp.getTid()), spawneeNode))
274 {
275 DBOUT(DMTA,outs() << "Add TCT Edge from thread " << ctp.getTid() << " ";
276 this->getGNode(ctp.getTid())->getCxtThread().dump();
277 outs() << " to thread " << spawneeNode->getId() << " ";
278 spawneeNode->getCxtThread().dump();
279 outs() << "\n" );
280 }
281 DBOUT(DMTA,outs() << "TCT Process Fork old ctp --"; ctp.dump());
282 DBOUT(DMTA,outs() << "TCT Process Fork new ctp --"; newctp.dump());
283 }
284 }
285}
NodeID getTid() const
Return current thread id.
Definition CxtStmt.h:412
void pushCxt(CallStrCxt &cxt, const CallICFGNode *call, const SVFFunction *callee)
Push calling context.
Definition TCT.cpp:445
bool addTCTEdge(TCTNode *src, TCTNode *dst)
Add TCT edge.
Definition TCT.h:461

◆ hasGraphEdge()

TCTEdge * TCT::hasGraphEdge ( TCTNode src,
TCTNode dst,
TCTEdge::CEDGEK  kind 
) const

Whether we have already created this call graph edge.

Whether we have already created this call graph edge

Definition at line 535 of file TCT.cpp.

536{
537 TCTEdge edge(src, dst, kind);
540 if (outEdge && inEdge)
541 {
542 assert(outEdge == inEdge && "edges not match");
543 return outEdge;
544 }
545 else
546 return nullptr;
547}
bool hasOutgoingEdge() const

◆ hasJoinLoop()

bool SVF::TCT::hasJoinLoop ( const CallICFGNode join) const
inline

Definition at line 393 of file TCT.h.

394 {
395 assert(tcg->getThreadAPI()->isTDJoin(join) && "not a join site");
396 InstToLoopMap::const_iterator it = joinSiteToLoopMap.find(join);
397 return it!=joinSiteToLoopMap.end();
398 }

◆ hasLoop() [1/2]

bool SVF::TCT::hasLoop ( const ICFGNode inst) const
inline

Definition at line 405 of file TCT.h.

406 {
407 return hasLoop(inst->getBB());
408 }
bool hasLoop(const SVFBasicBlock *bb) const
Definition TCT.h:400

◆ hasLoop() [2/2]

bool SVF::TCT::hasLoop ( const SVFBasicBlock bb) const
inline

Definition at line 400 of file TCT.h.

401 {
402 const SVFFunction* fun = bb->getFunction();
403 return fun->hasLoopInfo(bb);
404 }

◆ hasParentThread()

bool SVF::TCT::hasParentThread ( NodeID  tid) const
inline

Get parent and sibling threads.

Has parent thread

Definition at line 314 of file TCT.h.

315 {
316 const TCTNode* node = getTCTNode(tid);
317 return node->getInEdges().size()==1;
318 }

◆ hasTCTNode()

bool SVF::TCT::hasTCTNode ( const CxtThread ct) const
inline

Find/Get TCT node.

Definition at line 278 of file TCT.h.

279 {
280 return ctpToNodeMap.find(ct)!=ctpToNodeMap.end();
281 }

◆ inSameCallGraphSCC()

bool SVF::TCT::inSameCallGraphSCC ( const PTACallGraphNode src,
const PTACallGraphNode dst 
)
inline

Whether two functions in the same callgraph scc.

Definition at line 306 of file TCT.h.

307 {
308 return (tcgSCC->repNode(src->getId()) == tcgSCC->repNode(dst->getId()));
309 }

◆ isCallSite()

bool SVF::TCT::isCallSite ( const ICFGNode inst)
inline

Whether it is a callsite.

Definition at line 271 of file TCT.h.

272 {
273 return SVFUtil::isa<CallICFGNode>(inst);
274 }

◆ isCandidateFun() [1/2]

bool SVF::TCT::isCandidateFun ( const PTACallGraph::FunctionSet callees) const
inline

Whether it is a candidate function for indirect call.

Definition at line 291 of file TCT.h.

292 {
293 for(PTACallGraph::FunctionSet::const_iterator cit = callees.begin(),
294 ecit = callees.end(); cit!=ecit; cit++)
295 {
296 if(candidateFuncSet.find((*cit))!=candidateFuncSet.end())
297 return true;
298 }
299 return false;
300 }

◆ isCandidateFun() [2/2]

bool SVF::TCT::isCandidateFun ( const SVFFunction fun) const
inline

Definition at line 301 of file TCT.h.

302 {
303 return candidateFuncSet.find(fun)!=candidateFuncSet.end();
304 }

◆ isExtCall()

bool SVF::TCT::isExtCall ( const ICFGNode inst)
inline

Whether it is calling an external function.

Definition at line 264 of file TCT.h.

265 {
266 if(const CallICFGNode* call = SVFUtil::dyn_cast<CallICFGNode>(inst))
267 return SVFUtil::isExtCall(call);
268 return false;
269 }

◆ isInLoopInstruction()

bool TCT::isInLoopInstruction ( const ICFGNode inst)
private

Multi-forked threads.

Whether an instruction is in a loop

An instruction i is in loop (1) the instruction i itself (2) all the callsites invoke the function where i resides in

Definition at line 46 of file TCT.cpp.

47{
48 assert(inst && "null value instruction!!");
49
52 worklist.push(inst);
53
54 while(!worklist.empty())
55 {
56 const ICFGNode* inst = worklist.pop();
57 insts.insert(inst);
59 for(PTACallGraphNode::const_iterator nit = cgnode->InEdgeBegin(), neit = cgnode->InEdgeEnd(); nit!=neit; nit++)
60 {
61 for(PTACallGraphEdge::CallInstSet::const_iterator cit = (*nit)->directCallsBegin(),
62 ecit = (*nit)->directCallsEnd(); cit!=ecit; ++cit)
63 {
64 if(insts.insert(*cit).second)
65 worklist.push(*cit);
66 }
67 for(PTACallGraphEdge::CallInstSet::const_iterator cit = (*nit)->indirectCallsBegin(),
68 ecit = (*nit)->indirectCallsEnd(); cit!=ecit; ++cit)
69 {
70 if(insts.insert(*cit).second)
71 worklist.push(*cit);
72 }
73 }
74 }
75
76 for(const ICFGNode* i : insts)
77 {
78 if(i->getFun()->hasLoopInfo(i->getBB()))
79 return true;
80 }
81
82
83 return false;
84}
virtual const SVFFunction * getFun() const
Return the function of this ICFGNode.
Definition ICFGNode.h:76

◆ isInRecursion()

bool TCT::isInRecursion ( const ICFGNode inst) const
private

Whether an instruction is in a recursion.

An instruction i is in a recursion (1) the function f where i resides in is in a recursion (2) any caller function starting from the function f in is in a recursion

Definition at line 91 of file TCT.cpp.

92{
93 const SVFFunction* f = inst->getFun();
96 worklist.push(f);
97
98 while(!worklist.empty())
99 {
100 const SVFFunction* svffun = worklist.pop();
101 visits.insert(svffun);
102 if(tcgSCC->isInCycle(tcg->getCallGraphNode(svffun)->getId()))
103 return true;
104
106
107 for(PTACallGraphNode::const_iterator nit = cgnode->InEdgeBegin(), neit = cgnode->InEdgeEnd(); nit!=neit; nit++)
108 {
109 for(PTACallGraphEdge::CallInstSet::const_iterator cit = (*nit)->directCallsBegin(),
110 ecit = (*nit)->directCallsEnd(); cit!=ecit; ++cit)
111 {
112 const SVFFunction* caller = (*cit)->getFun();
113 if(visits.find(caller)==visits.end())
114 worklist.push(caller);
115 }
116 for(PTACallGraphEdge::CallInstSet::const_iterator cit = (*nit)->indirectCallsBegin(),
117 ecit = (*nit)->indirectCallsEnd(); cit!=ecit; ++cit)
118 {
119 const SVFFunction* caller = (*cit)->getFun();
120 if(visits.find(caller)==visits.end())
121 worklist.push(caller);
122 }
123 }
124 }
125
126 return false;
127
128}

◆ isJoinMustExecutedInLoop()

bool TCT::isJoinMustExecutedInLoop ( const LoopBBs lp,
const ICFGNode join 
)

Return true if a join instruction must be executed inside a loop.

Return true if a join instruction must be executed inside a loop joinbb should post dominate the successive basic block of a loop header

Definition at line 291 of file TCT.cpp.

292{
293 assert(!lp.empty() && "this is not a loop, empty basic block");
294 const SVFFunction* svffun = join->getFun();
295 const SVFBasicBlock* loopheadbb = svffun->getLoopHeader(lp);
296 const SVFBasicBlock* joinbb = join->getBB();
297 assert(loopheadbb->getParent()==joinbb->getParent() && "should inside same function");
298
299 for (const SVFBasicBlock* svf_scc_bb : loopheadbb->getSuccessors())
300 {
301 if(svffun->loopContainsBB(lp,svf_scc_bb))
302 {
303 if(svffun->dominate(joinbb,svf_scc_bb)==false)
304 return false;
305 }
306 }
307
308 return true;
309}

◆ isJoinSiteInRecursion()

bool SVF::TCT::isJoinSiteInRecursion ( const CallICFGNode join) const
inline

Whether a join site is in recursion.

Definition at line 428 of file TCT.h.

429 {
430 assert(tcg->getThreadAPI()->isTDJoin(join) && "not a join site");
431 return inRecurJoinSites.find(join)!=inRecurJoinSites.end();
432 }

◆ isLoopExitOfJoinLoop()

bool TCT::isLoopExitOfJoinLoop ( const SVFBasicBlock bb)
private

Whether a given bb is an exit of a inloop join site.

Whether a given bb is an exit of a inloop join site

Definition at line 354 of file TCT.cpp.

355{
356 for(InstToLoopMap::const_iterator it = joinSiteToLoopMap.begin(), eit = joinSiteToLoopMap.end(); it!=eit; ++it)
357 {
358 std::vector<const SVFBasicBlock*> exitbbs;
359 it->first->getFun()->getExitBlocksOfLoop(it->first->getBB(),exitbbs);
360 while(!exitbbs.empty())
361 {
362 const SVFBasicBlock* eb = exitbbs.back();
363 exitbbs.pop_back();
364 if(eb == bb)
365 return true;
366 }
367 }
368
369 return false;
370}
const ICFGNode * back() const
Definition SVFValue.h:611

◆ isLoopHeaderOfJoinLoop()

bool TCT::isLoopHeaderOfJoinLoop ( const SVFBasicBlock bb)
private

Whether a given bb is a loop head of a inloop join site.

Return true if a given bb is a loop head of a inloop join site

Definition at line 340 of file TCT.cpp.

341{
342 for(InstToLoopMap::const_iterator it = joinSiteToLoopMap.begin(), eit = joinSiteToLoopMap.end(); it!=eit; ++it)
343 {
344 if(bb->getParent()->getLoopHeader(it->second) == bb)
345 return true;
346 }
347
348 return false;
349}
const SVFBasicBlock * getLoopHeader(const BBList &lp) const
Definition SVFValue.h:491

◆ isVisitedCTPs()

bool SVF::TCT::isVisitedCTPs ( const CxtThreadProc ctp) const
inlineprivate

Definition at line 575 of file TCT.h.

576 {
577 return visitedCTPs.find(ctp)!=visitedCTPs.end();
578 }
CxtThreadProcSet visitedCTPs
CxtThreadProc List.
Definition TCT.h:592

◆ markRelProcs() [1/2]

void TCT::markRelProcs ( )
private

Mark relevant procedures that are backward reachable from any fork/join site.

Mark relevant procedures that are backward reachable from any fork/join site

Definition at line 133 of file TCT.cpp.

134{
135 for (ThreadCallGraph::CallSiteSet::const_iterator it = tcg->forksitesBegin(), eit = tcg->forksitesEnd(); it != eit; ++it)
136 {
137 const SVFFunction* svfun = (*it)->getParent()->getParent();
139
140 for(ThreadCallGraph::ForkEdgeSet::const_iterator nit = tcg->getForkEdgeBegin(*it), neit = tcg->getForkEdgeEnd(*it); nit!=neit; nit++)
141 {
142 const PTACallGraphNode* forkeeNode = (*nit)->getDstNode();
143 candidateFuncSet.insert(forkeeNode->getFunction());
144 }
145
146 }
147
148 for (ThreadCallGraph::CallSiteSet::const_iterator it = tcg->joinsitesBegin(), eit = tcg->joinsitesEnd(); it != eit; ++it)
149 {
150 const SVFFunction* svfun = (*it)->getParent()->getParent();
152 }
153
154 if(candidateFuncSet.empty())
155 writeWrnMsg("We didn't recognize any fork site, this is single thread program?");
156}
CallSiteSet::const_iterator forksitesEnd() const
CallSiteSet::const_iterator forksitesBegin() const
Fork sites iterators.
ForkEdgeSet::const_iterator getForkEdgeEnd(const CallICFGNode *cs) const
ForkEdgeSet::const_iterator getForkEdgeBegin(const CallICFGNode *cs) const
void writeWrnMsg(const std::string &msg)
Writes a message run through wrnMsg.
Definition SVFUtil.cpp:67

◆ markRelProcs() [2/2]

void TCT::markRelProcs ( const SVFFunction fun)
private

Definition at line 161 of file TCT.cpp.

162{
165 PTACGNodeSet visited;
166 worklist.push(cgnode);
167 visited.insert(cgnode);
168 while(!worklist.empty())
169 {
170 const PTACallGraphNode* node = worklist.pop();
171 candidateFuncSet.insert(node->getFunction());
173 {
174 const PTACallGraphNode* srcNode = (*nit)->getSrcNode();
175 if(visited.find(srcNode)==visited.end())
176 {
177 visited.insert(srcNode);
178 worklist.push(srcNode);
179 }
180 }
181 }
182}
iterator InEdgeBegin()
iterator InEdgeEnd()
const SVFFunction * getFunction() const
Get function of this call node.
Set< const PTACallGraphNode * > PTACGNodeSet
Definition TCT.h:163

◆ matchCxt()

bool TCT::matchCxt ( CallStrCxt cxt,
const CallICFGNode call,
const SVFFunction callee 
)

Match context.

Match calling context

handle calling context for candidate functions only

partial match

Definition at line 466 of file TCT.cpp.

467{
468
469 const SVFFunction* caller = call->getFun();
470 CallSiteID csId = tcg->getCallSiteID(call, callee);
471
473 if(isCandidateFun(caller) == false)
474 return true;
475
477 if(cxt.empty())
478 return true;
479
481 {
482 if(cxt.back() == csId)
483 cxt.pop_back();
484 else
485 return false;
486 DBOUT(DMTA,dumpCxt(cxt));
487 }
488
489 return true;
490}
CallSiteID getCallSiteID(const CallICFGNode *cs, const SVFFunction *callee) const
Get CallSiteID.
bool inSameCallGraphSCC(const PTACallGraphNode *src, const PTACallGraphNode *dst)
Whether two functions in the same callgraph scc.
Definition TCT.h:306
void dumpCxt(CallStrCxt &cxt)
Dump calling context.
Definition TCT.cpp:496
unsigned CallSiteID
Definition GeneralType.h:58

◆ popFromCTPWorkList()

CxtThreadProc SVF::TCT::popFromCTPWorkList ( )
inlineprivate

Definition at line 570 of file TCT.h.

571 {
572 CxtThreadProc ctp = ctpList.pop();
573 return ctp;
574 }

◆ print()

void TCT::print ( ) const

Print TCT information.

Print TCT information

Definition at line 523 of file TCT.cpp.

524{
525 for(TCT::const_iterator it = this->begin(), eit = this->end(); it!=eit; ++it)
526 {
527 outs() << "TID " << it->first << "\t";
528 it->second->getCxtThread().dump();
529 }
530}
iterator begin()
Iterators.
IDToNodeMapTy::const_iterator const_iterator

◆ pushCxt() [1/2]

void SVF::TCT::pushCxt ( CallStrCxt cxt,
CallSiteID  csId 
)
inline

Definition at line 421 of file TCT.h.

422 {
423 cxt.push_back(csId);
424 if (cxt.size() > MaxCxtSize)
425 MaxCxtSize = cxt.size();
426 }

◆ pushCxt() [2/2]

void TCT::pushCxt ( CallStrCxt cxt,
const CallICFGNode call,
const SVFFunction callee 
)

Push calling context.

Push calling context

handle calling context for candidate functions only

Definition at line 445 of file TCT.cpp.

446{
447
448 const SVFFunction* caller = call->getFun();
449 CallSiteID csId = tcg->getCallSiteID(call, callee);
450
452 if(isCandidateFun(caller) == false)
453 return;
454
456 {
457 pushCxt(cxt,csId);
458 DBOUT(DMTA,dumpCxt(cxt));
459 }
460}

◆ pushToCTPWorkList()

bool SVF::TCT::pushToCTPWorkList ( const CxtThreadProc ctp)
inlineprivate

WorkList helper functions.

Definition at line 561 of file TCT.h.

562 {
563 if(isVisitedCTPs(ctp)==false)
564 {
565 visitedCTPs.insert(ctp);
566 return ctpList.push(ctp);
567 }
568 return false;
569 }
bool isVisitedCTPs(const CxtThreadProc &ctp) const
Definition TCT.h:575

◆ setMultiForkedAttrs()

void SVF::TCT::setMultiForkedAttrs ( CxtThread ct)
inlineprivate

Set multi-forked thread attributes.

non-main thread

main thread

Definition at line 531 of file TCT.h.

532 {
534 if(ct.getThread() != nullptr)
535 {
536 const ICFGNode* svfInst = ct.getThread();
537 ct.setInloop(isInLoopInstruction(svfInst));
538 ct.setIncycle(isInRecursion(svfInst));
539 }
541 else
542 {
543 ct.setInloop(false);
544 ct.setIncycle(false);
545 }
546 }
bool isInLoopInstruction(const ICFGNode *inst)
Multi-forked threads.
Definition TCT.cpp:46

Member Data Documentation

◆ candidateFuncSet

FunSet SVF::TCT::candidateFuncSet
private

Procedures that are neither called by other functions nor extern functions.

Definition at line 589 of file TCT.h.

◆ ctpList

CxtThreadProcVec SVF::TCT::ctpList
private

Thread call graph SCC.

Definition at line 591 of file TCT.h.

◆ ctpToNodeMap

CxtThreadToNodeMap SVF::TCT::ctpToNodeMap
private

Record all visited ctps.

Definition at line 593 of file TCT.h.

◆ ctToForkCxtMap

CxtThreadToForkCxt SVF::TCT::ctToForkCxtMap
private

Map a ctp to its graph node.

Definition at line 594 of file TCT.h.

◆ ctToRoutineFunMap

CxtThreadToFun SVF::TCT::ctToRoutineFunMap
private

Map a CxtThread to the context at its spawning site (fork site).

Definition at line 595 of file TCT.h.

◆ entryFuncSet

FunSet SVF::TCT::entryFuncSet
private

Definition at line 588 of file TCT.h.

◆ inRecurJoinSites

Set<const ICFGNode*> SVF::TCT::inRecurJoinSites
private

Fork or Join sites in recursions.

Definition at line 597 of file TCT.h.

◆ joinSiteToLoopMap

InstToLoopMap SVF::TCT::joinSiteToLoopMap
private

Map a CxtThread to its start routine function.

map an inloop join to its loop class

Definition at line 596 of file TCT.h.

◆ MaxCxtSize

u32_t SVF::TCT::MaxCxtSize
private

Definition at line 447 of file TCT.h.

◆ pta

PointerAnalysis* SVF::TCT::pta
private

Definition at line 444 of file TCT.h.

◆ tcg

ThreadCallGraph* SVF::TCT::tcg
private

Definition at line 443 of file TCT.h.

◆ tcgSCC

ThreadCallGraphSCC* SVF::TCT::tcgSCC
private

Procedures we care about during call graph traversing when creating TCT.

Definition at line 590 of file TCT.h.

◆ TCTEdgeNum

u32_t SVF::TCT::TCTEdgeNum
private

Definition at line 446 of file TCT.h.

◆ TCTNodeNum

u32_t SVF::TCT::TCTNodeNum
private

Definition at line 445 of file TCT.h.

◆ visitedCTPs

CxtThreadProcSet SVF::TCT::visitedCTPs
private

CxtThreadProc List.

Definition at line 592 of file TCT.h.


The documentation for this class was generated from the following files: