194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* 294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * This file is part of ltrace. 3cd6ff36657ef51369f72fe109d581bc2530be5f2Petr Machata * Copyright (C) 2011,2012,2013 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 128cd6ff36657ef51369f72fe109d581bc2530be5f2Petr Machata/* Copy expression NODE into the area pointed to by RETP. Return 0 on 129cd6ff36657ef51369f72fe109d581bc2530be5f2Petr Machata * success or a negative value on failure. */ 130cd6ff36657ef51369f72fe109d581bc2530be5f2Petr Machataint expr_clone(struct expr_node *retp, const struct expr_node *node); 131cd6ff36657ef51369f72fe109d581bc2530be5f2Petr Machata 13294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Evaluate the expression NODE in context of VALUE. ARGUMENTS is a 13394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * dictionary of named and numbered values that NODE may use. Returns 13494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * 0 in case of success or a negative value on error. CONTEXT and 13594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * ARGUMENTS may be NULL, but then the expression mustn't need them 13694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * for evaluation. */ 13794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataint expr_eval(struct expr_node *node, struct value *context, 13894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata struct value_dict *arguments, struct value *ret_value); 13994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 14094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Evaluate compile-time expression. Returns 0 on success or negative 14194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * value on failure. Computed value is passed back in *VALUEP. */ 14294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataint expr_eval_constant(struct expr_node *node, long *valuep); 14394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 14494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Evaluate expression, whose result should fit into a word. In order 14594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * to easily support all the structure and array accesses, we simply 14694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * operate on values represented by struct value. But eventually we need 14794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * to be able to get out a word-size datum to use it as an index, a 14894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * length, etc. */ 14994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataint expr_eval_word(struct expr_node *node, struct value *context, 15094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata struct value_dict *arguments, long *ret_value); 15194078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 15294078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Returns non-zero value if the expression is a compile-time 15394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * constant. Currently this is only EXPR_OP_CONST, but eventually 15494078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata * things like sizeof or simple expressions might be allowed. */ 15594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machataint expr_is_compile_constant(struct expr_node *node); 15694078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 15794078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata/* Returns a pre-computed expression "self". */ 15894078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machatastruct expr_node *expr_self(void); 15994078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata 16094078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata#endif /* EXPR_H */ 161