Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

vars.h

Go to the documentation of this file.
00001 #ifndef VARS_H
00002 #define VARS_H
00003 
00004 #include "misc.h"
00005 #include "instr.h"
00006 // #include "nodes.h"
00007 
00008 // #include "my_stream.h"
00009 // #include "vis.h"
00010 
00011 #define IS_ARG_REG(x) (arch==AVR)?  ((x>=14) && (x<=25)) : \
00012  (((x>=16) && (x<=21)) || ((x>=48) && (x<=53)))
00013 
00014 
00015 class CVarRef {
00016   // Reference to a variable
00017   CInstr * Instr;
00018   CVarRef * Next;
00019  public:
00020   CVarRef() { Instr = NULL; Next = NULL; };
00021   CVarRef(CInstr * instr) { assert(instr); Instr = instr; Next = NULL; };
00022   CVarRef * Get_Next() { return(Next); };
00023   void Set_Next(CVarRef * next) { Next = next; };
00024   void Add_VarRef(CInstr * instr);
00025   
00026   CInstr * Get_Instr() { return(Instr); };
00027   void Set_Instr(CInstr * instr) { assert(instr); Instr = instr; };
00028   
00029   bool Contains_Pseudo_Instr() {
00030     CVarRef * cur=this;
00031     while (cur) {
00032       if (cur->Instr->Is_Pseudo())
00033     return true;
00034       else
00035     cur = cur->Next;
00036     }
00037     return false;
00038   };
00039 };
00040 
00041 class CCDGNode;
00042 
00043 class CReg {
00044   int Reg[FINAL+1];
00045   int Status;
00046  public:
00047   CReg();
00048   int Get_Status() { return Status; };
00049   int Get_Number(int which=LATEST);
00050   void Set_Number(int reg, int which=LATEST);
00051 };
00052 
00053 class CVar;
00054 
00055 class CVarList {
00056     CVar * Var;
00057     CVarList * Next;
00058 public: 
00059     CVarList() { Var = NULL; Next = NULL; };
00060     CVarList(CVar * var) { Var = var; Next = NULL; };
00061     CVar * Get_Var() { return Var; };
00062     CVarList * Get_Next() { return Next; };
00063     CVarList * Add_Var(CVar * var);
00064     bool Contains(CVar * var);
00065     bool Contains_Alias(CVar * var);
00066     CVar * Look_Up(int reg);
00067     int Get_Length();
00068     void Output_Debug(ostream &stream); 
00069     void Output_RegNumber_List(ostream &stream);
00070     bool Replace_All(CVar * old_var, CVar * new_var);
00071 };
00072 
00073 class CProc;
00074 
00075 class CVar {
00076     CVarRef * Defs, * Uses;
00077     CReg Register;
00078     bool Live;
00079     CVar * Next, * Prev;
00080     int VarNumber;
00081     CVarList InterfEdges;
00082     CProc * Procedure;
00083 public:
00084     CVar();
00085     CVar(int reg);
00086     void Analyze_Instruction(CInstr * instr, CCDGNode * node);
00087     void Add_Use(CInstr * instr) { Uses->Add_VarRef(instr); };
00088     void Add_Def(CInstr * instr) { Defs->Add_VarRef(instr); };
00089     CVar * Find_Latest_Var(int reg);
00090     CVar * Find_Next_Var(int reg, int which);
00091     CVar * Add_Var(CInstr * instr, int reg, int acc_type, int which_acc);
00092 
00093     CReg * Get_Register() { return &Register; };
00094     int Get_RegNumber(int which=LATEST) { 
00095       return Register.Get_Number((reg_reallocation_method==NONE)? ORIGINAL : which); 
00096     };
00097 
00098     CVarRef * Get_Defs() { return Defs; };
00099     CVarRef * Get_Uses() { return Uses; };
00100     CVar * Get_Next() { return Next; };
00101     CVar * Get_Prev() { return Prev; };
00102     void Set_Next(CVar * next) { Next = next; };
00103     void Set_Prev(CVar * prev) { Prev = prev; };
00104 
00105     CVar * Merge_Vars(CVar * that);
00106 
00107     int Number_Vars();
00108     int Get_VarNumber() { return VarNumber; };
00109     void Virtualize_Registers();
00110     int Merge_Zero_Register();
00111 
00112     void Find_Interference(int which);
00113     void Find_InterfEdges(int which);
00114     CVarList * Get_InterfEdges() { return &InterfEdges; };
00115     bool Interferes_With(CVar * var) {  
00116         assert(InterfEdges.Get_Var());
00117         return InterfEdges.Contains(var); 
00118     };
00119 
00120     void Output_Debug(ostream &stream, bool show_interference=false);
00121 };
00122 
00123 #endif
00124 
00125 
00126 
00127 

Generated on Sat May 8 14:08:33 2004 for Thrint by doxygen 1.3.6