diff --git a/src/Prev_Over/ExistHitPrevOAdapter.h b/src/Prev_Over/ExistHitPrevOAdapter.h index 2b4d16caa1aa7f5a65fff3e764bf16352132b180..400e835cf55e47cd4f0172509d8ce612bbdab534 100644 --- a/src/Prev_Over/ExistHitPrevOAdapter.h +++ b/src/Prev_Over/ExistHitPrevOAdapter.h @@ -31,7 +31,7 @@ public: void update(otawa::Block *v, t& d); private: - lrumc::ACSManager _mayManager; + lrupreanalysis::eh_em::ACSManager _mayManager; domain_t _domain; graph_t _graph; store_t _store; diff --git a/src/Prev_Over/ExistHitPrevODomain.h b/src/Prev_Over/ExistHitPrevODomain.h index fe8b35bedb3fc3ea0670ccec89013dfe12a554df..6b35f4a1d2a4383711939bfc35b1f05ad74131c9 100644 --- a/src/Prev_Over/ExistHitPrevODomain.h +++ b/src/Prev_Over/ExistHitPrevODomain.h @@ -25,8 +25,8 @@ public: inline void copy(t& d, const t& s) { d.copy(s); } bool equals(const t& a, const t& b) const; void join(t& d, const t& s); - void fetch(t& a, const otawa::icache::Access& ac, lrumc::ACSManager& mayManager); - void update(const otawa::icache::Access& access, t& a, lrumc::ACSManager& mayManager); + void fetch(t& a, const otawa::icache::Access& ac, lrupreanalysis::eh_em::ACSManager& mayManager); + void update(const otawa::icache::Access& access, t& a, lrupreanalysis::eh_em::ACSManager& mayManager); private: int _n; diff --git a/src/Prev_Over/lrusecurity_ExistHitPrevODomain.cpp b/src/Prev_Over/lrusecurity_ExistHitPrevODomain.cpp index 1e316e313c9c422030711d87bc7a9b335f5acd4d..d0799d9ff35c368740cdf14bb97323895429ea23 100644 --- a/src/Prev_Over/lrusecurity_ExistHitPrevODomain.cpp +++ b/src/Prev_Over/lrusecurity_ExistHitPrevODomain.cpp @@ -6,17 +6,17 @@ namespace lrusecurity { ExistHitPrevODomain::ExistHitPrevODomain( - const icat3::LBlockCollection& coll, - int set, - const t *init) : - _n(coll[set].count()), - _bot(_n), - _top(_n, Address(0x0)),//TO CHANGE - _set(set), + const icat3::LBlockCollection& coll, + int set, + const t *init): + _n(coll[set].count()), + _bot(_n), + _top(_n, Address(0x0)), //TO CHANGE + _set(set), _coll(coll), - _A(coll.A()), - _init(init ? *init : _top), - _tmp(_n) + _A(coll.A()), + _init(init ? *init : _top), + _tmp(_n) { } @@ -27,9 +27,10 @@ bool ExistHitPrevODomain::equals(const t& acss, const t& bcss) const return false; return true; } - void ExistHitPrevODomain::join(t& dcss, const t& scss) + +void ExistHitPrevODomain::join(t& dcss, const t& scss) { - for (int i = 0; i < _n; i++){ + for (int i = 0; i < _n; i++){ int newsize = dcss[i].size()+scss[i].size(); Bag
newbag = Bag
(newsize); for (int j = 0; j < newsize; j++) { @@ -40,45 +41,44 @@ bool ExistHitPrevODomain::equals(const t& acss, const t& bcss) const } dcss[i] = Bag
(newbag); } - - } - void ExistHitPrevODomain::fetch(t& acss, const icache::Access& access, lrumc::ACSManager& mayManager) + +void ExistHitPrevODomain::fetch(t& acss, const icache::Access& access, lrupreanalysis::eh_em::ACSManager& mayManager) { icat3::LBlock *lb = icat3::LBLOCK(access); int b = lb->index(); for (int i = 0; i < _n; i++){ if (i == b){ - Address smol[] = {access.address()}; - acss[i] = Bag
(1,smol);} - else if (mayManager.mayAge(lb) == _A) + Address smol[] = {access.address()}; + acss[i] = Bag
(1, smol); + } else if (mayManager.mayAge(_coll[_set][i]) == _A) acss[i] = Bag
(); } } -void ExistHitPrevODomain::update(const icache::Access& access, t& a, lrumc::ACSManager& mayManager) +void ExistHitPrevODomain::update(const icache::Access& access, t& a, lrupreanalysis::eh_em::ACSManager& mayManager) { - switch(access.kind()) { + switch(access.kind()) { - case icache::FETCH: - if(_coll.cache()->set(access.address()) == _set) - fetch(a, access, mayManager); - break; + case icache::FETCH: + if(_coll.cache()->set(access.address()) == _set) + fetch(a, access, mayManager); + break; - case icache::PREFETCH: - if(_coll.cache()->set(access.address()) == _set) { - copy(_tmp, a); - fetch(a, access, mayManager); - join(a, _tmp); - } - break; + case icache::PREFETCH: + if(_coll.cache()->set(access.address()) == _set) { + copy(_tmp, a); + fetch(a, access, mayManager); + join(a, _tmp); + } + break; - case icache::NONE: - break; + case icache::NONE: + break; - default: - ASSERT(false); - } + default: + ASSERT(false); + } } } // namespace lrusecurity diff --git a/src/Prev_Under/lrusecurity_ExistHitPrevUAdapter.cpp b/src/Prev_Under/lrusecurity_ExistHitPrevUAdapter.cpp index 48350e2d333645e820eb83127fa1ce690927a719..b8e3f509ed2810d88b726702fdab77e7ced6cf22 100644 --- a/src/Prev_Under/lrusecurity_ExistHitPrevUAdapter.cpp +++ b/src/Prev_Under/lrusecurity_ExistHitPrevUAdapter.cpp @@ -1,4 +1,3 @@ - #include "ExistHitPrevUAdapter.h" #include @@ -7,13 +6,14 @@ using namespace otawa; namespace lrusecurity { + ExistHitPrevUAdapter::ExistHitPrevUAdapter( int set, const t* init, const icat3::LBlockCollection& coll, const CFGCollection& cfgs, otawa::WorkSpace* ws) : - _set(set), + _set(set), _ehManager(ws), _domain(coll, set, init), _graph(cfgs), @@ -29,7 +29,6 @@ void ExistHitPrevUAdapter::update(const Bag& accs, t& d) } } - void ExistHitPrevUAdapter::update(Block *v, t& d) { _domain.copy(d, _domain.bot()); @@ -44,11 +43,12 @@ void ExistHitPrevUAdapter::update(Block *v, t& d) _domain.copy(s, _store.get(w)); _ehManager.start(w); + if(first) { first = false; _ehManager.ehDomain(_set).copy(d_eh, _ehManager.ehDomain(_set).bot()); } - + // apply block { const Bag& accs = icache::ACCESSES(w); @@ -68,6 +68,7 @@ void ExistHitPrevUAdapter::update(Block *v, t& d) lrupreanalysis::eh_em::ExistHitDomain::t* tmp = _ehManager.ehValue(_set); ASSERT(tmp && "tmp null"); lrupreanalysis::eh_em::ExistHitDomain::t& s_eh = *tmp; + ASSERT(d_eh.count() == s_eh.count()); _domain.join(d, s, d_eh, s_eh); _ehManager.ehDomain(_set).join(d_eh, s_eh); } diff --git a/src/Prev_Under/lrusecurity_ExistHitPrevUAnalysis.cpp b/src/Prev_Under/lrusecurity_ExistHitPrevUAnalysis.cpp index b90cbefe7c60477c7a48ece6af88e0f4fed77871..5cc6773010cdad11dbc5000233bd8d3419d88fda 100644 --- a/src/Prev_Under/lrusecurity_ExistHitPrevUAnalysis.cpp +++ b/src/Prev_Under/lrusecurity_ExistHitPrevUAnalysis.cpp @@ -1,4 +1,3 @@ - #include "ExistHitPrevUAnalysis.h" #include @@ -12,6 +11,7 @@ #include "ExistHitPrevUAdapter.h" #include "ExistHitPrevUDomain.h" + using namespace otawa; namespace lrusecurity @@ -24,6 +24,7 @@ ExistHitPrevUAnalysis::ExistHitPrevUAnalysis(p::declare& r) : _cfgs(nullptr) { } + void ExistHitPrevUAnalysis::configure(const PropList& props) { Processor::configure(props); @@ -61,13 +62,13 @@ void ExistHitPrevUAnalysis::setup(WorkSpace* ws) if(logFor(LOG_FUN)) log << "\tExist Hit Prev Analysis running time: " << elapsed.count() << " s" << io::endl; } + void ExistHitPrevUAnalysis::destroy(WorkSpace*) { for(CFGCollection::BlockIter b(_cfgs); b; b++) EXIST_HIT_PREV_IN(b).remove(); } - void ExistHitPrevUAnalysis::processSet(int set, WorkSpace* ws) { // perform the analysis diff --git a/src/Prev_Under/lrusecurity_ExistHitPrevUDomain.cpp b/src/Prev_Under/lrusecurity_ExistHitPrevUDomain.cpp index 4b17b6f089b120d31f61551ca39b49ddec1a1520..ca8adeaf508f900024d1d2f7a614ee89bd9f4f2c 100644 --- a/src/Prev_Under/lrusecurity_ExistHitPrevUDomain.cpp +++ b/src/Prev_Under/lrusecurity_ExistHitPrevUDomain.cpp @@ -6,17 +6,17 @@ namespace lrusecurity { ExistHitPrevUDomain::ExistHitPrevUDomain( - const icat3::LBlockCollection& coll, - int set, - const t *init) : - _n(coll[set].count()), - _bot(_n), - _top(_n, Address(0x0)),//TO CHANGE - _set(set), + const icat3::LBlockCollection& coll, + int set, + const t *init): + _n(coll[set].count()), + _bot(_n), + _top(_n, Address(0x0)), //TO CHANGE + _set(set), _coll(coll), - _A(coll.A()), - _init(init ? *init : _top), - _tmp(_n) + _A(coll.A()), + _init(init ? *init : _top), + _tmp(_n) { } @@ -27,61 +27,62 @@ bool ExistHitPrevUDomain::equals(const t& acss, const t& bcss) const return false; return true; } - void ExistHitPrevUDomain::join(t& dcss, const t& scss, icat3::ACS d_eh, icat3::ACS s_eh) + +void ExistHitPrevUDomain::join(t& dcss, const t& scss, icat3::ACS d_eh, icat3::ACS s_eh) { - for (int i = 0; i < _n; i++){ - if (s_eh[i] < d_eh[i] || (d_eh[i] == -1 && s_eh[i] != -1)){ + for (int i = 0; i < _n; i++) { + if (s_eh[i] < d_eh[i] || (d_eh[i] == -1 && s_eh[i] != -1)) { dcss[i] = scss[i]; - } - else if (s_eh[i] == d_eh[i]){ - int fullsize = (dcss[i]).size()+(scss[i]).size(); - Bag
tmp = Bag
(fullsize); - for (int j = 0; j < fullsize; j++){ - if (j < (dcss[i]).size()) - tmp[j] = dcss[i][j] ; - else - tmp[j] = scss[i][j-dcss[i].size()]; + } else if (s_eh[i] == d_eh[i]) { + int fullsize = (dcss[i]).size() + (scss[i]).size(); + Bag
tmp = Bag
(fullsize); + for (int j = 0; j < fullsize; j++) { + if (j < (dcss[i]).size()) + tmp[j] = dcss[i][j]; + else + tmp[j] = scss[i][j - dcss[i].size()]; } dcss[i] = tmp; } } } - void ExistHitPrevUDomain::fetch(t& acss, const icache::Access& access, lrupreanalysis::eh_em::ACSManager& ehManager) + +void ExistHitPrevUDomain::fetch(t& acss, const icache::Access& access, lrupreanalysis::eh_em:: ACSManager & ehManager) { icat3::LBlock *lb = icat3::LBLOCK(access); int b = lb->index(); for (int i = 0; i < _n; i++){ if (i == b){ - Address smol[] = {access.address()}; - acss[i] = Bag
(1,smol);} - else if (ehManager.existHitAge(lb) == _A) + Address smol[] = {access.address()}; + acss[i] = Bag
(1, smol); + } else if (ehManager.existHitAge(_coll[_set][i]) == _A) acss[i] = Bag
(); } } void ExistHitPrevUDomain::update(const icache::Access& access, t& a, lrupreanalysis::eh_em::ACSManager& ehManager) { - switch(access.kind()) { + switch(access.kind()) { - case icache::FETCH: - if(_coll.cache()->set(access.address()) == _set) - fetch(a, access, ehManager); - break; + case icache::FETCH: + if(_coll.cache()->set(access.address()) == _set) + fetch(a, access, ehManager); + break; - case icache::PREFETCH: - if(_coll.cache()->set(access.address()) == _set) { - copy(_tmp, a); - fetch(a, access, ehManager); - join(a, _tmp, icat3::ACS(), icat3::ACS()); - } - break; + case icache::PREFETCH: + if(_coll.cache()->set(access.address()) == _set) { + copy(_tmp, a); + fetch(a, access, ehManager); + join(a, _tmp, icat3::ACS(), icat3::ACS()); + } + break; - case icache::NONE: - break; + case icache::NONE: + break; - default: - ASSERT(false); - } + default: + ASSERT(false); + } } } // namespace lrusecurity diff --git a/src/lrusecurity_Displayer.cpp b/src/lrusecurity_Displayer.cpp index e2b97c960866f08980057db08d7f54abf2c07119..5d17cf1f682644540669b2f522ef68ddca397873 100644 --- a/src/lrusecurity_Displayer.cpp +++ b/src/lrusecurity_Displayer.cpp @@ -7,7 +7,7 @@ #include #include //#include "SecCFGOutput.h" - using namespace otawa; +using namespace otawa; namespace lrusecurity { @@ -57,7 +57,7 @@ protected: _out.setStream(*_stream); } - _out << "ACCESS\t\tKIND\tCATEGORY\tBB\t"; + _out << "ACCESS\t\tKIND\tCATEGORY\t\tBB\t"; if(_line) _out << "\tLINE"; @@ -105,19 +105,29 @@ protected: } _out << "UNSAFE "; int set = otawa::icat3::LBLOCK(access)->set(); + + int number = 0; if (bb->hasProp(EXIST_HIT_PREV_IN)) { ACSSecurity prev = (*EXIST_HIT_PREV_IN(bb))[set]; int index = otawa::icat3::LBLOCK(access)->index(); - for (int i = 0; i < prev[index].size(); i++) - _out << prev[index][i]; + number = prev[index].size(); + for (int i = 0; i < number; i++) + _out << prev[index][i] << "\n\t\t\t\t\b"; + + // REMONTEE + for (int j = 0; j < number; j++) + _out << "\033[1A"; + } - - - _out << "\t\t"; - _out << "BB " << bb->index() << "\t\t"; + + _out << "\t\t\tBB " << bb->index() << "\t\t"; printLine(ws, bb->address(), bb->topAddress().offset()); - _out << io::endl; - } + + // DESCENTE + for (int i = 0; i < number-1; i++) + _out << "\n//"; + _out << io::endl; + } } void printLine(WorkSpace* ws, Address begin, Address::offset_t offset)