mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9903 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			247 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			247 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===- IPModRef.h - Compute IP Mod/Ref information --------------*- 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.
 | |
| // 
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // class IPModRef:
 | |
| // 
 | |
| // class IPModRef is an interprocedural analysis pass that computes
 | |
| // flow-insensitive IP Mod and Ref information for every function
 | |
| // (the GMOD and GREF problems) and for every call site (MOD and REF).
 | |
| // 
 | |
| // In practice, this needs to do NO real interprocedural work because
 | |
| // all that is needed is done by the data structure analysis.
 | |
| // This uses the top-down DS graph for a function and the bottom-up DS graph
 | |
| // for each callee (including the Mod/Ref flags in the bottom-up graph)
 | |
| // to compute the set of nodes that are Mod and Ref for the function and
 | |
| // for each of its call sites.
 | |
| //
 | |
| // 
 | |
| // class FunctionModRefInfo:
 | |
| // 
 | |
| // The results of IPModRef are encapsulated in the class FunctionModRefInfo.
 | |
| // The results are stored as bit vectors: bit i represents node i
 | |
| // in the TD DSGraph for the current function.  (This node numbering is
 | |
| // implemented by class FunctionModRefInfo.)  Each FunctionModRefInfo
 | |
| // includes:
 | |
| // -- 2 bit vectors for the function (GMOD and GREF), and
 | |
| // -- 2 bit vectors for each call site (MOD and REF).
 | |
| //
 | |
| // 
 | |
| // IPModRef vs. Alias Analysis for Clients:
 | |
| // 
 | |
| // The IPModRef pass does not provide simpler query interfaces for specific
 | |
| // LLVM values, instructions, or pointers because those results should be
 | |
| // obtained through alias analysis (e.g., class DSAliasAnalysis).
 | |
| // class IPModRef is primarily meant for other analysis passes that need to
 | |
| // use Mod/Ref information efficiently for more complicated purposes;
 | |
| // the bit-vector representations make propagation very efficient.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef LLVM_ANALYSIS_IPMODREF_H
 | |
| #define LLVM_ANALYSIS_IPMODREF_H
 | |
| 
 | |
| #include "llvm/Pass.h"
 | |
| #include "Support/BitSetVector.h"
 | |
| #include "Support/hash_map"
 | |
| 
 | |
