00001 #ifndef ISR_INCLUDED
00002 #define ISR_INCLUDED
00003
00004 #include <vector>
00005 #include "cxx_memory.h"
00006 #include "targ_isa_registers.h"
00007 #include "register.h"
00008 typedef UINT32 REGISTER_SET;
00009 typedef vector<mINT32> NODE_VECT;
00010
00011 #define INVALID_INDEX -1
00012
00013 class ISR_NODE
00014 {
00015 friend class ISR_PARENT_ITER;
00016 mINT32 _id;
00017 NODE_VECT _parents;
00018 BOOL _processed;
00019
00020
00021
00022
00023
00024
00025 REGISTER_SET _regset[ISA_REGISTER_CLASS_MAX+1];
00026
00027 public:
00028 ISR_NODE()
00029 :_id(INVALID_INDEX), _processed(FALSE) {}
00030
00031 BOOL Processed(void) { return _processed; }
00032 void Set_Processed(void) { _processed = TRUE; }
00033
00034 mINT32 Idx(void) { return _id; }
00035 void Set_Idx(mINT32 id) { _id = id; }
00036
00037 void Add_Parent(mINT32 par) {
00038 Is_True(par != INVALID_INDEX, ("Invalid ISR call graph parent id: %d", par));
00039 _parents.push_back(par);
00040 }
00041
00042 REGISTER_SET Regset(ISA_REGISTER_CLASS rc)
00043 {return _regset[rc]; }
00044
00045 void Set_Regset(ISA_REGISTER_CLASS rc, REGISTER_SET set)
00046 { _regset[rc] = set; }
00047
00048 void Add_Reg(ISA_REGISTER_CLASS rc, mREGISTER reg)
00049 { _regset[rc] = REGISTER_SET_Union1(_regset[rc], reg); }
00050
00051 void Regset_Intersect(ISA_REGISTER_CLASS rc, REGISTER_SET set)
00052 { _regset[rc] = REGISTER_SET_Intersection(_regset[rc], set); }
00053
00054 void Regset_Union(ISA_REGISTER_CLASS rc, REGISTER_SET set)
00055 { _regset[rc] = REGISTER_SET_Union(_regset[rc], set); }
00056
00057 BOOL Regset_Member(ISA_REGISTER_CLASS rc, mREGISTER reg)
00058 { return REGISTER_SET_MemberP(_regset[rc], reg); }
00059
00060 };
00061
00062 class ISR_PARENT_ITER
00063 {
00064 NODE_VECT::iterator _iter, _end;
00065
00066 public:
00067 ISR_PARENT_ITER(ISR_NODE& v)
00068 : _iter(v._parents.begin()), _end(v._parents.end()) {}
00069
00070 BOOL End() { return _iter == _end; }
00071 void Next() { _iter++; }
00072 mINT32 Idx() { return *_iter; }
00073 };
00074
00075
00076
00077 extern class ISR_NODE* isr_cg;
00078
00079 extern INT Read_isr_cg(ISR_NODE* cg, INT pu_num);
00080
00081 extern void Merge_Parents_Regset(ISR_NODE& node);
00082
00083 #endif // ISR_INCLUDED