00001 #ifndef VARS_H
00002 #define VARS_H
00003
00004 #include "misc.h"
00005 #include "instr.h"
00006
00007
00008
00009
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
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