support for more in-depth AST profiling

This commit is contained in:
Vern Paxson 2024-08-05 09:17:46 +01:00 committed by Arne Welzel
parent d2c6208421
commit 857df9f063
2 changed files with 34 additions and 4 deletions

View file

@ -487,10 +487,29 @@ TraversalCode ProfileFunc::PreExpr(const Expr* e) {
TraversalCode ProfileFunc::PreID(const ID* id) { TraversalCode ProfileFunc::PreID(const ID* id) {
TrackID(id); TrackID(id);
if ( id->IsGlobal() ) {
globals.insert(id);
all_globals.insert(id);
const auto& t = id->GetType();
TrackType(t);
if ( t->Tag() == TYPE_FUNC )
if ( t->AsFuncType()->Flavor() == FUNC_FLAVOR_EVENT )
events.insert(id->Name());
}
// There's no need for any further analysis of this ID. // There's no need for any further analysis of this ID.
return TC_ABORTSTMT; return TC_ABORTSTMT;
} }
TraversalCode ProfileFunc::PreType(const Type* t) {
TrackType(t);
// There's no need for any further analysis of this type.
return TC_ABORTSTMT;
}
void ProfileFunc::TrackType(const Type* t) { void ProfileFunc::TrackType(const Type* t) {
if ( ! t ) if ( ! t )
return; return;
@ -514,6 +533,11 @@ void ProfileFunc::TrackID(const ID* id) {
// Already tracked. // Already tracked.
return; return;
if ( id->IsGlobal() ) {
globals.insert(id);
all_globals.insert(id);
}
ordered_ids.push_back(id); ordered_ids.push_back(id);
} }

View file

@ -607,17 +607,23 @@ void analyze_scripts(bool no_unused_warnings) {
if ( analysis_options.use_CPP ) if ( analysis_options.use_CPP )
use_CPP(); use_CPP();
std::shared_ptr<ProfileFuncs> pfs;
// Note, in the following it's not clear whether the final argument
// for absolute/relative record fields matters any more ...
if ( generating_CPP )
pfs = std::make_shared<ProfileFuncs>(funcs, is_CPP_compilable, true, false);
else
pfs = std::make_shared<ProfileFuncs>(funcs, nullptr, true, true);
if ( generating_CPP ) { if ( generating_CPP ) {
if ( analysis_options.gen_ZAM ) if ( analysis_options.gen_ZAM )
reporter->FatalError("-O ZAM and -O gen-C++ conflict"); reporter->FatalError("-O ZAM and -O gen-C++ conflict");
generate_CPP(); generate_CPP(pfs);
exit(0); exit(0);
} }
// At this point we're done with C++ considerations, so instead analyze_scripts_for_ZAM(pfs);
// are compiling to ZAM.
analyze_scripts_for_ZAM();
if ( reporter->Errors() > 0 ) if ( reporter->Errors() > 0 )
reporter->FatalError("Optimized script execution aborted due to errors"); reporter->FatalError("Optimized script execution aborted due to errors");