blob: e05a542c71595203e6dfb7168fbf6661e916ec0f [file] [log] [blame]
//===- DSNodeEquivs.h - Build DSNode equivalence classes ------------------===//
//
// 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 computes equivalence classes of DSNodes across DSGraphs.
//
//===----------------------------------------------------------------------===//
#ifndef DSNODEEQUIVS_H
#define DSNODEEQUIVS_H
#include "dsa/DataStructure.h"
#include "dsa/DSGraph.h"
#include "dsa/DSNode.h"
#include "llvm/ADT/EquivalenceClasses.h"
#include <vector>
namespace llvm {
typedef std::vector<const Function *> FunctionList;
typedef FunctionList::iterator FunctionList_it;
class DSNodeEquivs : public ModulePass {
private:
EquivalenceClasses<const DSNode*> Classes;
void buildDSNodeEquivs(Module &M);
void addNodesFromGraph(DSGraph *G);
FunctionList getCallees(CallSite &CS);
void equivNodesThroughCallsite(CallInst *CI);
void equivNodesToGlobals(DSGraph *G);
void equivNodeMapping(DSGraph::NodeMapTy & NM);
public:
static char ID;
DSNodeEquivs() : ModulePass(ID) {}
void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequiredTransitive<TDDataStructures>();
AU.setPreservesAll();
}
bool runOnModule(Module &M);
// Returns the computed equivalence classes. Two DSNodes in the same
// equivalence class may alias. DSNodes may also alias if they have the
// Incomplete, Unknown, or External flags set (even if they are in different
// equivalence classes).
const EquivalenceClasses<const DSNode*> &getEquivalenceClasses();
// Returns a DSNode for the specified value. Note that two nodes may alias
// even if they have different DSNodes (because the DSNodes may belong to
// different DSGraphs).
const DSNode *getMemberForValue(const Value *V);
};
}
#endif // DSNODEEQUIVS_H