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