//=- llvm/Analysis/CallTargets.h - Resolve Indirect Call Targets --*- C++ -*-=//
//
//                     The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This pass uses DSA to map targets of all calls, and reports on if it
// thinks it knows all targets of a given call.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_ANALYSIS_CALLTARGETS_H
#define LLVM_ANALYSIS_CALLTARGETS_H

#include "llvm/Pass.h"
#include "llvm/IR/CallSite.h"

#include <set>
#include <list>
#include <map>

namespace llvm {

  class CallTargetFinder : public ModulePass {
    std::map<CallSite, std::vector<const Function*> > IndMap;
    std::set<CallSite> CompleteSites;
    std::list<CallSite> AllSites;

    void findIndTargets(Module &M);
  public:
    static char ID;
    CallTargetFinder() : ModulePass((intptr_t)&ID) {}

    virtual bool runOnModule(Module &M);

    virtual void getAnalysisUsage(AnalysisUsage &AU) const;

    virtual void print(std::ostream &O, const Module *M) const;

    // Given a CallSite, get an iterator of callees
    std::vector<const Function*>::iterator begin(CallSite cs);
    std::vector<const Function*>::iterator end(CallSite cs);

    // Iterate over CallSites in program
    std::list<CallSite>::iterator cs_begin();
    std::list<CallSite>::iterator cs_end();

    // Do we think we have complete knowledge of this site?
    // That is, do we think there are no missing callees
    bool isComplete(CallSite cs) const;
  };
  
}

#endif
