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
		
			
				
	
	
		
			112 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===-- CodeGen/FunctionLiveVarInfo.h - LiveVar Analysis --------*- 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 is the interface for live variable info of a function that is required 
 | |
| // by any other part of the compiler
 | |
| //
 | |
| // After the analysis, getInSetOfBB or getOutSetofBB can be called to get 
 | |
| // live var info of a BB.
 | |
| //
 | |
| // The live var set before an instruction can be obtained in 2 ways:
 | |
| //
 | |
| // 1. Use the method getLiveVarSetAfterInst(Instruction *) to get the LV Info 
 | |
| //    just after an instruction. (also exists getLiveVarSetBeforeInst(..))
 | |
| //
 | |
| //    This function caluclates the LV info for a BB only once and caches that 
 | |
| //    info. If the cache does not contain the LV info of the instruction, it 
 | |
| //    calculates the LV info for the whole BB and caches them.
 | |
| //
 | |
| //    Getting liveVar info this way uses more memory since, LV info should be 
 | |
| //    cached. However, if you need LV info of nearly all the instructions of a
 | |
| //    BB, this is the best and simplest interfrace.
 | |
| //
 | |
| // 2. Use the OutSet and applyTranferFuncForInst(const Instruction *const Inst) 
 | |
| //    declared in LiveVarSet and  traverse the instructions of a basic block in 
 | |
| //    reverse (using const_reverse_iterator in the BB class). 
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef FUNCTION_LIVE_VAR_INFO_H
 | |
| #define FUNCTION_LIVE_VAR_INFO_H
 | |
| 
 | |
| #include "Support/hash_map"
 | |
| #include "llvm/Pass.h"
 | |
| #include "llvm/CodeGen/ValueSet.h"
 | |
| 
 | |
| namespace llvm {
 | |
| 
 | |
| class BBLiveVar;
 | |
| class MachineInstr;
 | |
| 
 | |
| class FunctionLiveVarInfo : public FunctionPass {
 | |
|   // Machine Instr to LiveVarSet Map for providing LVset BEFORE each inst
 | |
|   // These sets are owned by this map and will be freed in releaseMemory().
 | |
|   hash_map<const MachineInstr *, ValueSet *> MInst2LVSetBI; 
 | |
| 
 | |
|   // Machine Instr to LiveVarSet Map for providing LVset AFTER each inst.
 | |
|   // These sets are just pointers to sets in MInst2LVSetBI or BBLiveVar.
 | |
|   hash_map<const MachineInstr *, ValueSet *> MInst2LVSetAI;
 | |
| 
 | |
|   hash_map<const BasicBlock*, BBLiveVar*> BBLiveVarInfo;
 | |
| 
 | |
|   // Stored Function that the data is computed with respect to
 | |
|   const Function *M;
 | |
| 
 | |
|   // --------- private methods -----------------------------------------
 | |
| 
 | |
|   // constructs BBLiveVars and init Def and In sets
 | |
|   void constructBBs(const Function *F);
 | |
|     
 | |
|   // do one backward pass over the CFG
 | |
|   bool doSingleBackwardPass(const Function *F, unsigned int iter); 
 | |
| 
 | |
|   // calculates live var sets for instructions in a BB
 | |
|   void calcLiveVarSetsForBB(const BasicBlock *BB);
 | |
|   
 | |
| public:
 | |
|   // --------- Implement the FunctionPass interface ----------------------
 | |
| 
 | |
|   // runOnFunction - Perform analysis, update internal data structures.
 | |
|   virtual bool runOnFunction(Function &F);
 | |
| 
 | |
|   // releaseMemory - After LiveVariable analysis has been used, forget!
 | |
|   virtual void releaseMemory();
 | |
| 
 | |
|   // getAnalysisUsage - Provide self!
 | |
|   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
 | |
|     AU.setPreservesAll();
 | |
|   }
 | |
| 
 | |
|   // --------- Functions to access analysis results -------------------
 | |
| 
 | |
|   // get OutSet of a BB
 | |
|   const ValueSet &getOutSetOfBB(const BasicBlock *BB) const;
 | |
|         ValueSet &getOutSetOfBB(const BasicBlock *BB)      ;
 | |
| 
 | |
|   // get InSet of a BB
 | |
|   const ValueSet &getInSetOfBB(const BasicBlock *BB) const;
 | |
|         ValueSet &getInSetOfBB(const BasicBlock *BB)      ;
 | |
| 
 | |
|   // gets the Live var set BEFORE an instruction.
 | |
|   // if BB is specified and the live var set has not yet been computed,
 | |
|   // it will be computed on demand.
 | |
|   const ValueSet &getLiveVarSetBeforeMInst(const MachineInstr *MI,
 | |
|                                            const BasicBlock *BB = 0);
 | |
| 
 | |
|   // gets the Live var set AFTER an instruction
 | |
|   // if BB is specified and the live var set has not yet been computed,
 | |
|   // it will be computed on demand.
 | |
|   const ValueSet &getLiveVarSetAfterMInst(const MachineInstr *MI,
 | |
|                                           const BasicBlock *BB = 0);
 | |
| };
 | |
| 
 | |
| } // End llvm namespace
 | |
| 
 | |
| #endif
 |