diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp index 42567d3e312..8bb18194342 100644 --- a/src/ast/ast.cpp +++ b/src/ast/ast.cpp @@ -5,6 +5,11 @@ namespace bpftrace { namespace ast { +std::unordered_set& Expression::getResolve() { + static std::unordered_set s; + return s; +} + void Integer::accept(Visitor &v) { v.visit(*this); } diff --git a/src/ast/ast.h b/src/ast/ast.h index c5a0c30b28a..3128d37c2e1 100644 --- a/src/ast/ast.h +++ b/src/ast/ast.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "types.h" @@ -34,6 +35,7 @@ class Expression : public Node { bool is_map = false; Expression() : Node(){}; Expression(location loc) : Node(loc){}; + static std::unordered_set& getResolve(); }; using ExpressionList = std::vector; @@ -86,12 +88,22 @@ class Identifier : public Expression { class Builtin : public Expression { public: - explicit Builtin(std::string ident) : ident(is_deprecated(ident)) {} - explicit Builtin(std::string ident, location loc) : Expression(loc), ident(is_deprecated(ident)) {} + explicit Builtin(std::string ident) : ident(is_deprecated(ident)) { + resolve_curtask(ident); + } + explicit Builtin(std::string ident, location loc) : Expression(loc), ident(is_deprecated(ident)) { + resolve_curtask(ident); + } std::string ident; int probe_id; void accept(Visitor &v) override; + +private: + void resolve_curtask(std::string& ident) { + if (ident == "curtask") + getResolve().insert("task_struct"); + } }; class Call : public Expression { @@ -174,9 +186,13 @@ class ArrayAccess : public Expression { class Cast : public Expression { public: Cast(const std::string &type, bool is_pointer, Expression *expr) - : cast_type(type), is_pointer(is_pointer), expr(expr) { } + : cast_type(type), is_pointer(is_pointer), expr(expr) { + getResolve().insert(type); + } Cast(const std::string &type, bool is_pointer, Expression *expr, location loc) - : Expression(loc), cast_type(type), is_pointer(is_pointer), expr(expr) { } + : Expression(loc), cast_type(type), is_pointer(is_pointer), expr(expr) { + getResolve().insert(type); + } std::string cast_type; bool is_pointer; Expression *expr; diff --git a/src/driver.cpp b/src/driver.cpp index d2fdcd4ade2..bdec837be0d 100644 --- a/src/driver.cpp +++ b/src/driver.cpp @@ -13,6 +13,7 @@ namespace bpftrace { Driver::Driver(BPFtrace &bpftrace, std::ostream &o) : bpftrace_(bpftrace), out_(o) { + ast::Expression::getResolve().clear(); yylex_init(&scanner_); parser_ = std::make_unique(*this, scanner_); }