inlining of Zeek script functions

This commit is contained in:
Vern Paxson 2020-11-19 16:05:42 -08:00
parent 3c39f11726
commit c42586af2c
63 changed files with 21807 additions and 171 deletions

View file

@ -10,6 +10,7 @@
#include "zeek/ZeekList.h"
#include "zeek/IntrusivePtr.h"
#include "zeek/StmtBase.h"
#include "zeek/Timer.h"
#include "zeek/Type.h"
#include "zeek/EventHandler.h"
@ -66,13 +67,19 @@ enum BroExprTag : int {
EXPR_CAST,
EXPR_IS,
EXPR_INDEX_SLICE_ASSIGN,
#define NUM_EXPRS (int(EXPR_INDEX_SLICE_ASSIGN) + 1)
#include "zeek/script_opt/ExprOpt-Enums.h"
EXPR_NOP,
#define NUM_EXPRS (int(EXPR_NOP) + 1)
};
extern const char* expr_name(BroExprTag t);
class ListExpr;
class NameExpr;
class ConstExpr;
class IndexExpr;
class AssignExpr;
class CallExpr;
@ -82,7 +89,7 @@ class Stmt;
class Expr;
using ExprPtr = IntrusivePtr<Expr>;
using EventExprPtr = IntrusivePtr<EventExpr>;
using ListExprPtr = IntrusivePtr<ListExpr>;
using StmtPtr = IntrusivePtr<Stmt>;
class Expr : public Obj {
public:
@ -99,6 +106,7 @@ public:
BroExprTag Tag() const { return tag; }
Expr* Ref() { zeek::Ref(this); return this; }
ExprPtr ThisPtr() { return {NewRef{}, this}; }
// Evaluates the expression and returns a corresponding Val*,
// or nil if the expression's value isn't fixed.
@ -171,22 +179,26 @@ public:
void MarkParen() { paren = true; }
bool IsParen() const { return paren; }
const ListExpr* AsListExpr() const;
ListExpr* AsListExpr();
#undef ACCESSORS
#define ACCESSORS(ctype) \
const ctype* As ## ctype () const; \
ctype* As ## ctype (); \
IntrusivePtr<ctype> As ## ctype ## Ptr ();
const NameExpr* AsNameExpr() const;
NameExpr* AsNameExpr();
const AssignExpr* AsAssignExpr() const;
AssignExpr* AsAssignExpr();
const IndexExpr* AsIndexExpr() const;
IndexExpr* AsIndexExpr();
ACCESSORS(ListExpr)
ACCESSORS(NameExpr)
ACCESSORS(ConstExpr)
ACCESSORS(CallExpr)
ACCESSORS(AssignExpr)
ACCESSORS(IndexExpr)
ACCESSORS(EventExpr)
void Describe(ODesc* d) const override final;
virtual TraversalCode Traverse(TraversalCallback* cb) const = 0;
#include "zeek/script_opt/ExprOpt-Public.h"
protected:
Expr() = default;
explicit Expr(BroExprTag arg_tag);
@ -211,6 +223,8 @@ protected:
BroExprTag tag;
TypePtr type;
bool paren;
#include "zeek/script_opt/ExprOpt-Private.h"
};
class NameExpr final : public Expr {
@ -226,6 +240,9 @@ public:
TraversalCode Traverse(TraversalCallback* cb) const override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
void ExprDescribe(ODesc* d) const override;
@ -238,11 +255,15 @@ public:
explicit ConstExpr(ValPtr val);
Val* Value() const { return val.get(); }
ValPtr ValuePtr() const { return val; }
ValPtr Eval(Frame* f) const override;
TraversalCode Traverse(TraversalCallback* cb) const override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
void ExprDescribe(ODesc* d) const override;
ValPtr val;
@ -261,6 +282,9 @@ public:
TraversalCode Traverse(TraversalCallback* cb) const override;
// Optimization-related:
ExprPtr Inline(Inliner* inl) override;
protected:
UnaryExpr(BroExprTag arg_tag, ExprPtr arg_op);
@ -286,6 +310,9 @@ public:
TraversalCode Traverse(TraversalCallback* cb) const override;
// Optimization-related:
ExprPtr Inline(Inliner* inl) override;
protected:
BinaryExpr(BroExprTag arg_tag,
ExprPtr arg_op1, ExprPtr arg_op2)
@ -325,6 +352,11 @@ protected:
// operands and also set expression's type).
void PromoteType(TypeTag t, bool is_vector);
// Promote one of the operands to be "double" (if not already),
// to make it suitable for combining with the other "interval"
// operand, yielding an "interval" type.
void PromoteForInterval(ExprPtr& op);
void ExprDescribe(ODesc* d) const override;
ExprPtr op1;
@ -336,6 +368,9 @@ public:
explicit CloneExpr(ExprPtr op);
ValPtr Eval(Frame* f) const override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v) const override;
};
@ -347,12 +382,18 @@ public:
ValPtr Eval(Frame* f) const override;
ValPtr DoSingleEval(Frame* f, Val* v) const;
bool IsPure() const override;
// Optimization-related:
ExprPtr Duplicate() override;
};
class ComplementExpr final : public UnaryExpr {
public:
explicit ComplementExpr(ExprPtr op);
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v) const override;
};
@ -361,6 +402,9 @@ class NotExpr final : public UnaryExpr {
public:
explicit NotExpr(ExprPtr op);
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v) const override;
};
@ -369,6 +413,9 @@ class PosExpr final : public UnaryExpr {
public:
explicit PosExpr(ExprPtr op);
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v) const override;
};
@ -377,6 +424,9 @@ class NegExpr final : public UnaryExpr {
public:
explicit NegExpr(ExprPtr op);
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v) const override;
};
@ -386,6 +436,9 @@ public:
explicit SizeExpr(ExprPtr op);
ValPtr Eval(Frame* f) const override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v) const override;
};
@ -394,35 +447,53 @@ class AddExpr final : public BinaryExpr {
public:
AddExpr(ExprPtr op1, ExprPtr op2);
void Canonicize() override;
// Optimization-related:
ExprPtr Duplicate() override;
};
class AddToExpr final : public BinaryExpr {
public:
AddToExpr(ExprPtr op1, ExprPtr op2);
ValPtr Eval(Frame* f) const override;
// Optimization-related:
ExprPtr Duplicate() override;
};
class RemoveFromExpr final : public BinaryExpr {
public:
RemoveFromExpr(ExprPtr op1, ExprPtr op2);
ValPtr Eval(Frame* f) const override;
// Optimization-related:
ExprPtr Duplicate() override;
};
class SubExpr final : public BinaryExpr {
public:
SubExpr(ExprPtr op1, ExprPtr op2);
// Optimization-related:
ExprPtr Duplicate() override;
};
class TimesExpr final : public BinaryExpr {
public:
TimesExpr(ExprPtr op1, ExprPtr op2);
void Canonicize() override;
// Optimization-related:
ExprPtr Duplicate() override;
};
class DivideExpr final : public BinaryExpr {
public:
DivideExpr(ExprPtr op1, ExprPtr op2);
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr AddrFold(Val* v1, Val* v2) const override;
};
@ -430,6 +501,9 @@ protected:
class ModExpr final : public BinaryExpr {
public:
ModExpr(ExprPtr op1, ExprPtr op2);
// Optimization-related:
ExprPtr Duplicate() override;
};
class BoolExpr final : public BinaryExpr {
@ -438,11 +512,17 @@ public:
ValPtr Eval(Frame* f) const override;
ValPtr DoSingleEval(Frame* f, ValPtr v1, Expr* op2) const;
// Optimization-related:
ExprPtr Duplicate() override;
};
class BitExpr final : public BinaryExpr {
public:
BitExpr(BroExprTag tag, ExprPtr op1, ExprPtr op2);
// Optimization-related:
ExprPtr Duplicate() override;
};
class EqExpr final : public BinaryExpr {
@ -450,6 +530,9 @@ public:
EqExpr(BroExprTag tag, ExprPtr op1, ExprPtr op2);
void Canonicize() override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v1, Val* v2) const override;
};
@ -458,6 +541,9 @@ class RelExpr final : public BinaryExpr {
public:
RelExpr(BroExprTag tag, ExprPtr op1, ExprPtr op2);
void Canonicize() override;
// Optimization-related:
ExprPtr Duplicate() override;
};
class CondExpr final : public Expr {
@ -473,6 +559,10 @@ public:
TraversalCode Traverse(TraversalCallback* cb) const override;
// Optimization-related:
ExprPtr Duplicate() override;
ExprPtr Inline(Inliner* inl) override;
protected:
void ExprDescribe(ODesc* d) const override;
@ -487,6 +577,9 @@ public:
void Assign(Frame* f, ValPtr v) override;
ExprPtr MakeLvalue() override;
// Optimization-related:
ExprPtr Duplicate() override;
};
class AssignExpr : public BinaryExpr {
@ -509,6 +602,9 @@ public:
op2 = std::move(e);
}
// Optimization-related:
ExprPtr Duplicate() override;
protected:
bool TypeCheck(const AttributesPtr& attrs = nullptr);
bool TypeCheckArithmetics(TypeTag bt1, TypeTag bt2);
@ -522,6 +618,9 @@ public:
IndexSliceAssignExpr(ExprPtr op1,
ExprPtr op2, bool is_init);
ValPtr Eval(Frame* f) const override;
// Optimization-related:
ExprPtr Duplicate() override;
};
class IndexExpr : public BinaryExpr {
@ -546,6 +645,9 @@ public:
bool IsSlice() const { return is_slice; }
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v1, Val* v2) const override;
@ -585,6 +687,9 @@ public:
return v;
}
// Optimization-related:
ExprPtr Duplicate() override;
};
class FieldExpr final : public UnaryExpr {
@ -602,6 +707,9 @@ public:
ExprPtr MakeLvalue() override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v) const override;
@ -621,6 +729,9 @@ public:
const char* FieldName() const { return field_name; }
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v) const override;
@ -643,6 +754,9 @@ public:
TraversalCode Traverse(TraversalCallback* cb) const override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr InitVal(const zeek::Type* t, ValPtr aggr) const override;
@ -655,7 +769,8 @@ class TableConstructorExpr final : public UnaryExpr {
public:
TableConstructorExpr(ListExprPtr constructor_list,
std::unique_ptr<std::vector<AttrPtr>> attrs,
TypePtr arg_type = nullptr);
TypePtr arg_type = nullptr,
AttributesPtr arg_attrs = nullptr);
[[deprecated("Remove in v4.1. Use GetAttrs().")]]
Attributes* Attrs() { return attrs.get(); }
@ -665,6 +780,9 @@ public:
ValPtr Eval(Frame* f) const override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr InitVal(const zeek::Type* t, ValPtr aggr) const override;
@ -677,7 +795,8 @@ class SetConstructorExpr final : public UnaryExpr {
public:
SetConstructorExpr(ListExprPtr constructor_list,
std::unique_ptr<std::vector<AttrPtr>> attrs,
TypePtr arg_type = nullptr);
TypePtr arg_type = nullptr,
AttributesPtr arg_attrs = nullptr);
[[deprecated("Remove in v4.1. Use GetAttrs().")]]
Attributes* Attrs() { return attrs.get(); }
@ -687,6 +806,9 @@ public:
ValPtr Eval(Frame* f) const override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr InitVal(const zeek::Type* t, ValPtr aggr) const override;
@ -702,6 +824,9 @@ public:
ValPtr Eval(Frame* f) const override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr InitVal(const zeek::Type* t, ValPtr aggr) const override;
@ -717,6 +842,9 @@ public:
void EvalIntoAggregate(const zeek::Type* t, Val* aggr, Frame* f) const override;
bool IsRecordElement(TypeDecl* td) const override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
void ExprDescribe(ODesc* d) const override;
@ -727,6 +855,9 @@ class ArithCoerceExpr final : public UnaryExpr {
public:
ArithCoerceExpr(ExprPtr op, TypeTag t);
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr FoldSingleVal(Val* v, InternalTypeTag t) const;
ValPtr Fold(Val* v) const override;
@ -737,6 +868,9 @@ public:
RecordCoerceExpr(ExprPtr op, RecordTypePtr r);
~RecordCoerceExpr() override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr InitVal(const zeek::Type* t, ValPtr aggr) const override;
ValPtr Fold(Val* v) const override;
@ -752,6 +886,9 @@ public:
TableCoerceExpr(ExprPtr op, TableTypePtr r);
~TableCoerceExpr() override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v) const override;
};
@ -761,6 +898,9 @@ public:
VectorCoerceExpr(ExprPtr op, VectorTypePtr v);
~VectorCoerceExpr() override;
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v) const override;
};
@ -790,6 +930,10 @@ public:
TraversalCode Traverse(TraversalCallback* cb) const override;
// Optimization-related:
ExprPtr Duplicate() override;
ExprPtr Inline(Inliner* inl) override;
protected:
void ExprDescribe(ODesc* d) const override;
@ -801,6 +945,9 @@ class InExpr final : public BinaryExpr {
public:
InExpr(ExprPtr op1, ExprPtr op2);
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v1, Val* v2) const override;
@ -820,6 +967,10 @@ public:
TraversalCode Traverse(TraversalCallback* cb) const override;
// Optimization-related:
ExprPtr Duplicate() override;
ExprPtr Inline(Inliner* inl) override;
protected:
void ExprDescribe(ODesc* d) const override;
@ -843,6 +994,10 @@ public:
Scope* GetScope() const;
// Optimization-related:
ExprPtr Duplicate() override;
ExprPtr Inline(Inliner* inl) override;
protected:
void ExprDescribe(ODesc* d) const override;
@ -865,6 +1020,10 @@ public:
TraversalCode Traverse(TraversalCallback* cb) const override;
// Optimization-related:
ExprPtr Duplicate() override;
ExprPtr Inline(Inliner* inl) override;
protected:
void ExprDescribe(ODesc* d) const override;
@ -896,6 +1055,10 @@ public:
TraversalCode Traverse(TraversalCallback* cb) const override;
// Optimization-related:
ExprPtr Duplicate() override;
ExprPtr Inline(Inliner* inl) override;
protected:
ValPtr AddSetInit(const zeek::Type* t, ValPtr aggr) const;
@ -914,6 +1077,9 @@ class CastExpr final : public UnaryExpr {
public:
CastExpr(ExprPtr op, TypePtr t);
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Eval(Frame* f) const override;
void ExprDescribe(ODesc* d) const override;
@ -923,6 +1089,9 @@ class IsExpr final : public UnaryExpr {
public:
IsExpr(ExprPtr op, TypePtr t);
// Optimization-related:
ExprPtr Duplicate() override;
protected:
ValPtr Fold(Val* v) const override;
void ExprDescribe(ODesc* d) const override;
@ -931,6 +1100,10 @@ private:
TypePtr t;
};
#include "zeek/script_opt/ExprOpt-Subclasses.h"
inline Val* Expr::ExprVal() const
{
if ( ! IsConst() )