| namespace llvm {
 | |
| 
 | |
| class Module;
 | |
| class Function;
 | |
| class CallSite;
 | |
| class Instruction;
 | |
| class CallInst;
 | |
| class InvokeInst;
 | |
| class DSNode;
 | |
| class DSGraph;
 | |
| class DSNodeHandle;
 | |
| class ModRefInfo;               // Result of IP Mod/Ref for one entity
 | |
| class FunctionModRefInfo;       // ModRefInfo for a func and all calls in it
 | |
| class IPModRef;                 // Pass that computes IP Mod/Ref info
 | |
| 
 | |
| //---------------------------------------------------------------------------
 | |
| // class ModRefInfo 
 | |
| // 
 | |
| // Purpose:
 | |
| //   Representation of Mod/Ref information for a single function or callsite.
 | |
| //   This is represented as a pair of bit vectors, one each for Mod and Ref.
 | |
| //   Each bit vector is indexed by the node id of the DS graph node index.
 | |
| //---------------------------------------------------------------------------
 | |
| 
 | |
| class ModRefInfo {
 | |
|   BitSetVector   modNodeSet;            // set of modified nodes
 | |
|   BitSetVector   refNodeSet;            // set of referenced nodes
 | |
|   
 | |
| public:
 | |
|   // 
 | |
|   // Methods to construct ModRefInfo objects.
 | |
|   // 
 | |
|   ModRefInfo(unsigned int numNodes)
 | |
|     : modNodeSet(numNodes),
 | |
|       refNodeSet(numNodes) { }
 | |
| 
 | |
|   unsigned getSize() const {
 | |
|     assert(modNodeSet.size() == refNodeSet.size() &&
 | |
|            "Mod & Ref different size?");
 | |
|     return modNodeSet.size();
 | |
|   }
 | |
| 
 | |
|   void setNodeIsMod (unsigned nodeId)   { modNodeSet[nodeId] = true; }
 | |
|   void setNodeIsRef (unsigned nodeId)   { refNodeSet[nodeId] = true; }
 | |
| 
 | |
|   //
 | |
|   // Methods to query the mod/ref info
 | |
|   // 
 | |
|   bool nodeIsMod (unsigned nodeId) const  { return modNodeSet.test(nodeId); }
 | |
|   bool nodeIsRef (unsigned nodeId) const  { return refNodeSet.test(nodeId); }
 | |
|   bool nodeIsKill(unsigned nodeId) const  { return false; }
 | |
| 
 | |
|   const BitSetVector&  getModSet() const  { return modNodeSet; }
 | |
|         BitSetVector&  getModSet()        { return modNodeSet; }
 | |
| 
 | |
|   const BitSetVector&  getRefSet() const  { return refNodeSet; }
 | |
|         BitSetVector&  getRefSet()        { return refNodeSet; }
 | |
| 
 | |
|   // Debugging support methods
 | |
|   void print(std::ostream &O, const std::string& prefix=std::string("")) const;
 | |
|   void dump() const;
 | |
| };
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------
 | |
| // class FunctionModRefInfo
 | |
| // 
 | |
| // Representation of the results of IP Mod/Ref analysis for a function
 | |
| // and for each of the call sites within the function.
 | |
| // Each of these are represented as bit vectors of size = the number of
 | |
| // nodes in the top-dwon DS graph of the function.  Nodes are identified by
 | |
| // their nodeId, in the range [0 .. funcTDGraph.size()-1].
 | |
| //----------------------------------------------------------------------------
 | |
| 
 | |
| class FunctionModRefInfo {
 | |
|   const Function&       F;                  // The function
 | |
|   IPModRef&             IPModRefObj;        // The IPModRef Object owning this
 | |
|   DSGraph*              funcTDGraph;        // Top-down DS graph for function
 | |
|   ModRefInfo            funcModRefInfo;     // ModRefInfo for the function body
 | |
|   std::map<const Instruction*, ModRefInfo*>
 | |
|                         callSiteModRefInfo; // ModRefInfo for each callsite
 | |
|   std::map<const DSNode*, unsigned> NodeIds;
 | |
| 
 | |
|   friend class IPModRef;
 | |
| 
 | |
|   void          computeModRef   (const Function &func);
 | |
|   void          computeModRef   (CallSite call);
 | |
|   DSGraph *ResolveCallSiteModRefInfo(CallSite CS,
 | |
|                                 hash_map<const DSNode*, DSNodeHandle> &NodeMap);
 | |
| 
 | |
| public:
 | |
|   /* ctor */    FunctionModRefInfo      (const Function& func,
 | |
|                                          IPModRef&       IPModRefObj,
 | |
|                                          DSGraph*        tdgClone);
 | |
|   /* dtor */    ~FunctionModRefInfo     ();
 | |
| 
 | |
|   // Identify the function and its relevant DS graph
 | |
|   // 
 | |
|   const Function& getFunction() const   { return F; }
 | |
|   const DSGraph&  getFuncGraph() const  { return *funcTDGraph; }
 | |
| 
 | |
|   // Retrieve Mod/Ref results for a single call site and for the function body
 | |
|   // 
 | |
|   const ModRefInfo*     getModRefInfo  (const Function& func) const {
 | |
|     return &funcModRefInfo;
 | |
|   }
 | |
|   const ModRefInfo*     getModRefInfo  (const CallInst& callInst) const {
 | |
|     std::map<const Instruction*, ModRefInfo*>::const_iterator I = 
 | |
|       callSiteModRefInfo.find((Instruction*)&callInst);
 | |
|     return (I == callSiteModRefInfo.end()) ? NULL : I->second;
 | |
|   }
 | |
|   const ModRefInfo*     getModRefInfo  (const InvokeInst& II) const {
 | |
|     std::map<const Instruction*, ModRefInfo*>::const_iterator I = 
 | |
|       callSiteModRefInfo.find((Instruction*)&II);
 | |
|     return (I == callSiteModRefInfo.end()) ? NULL : I->second;
 | |
|   }
 | |
| 
 | |
|   // Get the nodeIds used to index all Mod/Ref information for current function
 | |
|   //
 | |
|   unsigned              getNodeId       (const DSNode* node) const {
 | |
|     std::map<const DSNode*, unsigned>::const_iterator iter = NodeIds.find(node);
 | |
|     assert(iter != NodeIds.end() && iter->second < funcModRefInfo.getSize());
 | |
|     return iter->second;
 | |
|   }
 | |
| 
 | |
|   unsigned              getNodeId       (const Value* value) const;
 | |
| 
 | |
|   // Debugging support methods
 | |
|   void print(std::ostream &O) const;
 | |
|   void dump() const;
 | |
| };
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------
 | |
| // class IPModRef
 | |
| // 
 | |
| // Purpose:
 | |
| // An interprocedural pass that computes IP Mod/Ref info for functions and
 | |
| // for individual call sites.
 | |
| // 
 | |
| // Given the DSGraph of a function, this class can be queried for
 | |
| // a ModRefInfo object describing all the nodes in the DSGraph that are
 | |
| // (a) modified, and (b) referenced during an execution of the function
 | |
| // from an arbitrary callsite, or during an execution of a single call-site
 | |
| // within the function.
 | |
| //----------------------------------------------------------------------------
 | |
| 
 | |
| class IPModRef : public Pass {
 | |
|   std::map<const Function*, FunctionModRefInfo*> funcToModRefInfoMap;
 | |
|   Module* M;
 | |
| 
 | |
|   FunctionModRefInfo& getFuncInfo(const Function& func,
 | |
|                                   bool computeIfMissing = false);
 | |
| public:
 | |
|   IPModRef() : M(NULL)  { }
 | |
|   ~IPModRef()           { }
 | |
| 
 | |
|   // Driver function to run IP Mod/Ref on a Module.
 | |
|   // This initializes the module reference, and then computes IPModRef
 | |
|   // results immediately if demand-driven analysis was *not* specified.
 | |
|   // 
 | |
|   virtual bool run(Module &M);
 | |
| 
 | |
|   // Retrieve the Mod/Ref information for a single function
 | |
|   // 
 | |
|   const FunctionModRefInfo& getFunctionModRefInfo(const Function& func) {
 | |
|     return getFuncInfo(func);
 | |
|   }
 | |
| 
 | |
|   /// getBUDSGraph - This method returns the BU data structure graph for F
 | |
|   /// through the use of the BUDataStructures object.
 | |
|   ///
 | |
|   const DSGraph &getBUDSGraph(const Function &F);
 | |
| 
 | |
|   // Debugging support methods
 | |
|   // 
 | |
|   void print(std::ostream &O) const;
 | |
|   void dump() const;
 | |
| 
 | |
|   // Release memory held by this pass when the pass pipeline is done
 | |
|   // 
 | |
|   virtual void releaseMemory();
 | |
| 
 | |
|   // getAnalysisUsage - This pass requires top-down data structure graphs.
 | |
|   // It modifies nothing.
 | |
|   // 
 | |
|   virtual void getAnalysisUsage(AnalysisUsage &AU) const;
 | |
| };
 | |
| 
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| } // End llvm namespace
 | |
| 
 | |
| #endif
 |