From 9f5fba7003c76b6317b3ec2fd68463a03a8ac390 Mon Sep 17 00:00:00 2001 From: Vern Paxson Date: Fri, 7 Mar 2025 09:21:09 -0800 Subject: [PATCH] -O gen-C++ support for type expressions --- src/script_opt/CPP/Consts.cc | 2 ++ src/script_opt/CPP/Driver.cc | 1 + src/script_opt/CPP/InitsInfo.cc | 5 +++++ src/script_opt/CPP/InitsInfo.h | 10 ++++++++++ src/script_opt/CPP/RuntimeInits.cc | 9 +++++++++ src/script_opt/CPP/RuntimeInits.h | 2 ++ 6 files changed, 29 insertions(+) diff --git a/src/script_opt/CPP/Consts.cc b/src/script_opt/CPP/Consts.cc index 1c51560253..d29f1d6b5f 100644 --- a/src/script_opt/CPP/Consts.cc +++ b/src/script_opt/CPP/Consts.cc @@ -103,6 +103,8 @@ shared_ptr CPPCompile::RegisterConstant(const ValPtr& vp, int& con case TYPE_FUNC: gi = make_shared(this, vp); break; + case TYPE_TYPE: gi = make_shared(this, vp); break; + default: reporter->InternalError("bad constant type in CPPCompile::AddConstant"); break; } diff --git a/src/script_opt/CPP/Driver.cc b/src/script_opt/CPP/Driver.cc index f3cb663aa3..335d520401 100644 --- a/src/script_opt/CPP/Driver.cc +++ b/src/script_opt/CPP/Driver.cc @@ -294,6 +294,7 @@ void CPPCompile::GenProlog() { const_info[TYPE_TABLE] = CreateCompoundInitInfo("Table", "ValPtr"); const_info[TYPE_FUNC] = CreateCompoundInitInfo("Func", "ValPtr"); const_info[TYPE_FILE] = CreateCompoundInitInfo("File", "ValPtr"); + const_info[TYPE_TYPE] = CreateCompoundInitInfo("TypeVal", "Ptr"); type_info = CreateCompoundInitInfo("Type", "Ptr"); attr_info = CreateCompoundInitInfo("Attr", "Ptr"); diff --git a/src/script_opt/CPP/InitsInfo.cc b/src/script_opt/CPP/InitsInfo.cc index 122b37b9b2..2500b42806 100644 --- a/src/script_opt/CPP/InitsInfo.cc +++ b/src/script_opt/CPP/InitsInfo.cc @@ -299,6 +299,11 @@ void FuncConstInfo::InitializerVals(std::vector& ivs) const { } } +void TypeConstInfo::InitializerVals(std::vector& ivs) const { + auto& t = tv->GetType()->AsTypeType()->GetType(); + ivs.emplace_back(Fmt(t->Tag())); +} + AttrInfo::AttrInfo(CPPCompile* _c, const AttrPtr& attr) : CompoundItemInfo(_c) { vals.emplace_back(Fmt(static_cast(attr->Tag()))); auto a_e = attr->GetExpr(); diff --git a/src/script_opt/CPP/InitsInfo.h b/src/script_opt/CPP/InitsInfo.h index b7e58b63d1..54c4600af1 100644 --- a/src/script_opt/CPP/InitsInfo.h +++ b/src/script_opt/CPP/InitsInfo.h @@ -467,6 +467,16 @@ private: FuncVal* fv; }; +class TypeConstInfo : public CompoundItemInfo { +public: + TypeConstInfo(CPPCompile* _c, ValPtr v) : CompoundItemInfo(_c, v), tv(v->AsTypeVal()) {} + + void InitializerVals(std::vector& ivs) const override; + +private: + TypeVal* tv; +}; + // Initialization information for single attributes and sets of attributes. class AttrInfo : public CompoundItemInfo { public: diff --git a/src/script_opt/CPP/RuntimeInits.cc b/src/script_opt/CPP/RuntimeInits.cc index b7f28a7403..a24a3a6cdb 100644 --- a/src/script_opt/CPP/RuntimeInits.cc +++ b/src/script_opt/CPP/RuntimeInits.cc @@ -149,6 +149,14 @@ void CPP_IndexedInits::Generate(InitsManager* im, std::vector& iv ivec[offset] = lookup_func__CPP(fn, num_bodies, hashes, im->Types(t)); } +template +void CPP_IndexedInits::Generate(InitsManager* im, std::vector& ivec, int offset, + ValElemVec& init_vals) const { + auto bt = base_type(static_cast(init_vals[0])); + auto t = make_intrusive(bt); + ivec[offset] = make_intrusive(t); +} + template void CPP_IndexedInits::Generate(InitsManager* im, std::vector& ivec, int offset, ValElemVec& init_vals) const { @@ -216,6 +224,7 @@ template class CPP_IndexedInits; template class CPP_IndexedInits; template class CPP_IndexedInits; template class CPP_IndexedInits; +template class CPP_IndexedInits; template class CPP_IndexedInits; template class CPP_IndexedInits; template class CPP_IndexedInits; diff --git a/src/script_opt/CPP/RuntimeInits.h b/src/script_opt/CPP/RuntimeInits.h index 4ced70af63..d20f4b7bb5 100644 --- a/src/script_opt/CPP/RuntimeInits.h +++ b/src/script_opt/CPP/RuntimeInits.h @@ -16,6 +16,7 @@ namespace zeek::detail { using FileValPtr = IntrusivePtr; using FuncValPtr = IntrusivePtr; +using TypeValPtr = IntrusivePtr; class InitsManager; @@ -274,6 +275,7 @@ protected: void Generate(InitsManager* im, std::vector& ivec, int offset, ValElemVec& init_vals) const; void Generate(InitsManager* im, std::vector& ivec, int offset, ValElemVec& init_vals) const; void Generate(InitsManager* im, std::vector& ivec, int offset, ValElemVec& init_vals) const; + void Generate(InitsManager* im, std::vector& ivec, int offset, ValElemVec& init_vals) const; void Generate(InitsManager* im, std::vector& ivec, int offset, ValElemVec& init_vals) const; void Generate(InitsManager* im, std::vector& ivec, int offset, ValElemVec& init_vals) const;