//===-- AllocatorIdentification.h - Identify alloc wrappers --------------===//
//
//                     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.
//
//===----------------------------------------------------------------------===//
// Identify malloc/free wrappers.
//===----------------------------------------------------------------------===//

#ifndef _ALLOCATORIDENTIFICATION_H
#define	_ALLOCATORIDENTIFICATION_H

#include <string>
#include "llvm/Pass.h"
#include "llvm/Value.h"

namespace llvm {
  class Function;
  class Module;
  class Instruction;

  class AllocIdentify : public llvm::ModulePass {
  protected:
    std::set<std::string> allocators;
    std::set<std::string> deallocators;
    bool flowsFrom(Value *Dest,Value *Src);

  public:
    std::set<std::string>::iterator alloc_begin() {
      return allocators.begin();
    }
    std::set<std::string>::iterator alloc_end() {
      return allocators.end();
    }
    std::set<std::string>::iterator dealloc_begin() {
      return deallocators.begin();
    }
    std::set<std::string>::iterator dealloc_end() {
      return deallocators.end();
    }
    static char ID;
    AllocIdentify();
    virtual ~AllocIdentify();
    bool runOnModule(llvm::Module&);
    virtual void getAnalysisUsage(llvm::AnalysisUsage &Info) const;
    virtual const char * getPassName() const {
      return "Allocator Identification Analysis (find malloc/free wrappers)";
    }
  };

}

#endif	/* _ALLOCATORIDENTIFICATION_H */

