mirror of
https://github.com/zeek/zeek.git
synced 2025-10-08 09:38:19 +00:00
track implicit assignments when profiling, associate counts with assignees
This commit is contained in:
parent
dbb509448f
commit
fb101f7b0e
2 changed files with 22 additions and 6 deletions
|
@ -261,13 +261,17 @@ TraversalCode ProfileFunc::PreExpr(const Expr* e)
|
|||
}
|
||||
break;
|
||||
|
||||
case EXPR_INCR:
|
||||
case EXPR_DECR:
|
||||
case EXPR_ADD_TO:
|
||||
case EXPR_REMOVE_FROM:
|
||||
case EXPR_ASSIGN:
|
||||
{
|
||||
if ( e->GetOp1()->Tag() == EXPR_REF )
|
||||
{
|
||||
auto lhs = e->GetOp1()->GetOp1();
|
||||
if ( lhs->Tag() == EXPR_NAME )
|
||||
assignees.insert(lhs->AsNameExpr()->Id());
|
||||
TrackAssignment(lhs->AsNameExpr()->Id());
|
||||
}
|
||||
// else this isn't a direct assignment.
|
||||
break;
|
||||
|
@ -432,6 +436,14 @@ void ProfileFunc::TrackID(const ID* id)
|
|||
ordered_ids.push_back(id);
|
||||
}
|
||||
|
||||
void ProfileFunc::TrackAssignment(const ID* id)
|
||||
{
|
||||
if ( assignees.count(id) > 0 )
|
||||
++assignees[id];
|
||||
else
|
||||
assignees[id] = 1;
|
||||
}
|
||||
|
||||
|
||||
ProfileFuncs::ProfileFuncs(std::vector<FuncInfo>& funcs,
|
||||
is_compilable_pred pred, bool _full_record_hashes)
|
||||
|
|
|
@ -103,7 +103,7 @@ public:
|
|||
{ return locals; }
|
||||
const std::unordered_set<const ID*>& Params() const
|
||||
{ return params; }
|
||||
const std::unordered_set<const ID*>& Assignees() const
|
||||
const std::unordered_map<const ID*, int>& Assignees() const
|
||||
{ return assignees; }
|
||||
const std::unordered_set<const ID*>& Inits() const
|
||||
{ return inits; }
|
||||
|
@ -166,6 +166,9 @@ protected:
|
|||
// Take note of the presence of an identifier.
|
||||
void TrackID(const ID* id);
|
||||
|
||||
// Take note of an assignment to an identifier.
|
||||
void TrackAssignment(const ID* id);
|
||||
|
||||
// Globals seen in the function.
|
||||
//
|
||||
// Does *not* include globals solely seen as the function being
|
||||
|
@ -187,10 +190,11 @@ protected:
|
|||
// function.
|
||||
int num_params = -1;
|
||||
|
||||
// Identifiers (globals, locals, parameters) that are assigned to.
|
||||
// Does not include implicit assignments due to initializations,
|
||||
// which are instead captured in "inits".
|
||||
std::unordered_set<const ID*> assignees;
|
||||
// Maps identifiers (globals, locals, parameters) to how often
|
||||
// they are assigned to (no entry if never). Does not include
|
||||
// implicit assignments due to initializations, which are instead
|
||||
// captured in "inits".
|
||||
std::unordered_map<const ID*, int> assignees;
|
||||
|
||||
// Same for locals seen in initializations, so we can find,
|
||||
// for example, unused aggregates.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue