1000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/*
2000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * This file is part of ltrace.
3000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * Copyright (C) 2011,2012 Petr Machata, Red Hat Inc.
4000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata *
5000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * This program is free software; you can redistribute it and/or
6000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * modify it under the terms of the GNU General Public License as
7000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * published by the Free Software Foundation; either version 2 of the
8000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * License, or (at your option) any later version.
9000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata *
10000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * This program is distributed in the hope that it will be useful, but
11000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of
12000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * General Public License for more details.
14000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata *
15000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * You should have received a copy of the GNU General Public License
16000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * along with this program; if not, write to the Free Software
17000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * 02110-1301 USA
19000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata */
20000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
21000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#ifndef VALUE_H
22000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#define VALUE_H
23000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
24000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#include "forward.h"
252b955a5cefeab9cd409f7973837bf1d25003d8e9Petr Machata#include "sysdep.h"
26000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
27000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Values are objects that capture data fetched from an inferior.
28000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * Typically a value is attached to a single inferior where it was
29000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * extracted from, but it is possible to create a detached value.
30000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * Each value is typed.  Values support a number of routines, such as
31000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * dereferencing if the value is of pointer type, array or structure
32000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * access, etc.
33000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata *
34000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * A value can be uninitialized, abstract or reified.  Abstract values
35000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * are just references into inferior, no transfer has taken place yet.
36000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * Reified values have been copied out of the corresponding inferior,
37000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * or otherwise set to some value.  */
38000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
39000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataenum value_location_t {
40000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	VAL_LOC_NODATA = 0,	/* Uninitialized.  */
41000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	VAL_LOC_INFERIOR,	/* Value is in the inferior process.  */
42000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	VAL_LOC_COPY,		/* Value was copied out of the inferior.  */
43000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	VAL_LOC_SHARED,		/* Like VAL_LOC_COPY, but don't free.  */
44000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	VAL_LOC_WORD,		/* Like VAL_LOC_COPY, but small enough.  */
45000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata};
46000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
47000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatastruct value {
48000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	struct arg_type_info *type;
49929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata	struct process *inferior;
50000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	struct value *parent;
51000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	size_t size;
52000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	union {
532b955a5cefeab9cd409f7973837bf1d25003d8e9Petr Machata		void *address;  /* VAL_LOC_COPY, VAL_LOC_SHARED */
542b955a5cefeab9cd409f7973837bf1d25003d8e9Petr Machata		arch_addr_t inf_address;  /* VAL_LOC_INFERIOR */
55000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata		long value;     /* VAL_LOC_WORD */
56000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata		unsigned char buf[0];
57000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	} u;
58000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	enum value_location_t where;
59000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata	int own_type;
60000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata};
61000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
62000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Initialize VALUE.  INFERIOR must not be NULL.  PARENT is parental
63000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * value, in case of compound types.  It may be NULL.  TYPE is a type
64000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * of the value.  It may be NULL if the type is not yet known.  If
65000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * OWN_TYPE, the passed-in type is owned and released by value.  */
66929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatavoid value_init(struct value *value, struct process *inferior,
67000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata		struct value *parent, struct arg_type_info *type,
68000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata		int own_type);
69000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
70000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Initialize VALUE.  This is like value_init, except that inferior is
71000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * NULL.  VALP is initialized as a detached value, without assigned
72000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * process.  You have to be careful not to use VAL_LOC_INFERIOR
73000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * values if the value is detached.  */
74000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatavoid value_init_detached(struct value *value, struct value *parent,
75000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata			 struct arg_type_info *type, int own_type);
76000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
77000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Set TYPE.  This releases old type if it was owned.  TYPE is owned
78000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * and released if OWN_TYPE.  */
79000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatavoid value_set_type(struct value *value,
80000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata		    struct arg_type_info *type, int own_type);
81000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
82000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Transfers the ownership of VALUE's type, if any, to the caller.
83000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * This doesn't reset the VALUE's type, but gives up ownership if
84000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * there was one.  Previous ownership is passed in OWN_TYPE.  */
85000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatavoid value_take_type(struct value *value,
86000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata		     struct arg_type_info **type, int *own_type);
87000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
88000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Release the data held by VALP, if any, but not the type.  */
89000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatavoid value_release(struct value *valp);
90000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
91429b1845ef6bee24d8ab5851e90018666c83c481Petr Machata/* Value resides in inferior, on given ADDRESS.  */
92429b1845ef6bee24d8ab5851e90018666c83c481Petr Machatavoid value_in_inferior(struct value *valp, arch_addr_t address);
93429b1845ef6bee24d8ab5851e90018666c83c481Petr Machata
94000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Destroy the value.  This is like value_release, but it additionally
95000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * frees the value type, if it's own_type.  It doesn't free the VAL
96000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * pointer itself.  */
97000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatavoid value_destroy(struct value *val);
98000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
99000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Set the data held by VALP to VALUE.  This also sets the value's
100000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * where to VAL_LOC_WORD.  */
101da442f4777454436e02bf0ec170bc9b59fb68546Petr Machatavoid value_set_word(struct value *valp, long value);
102000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
103000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Set the data held by VALP to a buffer of size SIZE.  This buffer
104000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * may be allocated by malloc.  Returns NULL on failure.  */
105000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataunsigned char *value_reserve(struct value *valp, size_t size);
106000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
107000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Access ELEMENT-th field of the compound value VALP, and store the
108000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * result into the value RET_VAL.  Returns 0 on success, or negative
109000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * value on failure.  */
110000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataint value_init_element(struct value *ret_val, struct value *valp, size_t element);
111000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
112000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* De-reference pointer value, and store the result into the value
113000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * RET_VAL.  Returns 0 on success, or negative value on failure.  */
114000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataint value_init_deref(struct value *ret_val, struct value *valp);
115000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
116000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* If value is in inferior, copy it over to ltrace.  Return 0 for
117000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * success or negative value for failure.  */
118000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataint value_reify(struct value *val, struct value_dict *arguments);
119000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
120000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Return a pointer to the data of the value.  This copies the data
121000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * from the inferior to the tracer.  Returns NULL on failure.  */
122000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataunsigned char *value_get_data(struct value *val, struct value_dict *arguments);
123000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
124000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Return a pointer to the raw data of the value.  This shall not be
125000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * called on a VAL_LOC_INFERIOR value.  */
126000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataunsigned char *value_get_raw_data(struct value *val);
127000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
128000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Copy value VAL into the area pointed-to by RETP.  Return 0 on
129000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * success or a negative value on failure.  */
130edce6cff0c41643e8ff05657389c2a628a0ac2e9Petr Machataint value_clone(struct value *retp, const struct value *val);
131000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
132000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Give a size of given value.  Return (size_t)-1 for error.  This is
133000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * a full size of the value.  In particular for arrays, it returns
134000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * actual length of the array, as computed by the length
135000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * expression.  */
136000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatasize_t value_size(struct value *val, struct value_dict *arguments);
137000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
138000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Extract at most word-sized datum from the value.  Return 0 on
139000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * success or negative value on failure.  */
140000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataint value_extract_word(struct value *val, long *retp,
141000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata		       struct value_dict *arguments);
142000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
143000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Copy contents of VAL to DATA.  The buffer must be large enough to
144000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * hold all the data inside.  */
145000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataint value_extract_buf(struct value *val, unsigned char *data,
146000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata		      struct value_dict *arguments);
147000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
148000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Find the most enclosing parental value that is a struct.  Return
149000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * NULL when there is no such parental value.  */
150000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatastruct value *value_get_parental_struct(struct value *val);
151000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
152000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Determine whether this is all-zero value.  Returns >0 if it is, ==0
153000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * if it isn't, <0 on error.  */
154000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataint value_is_zero(struct value *val, struct value_dict *arguments);
155000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata
15640bab82b523d5e80272bcbd8854516b01265549ePetr Machata/* Compare two values for byte-by-byte equality.  Returns >0 if they
15740bab82b523d5e80272bcbd8854516b01265549ePetr Machata * are equal, ==0 if they are not, and <0 on error.  */
15840bab82b523d5e80272bcbd8854516b01265549ePetr Machataint value_equal(struct value *val1, struct value *val2,
15940bab82b523d5e80272bcbd8854516b01265549ePetr Machata		struct value_dict *arguments);
16040bab82b523d5e80272bcbd8854516b01265549ePetr Machata
1612fb192b7bb49b659343f6dec89931168de00660cPetr Machata/* Convert a structure type to pointer to that structure type.  */
1622fb192b7bb49b659343f6dec89931168de00660cPetr Machataint value_pass_by_reference(struct value *value);
1632fb192b7bb49b659343f6dec89931168de00660cPetr Machata
164000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#endif /* VALUE_H */
165