expr.h revision 94078ecce3a103c28457e6f90f1e5b0dacc61146
194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/*
294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * This file is part of ltrace.
394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * Copyright (C) 2011,2012 Petr Machata, Red Hat Inc.
494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata *
594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * This program is free software; you can redistribute it and/or
694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * modify it under the terms of the GNU General Public License as
794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * published by the Free Software Foundation; either version 2 of the
894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * License, or (at your option) any later version.
994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata *
1094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * This program is distributed in the hope that it will be useful, but
1194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of
1294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * General Public License for more details.
1494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata *
1594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * You should have received a copy of the GNU General Public License
1694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * along with this program; if not, write to the Free Software
1794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
1894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * 02110-1301 USA
1994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata */
2094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
2194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata#ifndef EXPR_H
2294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata#define EXPR_H
2394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
2494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata#include "value.h"
2594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata#include "value_dict.h"
2694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
2794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Expressions serve as a way of encoding array lengths.  */
2894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
2994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataenum expr_node_kind {
3094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	EXPR_OP_SELF,	/* reference to the variable in question  */
3194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	EXPR_OP_NAMED,	/* value of named argument */
3294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	EXPR_OP_ARGNO,	/* value of numbered argument */
3394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	EXPR_OP_CONST,	/* constant value */
3494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	EXPR_OP_INDEX,	/* A[B] */
3594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	EXPR_OP_UP,	/* reference to containing structure */
3694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	EXPR_OP_CALL1,	/* internal callback with one operand */
3794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	EXPR_OP_CALL2,	/* internal callback with two operands */
3894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata};
3994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
4094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatastruct expr_node {
4194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	enum expr_node_kind kind;
4294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
4394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	struct expr_node *lhs;
4494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	int own_lhs;
4594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
4694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	union {
4794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		struct {
4894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			const char *s;
4994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			int own;
5094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		} name;
5194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		struct {
5294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			struct expr_node *n;
5394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			int own;
5494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		} node;
5594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		struct value value;
5694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		size_t num;
5794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		struct {
5894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			union {
5994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata				int (*cb1)(struct value *ret_value,
6094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata					   struct value *lhs,
6194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata					   struct value_dict *arguments,
6294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata					   void *data);
6394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata				int (*cb2)(struct value *ret_value,
6494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata					   struct value *lhs,
6594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata					   struct value *rhs,
6694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata					   struct value_dict *arguments,
6794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata					   void *data);
6894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			} u;
6994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			void *data;
7094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			struct expr_node *rhs;
7194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			int own_rhs;
7294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		} call;
7394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	} u;
7494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata};
7594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
7694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Expression of type self just returns the value in consideration.
7794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * For example, if what we seek is length of an array, then the value
7894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * representing that array is returned by the expression.  */
7994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatavoid expr_init_self(struct expr_node *node);
8094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
8194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Expression that yields the value of an argument named NAME.  NAME
8294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * is owned if OWN_NAME.  */
8394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatavoid expr_init_named(struct expr_node *node,
8494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		     const char *name, int own_name);
8594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
8694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Expression that yields the value of an argument number NUM.  */
8794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatavoid expr_init_argno(struct expr_node *node, size_t num);
8894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
8994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Constant expression always returns the same value VAL.  VAL is
9094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * copied into NODE and owned by it.  */
9194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatavoid expr_init_const(struct expr_node *node, struct value *val);
9294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatavoid expr_init_const_word(struct expr_node *node, long l,
9394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			  struct arg_type_info *type, int own_type);
9494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
9594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Expression LHS[RHS].  LHS and RHS are owned if, respectively,
9694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * OWN_LHS and OWN_RHS.  */
9794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatavoid expr_init_index(struct expr_node *node,
9894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		     struct expr_node *lhs, int own_lhs,
9994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		     struct expr_node *rhs, int own_rhs);
10094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
10194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* This expression returns the containing value of LHS (^LHS).  LHS is
10294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * owned if OWN_LHS.  */
10394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatavoid expr_init_up(struct expr_node *node, struct expr_node *lhs, int own_lhs);
10494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
10594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Callback expression calls CB(eval(LHS), DATA).  LHS is owned if
10694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * OWN_LHS.  DATA is passed to callback verbatim.  */
10794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatavoid expr_init_cb1(struct expr_node *node,
10894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		   int (*cb)(struct value *ret_value,
10994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			     struct value *value,
11094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			     struct value_dict *arguments,
11194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			     void *data),
11294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		   struct expr_node *lhs, int own_lhs, void *data);
11394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
11494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Callback expression calls CB(eval(LHS), eval(RHS), DATA).  LHS and
11594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * RHS are owned if, respectively, OWN_LHS and OWN_RHS.  DATA is
11694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * passed to callback verbatim.  */
11794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatavoid expr_init_cb2(struct expr_node *node,
11894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		   int (*cb)(struct value *ret_value,
11994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			     struct value *lhs, struct value *rhs,
12094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			     struct value_dict *arguments,
12194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata			     void *data),
12294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		   struct expr_node *lhs, int own_lhs,
12394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		   struct expr_node *rhs, int own_rhs, void *data);
12494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
12594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Release the data inside NODE.  Doesn't free NODE itself.  */
12694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatavoid expr_destroy(struct expr_node *node);
12794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
12894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Evaluate the expression NODE in context of VALUE.  ARGUMENTS is a
12994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * dictionary of named and numbered values that NODE may use.  Returns
13094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * 0 in case of success or a negative value on error.  CONTEXT and
13194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * ARGUMENTS may be NULL, but then the expression mustn't need them
13294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * for evaluation.  */
13394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataint expr_eval(struct expr_node *node, struct value *context,
13494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata	      struct value_dict *arguments, struct value *ret_value);
13594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
13694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Evaluate compile-time expression.  Returns 0 on success or negative
13794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * value on failure.  Computed value is passed back in *VALUEP.  */
13894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataint expr_eval_constant(struct expr_node *node, long *valuep);
13994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
14094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Evaluate expression, whose result should fit into a word.  In order
14194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * to easily support all the structure and array accesses, we simply
14294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * operate on values represented by struct value.  But eventually we need
14394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * to be able to get out a word-size datum to use it as an index, a
14494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * length, etc.  */
14594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataint expr_eval_word(struct expr_node *node, struct value *context,
14694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata		   struct value_dict *arguments, long *ret_value);
14794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
14894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Returns non-zero value if the expression is a compile-time
14994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * constant.  Currently this is only EXPR_OP_CONST, but eventually
15094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * things like sizeof or simple expressions might be allowed.  */
15194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataint expr_is_compile_constant(struct expr_node *node);
15294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
15394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Returns a pre-computed expression "self".  */
15494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatastruct expr_node *expr_self(void);
15594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata
15694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata#endif /* EXPR_H */
157