From a462fa1f9b01466830e8c025b669c21eef84ccbb Mon Sep 17 00:00:00 2001 From: Bill Williams Date: Wed, 12 Jul 2017 13:26:42 -0500 Subject: [PATCH] Added extra block locks to remove some more data races; added callback and method to allow renaming of functions that would by default be "targXXX" --- parseAPI/h/CFG.h | 1 + parseAPI/h/ParseCallback.h | 3 ++- parseAPI/src/ParseCallback.C | 5 +++++ parseAPI/src/Parser.C | 6 ++++-- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/parseAPI/h/CFG.h b/parseAPI/h/CFG.h index 0e11d1eeca..b9ebfc40e2 100644 --- a/parseAPI/h/CFG.h +++ b/parseAPI/h/CFG.h @@ -494,6 +494,7 @@ class PARSER_EXPORT Function : public allocatable, public AnnotatableSparse, pub virtual ~Function(); virtual const std::string & name() const; + void rename(std::string n) { _name = n; } Address addr() const { return _start; } CodeRegion * region() const { return _region; } diff --git a/parseAPI/h/ParseCallback.h b/parseAPI/h/ParseCallback.h index ef64b23e6d..b29b1b5672 100644 --- a/parseAPI/h/ParseCallback.h +++ b/parseAPI/h/ParseCallback.h @@ -155,6 +155,7 @@ class ParseCallback { virtual void add_block_cb(Function *, Block *) {}; virtual void modify_edge_cb(Edge *, Block *, ParseCallback::edge_type_t) {}; + virtual void function_discovery_cb(Function*) {}; private: }; @@ -204,7 +205,7 @@ class ParseCallbackManager { bool hasWeirdInsns(const Function*); void foundWeirdInsns(Function*); void split_block_cb(Block *, Block *); - + void discover_function(Function*); private: // Named the same as ParseCallback to make the code diff --git a/parseAPI/src/ParseCallback.C b/parseAPI/src/ParseCallback.C index 760a017558..ce4fbd0508 100644 --- a/parseAPI/src/ParseCallback.C +++ b/parseAPI/src/ParseCallback.C @@ -231,6 +231,11 @@ void ParseCallbackManager::split_block_cb(Block *a, Block *b) { (*iter)->split_block_cb(a, b); }; +void ParseCallbackManager::discover_function(Function* f) { + for (iterator iter = begin(); iter != end(); ++iter) + (*iter)->function_discovery_cb(f); +}; + void ParseCallbackManager::destroy_cb(Block *b) { for (iterator iter = begin(); iter != end(); ++iter) (*iter)->destroy_cb(b); diff --git a/parseAPI/src/Parser.C b/parseAPI/src/Parser.C index 157d4cc2a6..2681ee2c3a 100644 --- a/parseAPI/src/Parser.C +++ b/parseAPI/src/Parser.C @@ -1023,6 +1023,7 @@ Parser::parse_frame(ParseFrame & frame, bool recursive) { // check for system call FT Edge* edge = work->edge(); Block::Insns blockInsns; + boost::lock_guard src_guard(*edge->src()); edge->src()->getInsns(blockInsns); auto prev = blockInsns.rbegin(); InstructionAPI::InstructionPtr prevInsn = prev->second; @@ -1777,6 +1778,7 @@ Parser::bind_call(ParseFrame & frame, Address target, Block * cur, Edge * exist) FILE__,__LINE__,target); return pair((Function *) NULL,exist); } + _pcb.discover_function(tfunc); // add an edge pair ret = add_edge(frame,tfunc,cur,target,CALL,exist); @@ -1886,8 +1888,8 @@ Parser::link(Block *src, Block *dst, EdgeTypeEnum et, bool sink) assert(et != NOEDGE); Edge * e = factory()._mkedge(src,dst,et); e->_type._sink = sink; - src->_trglist.push_back(e); - dst->_srclist.push_back(e); + src->addTarget(e); + dst->addSource(e); _pcb.addEdge(src, e, ParseCallback::target); _pcb.addEdge(dst, e, ParseCallback::source); return e;