diff --git a/CHANGES b/CHANGES index 393d119654..a066a4479c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,13 @@ +4.2.0-dev.442 | 2021-12-10 13:12:43 -0700 + + * fixes for vector operations (Vern Paxson, Corelight) + + * flag globals initialized to opaque values as non-compilable (Vern Paxson, Corelight) + + * skip type signatures for lambdas (Vern Paxson, Corelight) + + * fix for translating filenames beginning with numbers to C++ variable names (Vern Paxson, Corelight) + 4.2.0-dev.436 | 2021-12-10 13:11:36 -0700 * update script-to-C++ compilation for new record constructor internals (Vern Paxson, Corelight) diff --git a/VERSION b/VERSION index e730da5f1d..fc9f3a9c0a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.2.0-dev.436 +4.2.0-dev.442 diff --git a/src/script_opt/CPP/DeclFunc.cc b/src/script_opt/CPP/DeclFunc.cc index 0d9117d2d8..cdc95b5f2f 100644 --- a/src/script_opt/CPP/DeclFunc.cc +++ b/src/script_opt/CPP/DeclFunc.cc @@ -1,9 +1,5 @@ // See the file "COPYING" in the main distribution directory for copyright. -#include -#include -#include - #include "zeek/script_opt/CPP/Compile.h" namespace zeek::detail @@ -73,7 +69,7 @@ void CPPCompile::CreateFunction(const FuncTypePtr& ft, const ProfileFunc* pf, co func_index[fname] = cast; - if ( casting_index.count(cast) == 0 ) + if ( ! l && casting_index.count(cast) == 0 ) { casting_index[cast] = func_casting_glue.size(); diff --git a/src/script_opt/CPP/Emit.cc b/src/script_opt/CPP/Emit.cc index 84e122f9c0..0357815e54 100644 --- a/src/script_opt/CPP/Emit.cc +++ b/src/script_opt/CPP/Emit.cc @@ -1,9 +1,5 @@ // See the file "COPYING" in the main distribution directory for copyright. -#include -#include -#include - #include "zeek/script_opt/CPP/Compile.h" namespace zeek::detail diff --git a/src/script_opt/CPP/Exprs.cc b/src/script_opt/CPP/Exprs.cc index c0a0d40ede..ad8f49e513 100644 --- a/src/script_opt/CPP/Exprs.cc +++ b/src/script_opt/CPP/Exprs.cc @@ -1,9 +1,5 @@ // See the file "COPYING" in the main distribution directory for copyright. -#include -#include -#include - #include "zeek/RE.h" #include "zeek/script_opt/CPP/Compile.h" #include "zeek/script_opt/ProfileFunc.h" @@ -607,7 +603,7 @@ string CPPCompile::GenArithCoerceExpr(const Expr* e, GenType gt) } if ( is_vec ) - return string("vec_coerce_") + cast_name + "__CPP(" + GenExpr(op, GEN_NATIVE) + ", " + + return string("vec_coerce_to_") + cast_name + "__CPP(" + GenExpr(op, GEN_NATIVE) + ", " + GenTypeName(t) + ")"; return NativeToGT(cast_name + "(" + GenExpr(op, GEN_NATIVE) + ")", t, gt); @@ -810,7 +806,7 @@ string CPPCompile::GenBinary(const Expr* e, GenType gt, const char* op, const ch if ( t->Tag() == TYPE_VECTOR && t->Yield()->Tag() == TYPE_STRING && op2->GetType()->Tag() == TYPE_VECTOR ) - return string("vec_str_op_") + vec_op + "__CPP(" + gen1 + ", " + gen2 + ")"; + return string("str_vec_op_") + vec_op + "__CPP(" + gen1 + ", " + gen2 + ")"; return GenVectorOp(e, gen1, gen2, vec_op); } @@ -1129,9 +1125,21 @@ string CPPCompile::GenVectorOp(const Expr* e, string op, const char* vec_op) string CPPCompile::GenVectorOp(const Expr* e, string op1, string op2, const char* vec_op) { + auto& op1_t = e->GetOp1()->GetType(); + auto& op2_t = e->GetOp2()->GetType(); + + if ( op1_t->Tag() != TYPE_VECTOR || op2_t->Tag() != TYPE_VECTOR ) + { + // This is a deprecated mixed-scalar-and-vector operation. + // We don't support these. Arrange for linking errors. + reporter->Error( + "C++ generation does not support deprecated scalar-mixed-with-vector operations"); + return "vec_scalar_mixed_with_vector()"; + } + auto invoke = string(vec_op) + "__CPP(" + op1 + ", " + op2 + ")"; - if ( e->GetOp1()->GetType()->Yield()->Tag() == TYPE_STRING ) + if ( op2_t->Yield()->Tag() == TYPE_STRING ) return string("str_vec_op_") + invoke; auto gen = string("vec_op_") + invoke; diff --git a/src/script_opt/CPP/GenFunc.cc b/src/script_opt/CPP/GenFunc.cc index 47a9ec33bc..673e6def4a 100644 --- a/src/script_opt/CPP/GenFunc.cc +++ b/src/script_opt/CPP/GenFunc.cc @@ -1,9 +1,5 @@ // See the file "COPYING" in the main distribution directory for copyright. -#include -#include -#include - #include "zeek/script_opt/CPP/Compile.h" namespace zeek::detail @@ -210,6 +206,10 @@ string CPPCompile::BodyName(const FuncInfo& func) string fns = fn; transform(fns.begin(), fns.end(), fns.begin(), canonicalize); + if ( ! isalpha(fns[0]) ) + // This can happen for filenames beginning with numbers. + fns = "_" + fns; + fname = fns + "__" + fname; } diff --git a/src/script_opt/CPP/Inits.cc b/src/script_opt/CPP/Inits.cc index d462f19a82..f1d7a52338 100644 --- a/src/script_opt/CPP/Inits.cc +++ b/src/script_opt/CPP/Inits.cc @@ -1,9 +1,5 @@ // See the file "COPYING" in the main distribution directory for copyright. -#include -#include -#include - #include "zeek/module_util.h" #include "zeek/script_opt/CPP/Compile.h" #include "zeek/script_opt/IDOptInfo.h" diff --git a/src/script_opt/CPP/InitsInfo.cc b/src/script_opt/CPP/InitsInfo.cc index c83b78f5ed..2f2ab1ed8c 100644 --- a/src/script_opt/CPP/InitsInfo.cc +++ b/src/script_opt/CPP/InitsInfo.cc @@ -323,7 +323,8 @@ GlobalInitInfo::GlobalInitInfo(CPPCompile* c, const ID* g, string _CPP_name) { Zeek_name = g->Name(); - auto gi = c->RegisterType(g->GetType()); + auto& gt = g->GetType(); + auto gi = c->RegisterType(gt); init_cohort = max(init_cohort, gi->InitCohort() + 1); type = gi->Offset(); @@ -338,7 +339,15 @@ GlobalInitInfo::GlobalInitInfo(CPPCompile* c, const ID* g, string _CPP_name) exported = g->IsExport(); - val = ValElem(c, g->GetVal()); + auto v = g->GetVal(); + if ( v && gt->Tag() == TYPE_OPAQUE ) + { + reporter->Error("cannot compile to C++ global \"%s\" initialized to opaque value", + g->Name()); + v = nullptr; + } + + val = ValElem(c, v); } void GlobalInitInfo::InitializerVals(std::vector& ivs) const diff --git a/src/script_opt/CPP/RuntimeVec.h b/src/script_opt/CPP/RuntimeVec.h index 918bee2c49..96cc1cfc67 100644 --- a/src/script_opt/CPP/RuntimeVec.h +++ b/src/script_opt/CPP/RuntimeVec.h @@ -80,4 +80,9 @@ extern VectorValPtr vec_coerce_to_bro_int_t__CPP(const VectorValPtr& v, TypePtr extern VectorValPtr vec_coerce_to_bro_uint_t__CPP(const VectorValPtr& v, TypePtr targ); extern VectorValPtr vec_coerce_to_double__CPP(const VectorValPtr& v, TypePtr targ); +// A dummy function used during code generation for unsupported operations +// that mix vector and scalar arguments. We don't define it in RuntimeVec.cc +// so that it'll generate a linking error. +extern VectorValPtr vec_scalar_mixed_with_vector(); + } // namespace zeek::detail diff --git a/src/script_opt/CPP/Vars.cc b/src/script_opt/CPP/Vars.cc index c62aae0869..232fb7e4b2 100644 --- a/src/script_opt/CPP/Vars.cc +++ b/src/script_opt/CPP/Vars.cc @@ -1,9 +1,5 @@ // See the file "COPYING" in the main distribution directory for copyright. -#include -#include -#include - #include "zeek/script_opt/CPP/Compile.h" #include "zeek/script_opt/ProfileFunc.h"