From 26dae9a5ae8635bf70f81ec3a5be0eeeb373fd2f Mon Sep 17 00:00:00 2001 From: Vern Paxson Date: Fri, 14 Oct 2022 08:37:45 -0500 Subject: [PATCH] -O gen-C++ maintenance: fixes for attributes & initializing globals --- src/script_opt/CPP/Consts.cc | 10 ++++++++++ src/script_opt/CPP/Driver.cc | 14 ++++++++++---- src/script_opt/CPP/Inits.cc | 16 ++++++++++------ src/script_opt/CPP/InitsInfo.cc | 10 ++++++++++ src/script_opt/CPP/RuntimeInits.cc | 4 ++++ src/script_opt/CPP/RuntimeOps.cc | 5 +++++ src/script_opt/CPP/RuntimeOps.h | 3 +++ src/script_opt/CPP/maint/README | 2 +- src/script_opt/CPP/maint/check-CPP-gen.sh | 2 +- 9 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/script_opt/CPP/Consts.cc b/src/script_opt/CPP/Consts.cc index c53f5b0395..8e1655af4f 100644 --- a/src/script_opt/CPP/Consts.cc +++ b/src/script_opt/CPP/Consts.cc @@ -48,6 +48,16 @@ shared_ptr CPPCompile::RegisterConstant(const ValPtr& vp, int& con // render the same. t->Describe(&d); + // Likewise, tables that have attributes. + if ( t->Tag() == TYPE_TABLE ) + { + const auto& attrs = v->AsTableVal()->GetAttrs(); + if ( attrs ) + attrs->Describe(&d); + else + d.Add(""); + } + c_desc = d.Description(); } diff --git a/src/script_opt/CPP/Driver.cc b/src/script_opt/CPP/Driver.cc index aae5ffe321..1c14c33b18 100644 --- a/src/script_opt/CPP/Driver.cc +++ b/src/script_opt/CPP/Driver.cc @@ -311,8 +311,11 @@ void CPPCompile::RegisterCompiledBody(const string& f) void CPPCompile::GenEpilog() { - NL(); - InitializeGlobals(); + if ( standalone ) + { + NL(); + InitializeGlobals(); + } NL(); for ( const auto& ii : init_infos ) @@ -472,8 +475,11 @@ void CPPCompile::GenFinishInit() NL(); Emit("load_BiFs__CPP();"); - NL(); - Emit("init_globals__CPP();"); + if ( standalone ) + { + NL(); + Emit("init_globals__CPP();"); + } EndBlock(); } diff --git a/src/script_opt/CPP/Inits.cc b/src/script_opt/CPP/Inits.cc index 171350b83a..330a72bee5 100644 --- a/src/script_opt/CPP/Inits.cc +++ b/src/script_opt/CPP/Inits.cc @@ -206,12 +206,7 @@ void CPPCompile::InitializeGlobals() auto& init = ginit.Init(); if ( ic == INIT_NONE ) - { - IDPtr gid = {NewRef{}, const_cast(g)}; - auto gn = make_intrusive(make_intrusive(gid)); - auto ae = make_intrusive(gn, init, true); - Emit(GenExpr(ae.get(), GEN_NATIVE, true) + ";"); - } + Emit(GenExpr(init, GEN_NATIVE, true) + ";"); else { @@ -227,6 +222,15 @@ void CPPCompile::InitializeGlobals() Emit("%s->SetValue(%s, %s);", globals[g->Name()], GenExpr(init, GEN_NATIVE, true), ics); } + + const auto& attrs = g->GetAttrs(); + if ( attrs ) + { + string attr_tags; + string attr_vals; + BuildAttrs(attrs, attr_tags, attr_vals); + Emit("assign_attrs__CPP(%s, %s, %s);", globals[g->Name()], attr_tags, attr_vals); + } } EndBlock(); diff --git a/src/script_opt/CPP/InitsInfo.cc b/src/script_opt/CPP/InitsInfo.cc index a4cca821f0..16152a0f4b 100644 --- a/src/script_opt/CPP/InitsInfo.cc +++ b/src/script_opt/CPP/InitsInfo.cc @@ -211,6 +211,16 @@ TableConstInfo::TableConstInfo(CPPCompile* c, ValPtr v) : CompoundItemInfo(c, v) { auto tv = cast_intrusive(v); + auto gi = c->RegisterAttributes(tv->GetAttrs()); + int attrs = -1; + if ( gi ) + { + init_cohort = max(init_cohort, gi->InitCohort() + 1); + attrs = gi->Offset(); + } + + vals.emplace_back(std::to_string(attrs)); + for ( auto& tv_i : tv->ToMap() ) { vals.emplace_back(ValElem(c, tv_i.first)); // index diff --git a/src/script_opt/CPP/RuntimeInits.cc b/src/script_opt/CPP/RuntimeInits.cc index dc06c12d3e..b2126b4dcc 100644 --- a/src/script_opt/CPP/RuntimeInits.cc +++ b/src/script_opt/CPP/RuntimeInits.cc @@ -114,10 +114,14 @@ void CPP_IndexedInits::Generate(InitsManager* im, std::vector& i auto iv_it = init_vals.begin(); auto iv_end = init_vals.end(); auto t = *(iv_it++); + auto attrs = *(iv_it++); auto tt = cast_intrusive(im->Types(t)); auto tv = make_intrusive(tt); + if ( attrs >= 0 ) + tv->SetAttrs(im->Attributes(attrs)); + while ( iv_it != iv_end ) { auto index = im->ConstVals(*(iv_it++)); diff --git a/src/script_opt/CPP/RuntimeOps.cc b/src/script_opt/CPP/RuntimeOps.cc index a6af5cad3e..2fae492c28 100644 --- a/src/script_opt/CPP/RuntimeOps.cc +++ b/src/script_opt/CPP/RuntimeOps.cc @@ -259,6 +259,11 @@ TableValPtr table_constructor__CPP(vector indices, vector vals, return aggr; } +void assign_attrs__CPP(IDPtr id, std::vector attr_tags, std::vector attr_vals) + { + id->SetAttrs(build_attrs__CPP(move(attr_tags), move(attr_vals))); + } + RecordValPtr record_constructor__CPP(vector vals, RecordTypePtr t) { auto rv = make_intrusive(t); diff --git a/src/script_opt/CPP/RuntimeOps.h b/src/script_opt/CPP/RuntimeOps.h index 8c04e214bf..c32773c0fb 100644 --- a/src/script_opt/CPP/RuntimeOps.h +++ b/src/script_opt/CPP/RuntimeOps.h @@ -171,6 +171,9 @@ extern TableValPtr table_constructor__CPP(std::vector indices, std::vect TableTypePtr t, std::vector attr_tags, std::vector attr_vals); +// Assigns a set of attributes to an identifier. +extern void assign_attrs__CPP(IDPtr id, std::vector attr_tags, std::vector attr_vals); + // Constructs a record of the given type, whose (ordered) fields are // assigned to the corresponding elements of the given vector of values. extern RecordValPtr record_constructor__CPP(std::vector vals, RecordTypePtr t); diff --git a/src/script_opt/CPP/maint/README b/src/script_opt/CPP/maint/README index e3ec4577fa..076d1e5b63 100644 --- a/src/script_opt/CPP/maint/README +++ b/src/script_opt/CPP/maint/README @@ -15,7 +15,7 @@ The maintenance workflow: to check in updates to the list of how the compiler currently fares on various btests (see end of this doc): - Thu Sep 29 14:49:49 PDT 2022 + Wed Oct 12 11:36:46 PDT 2022 2. Run "find-test-files.sh" to generate a list (to stdout) of all of the possible Zeek source files found in the test suite. diff --git a/src/script_opt/CPP/maint/check-CPP-gen.sh b/src/script_opt/CPP/maint/check-CPP-gen.sh index efa52d03a5..dae5e93720 100755 --- a/src/script_opt/CPP/maint/check-CPP-gen.sh +++ b/src/script_opt/CPP/maint/check-CPP-gen.sh @@ -10,7 +10,7 @@ gen_out=CPP-test/gen.$abbr echo "fail" exit 1 fi - if grep -E -q 'deprecated|skipping|cannot compile|no matching functions' $gen_out; then + if grep -E -q '(deprecated.*(when|vector))|skipping|cannot compile|no matching functions' $gen_out; then echo "fail" exit 1 fi