1000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* 2000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * This file is part of ltrace. 3982cbca34b2b49a158086ff5f43eb9bba89edeadPetr Machata * Copyright (C) 2011,2012,2013 Petr Machata, Red Hat Inc. 4000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * Copyright (C) 1997-2009 Juan Cespedes 5000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * 6000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * This program is free software; you can redistribute it and/or 7000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * modify it under the terms of the GNU General Public License as 8000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * published by the Free Software Foundation; either version 2 of the 9000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * License, or (at your option) any later version. 10000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * 11000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * This program is distributed in the hope that it will be useful, but 12000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of 13000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * General Public License for more details. 15000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * 16000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * You should have received a copy of the GNU General Public License 17000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * along with this program; if not, write to the Free Software 18000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 19000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * 02110-1301 USA 20000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata */ 21000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 22000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#ifndef TYPE_H 23000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#define TYPE_H 24000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 25000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#include <stddef.h> 26000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#include "forward.h" 27000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#include "vect.h" 28000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 29000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataenum arg_type { 30000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata ARGTYPE_VOID, 31000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata ARGTYPE_INT, 32000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata ARGTYPE_UINT, 33000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata ARGTYPE_LONG, 34000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata ARGTYPE_ULONG, 35000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata ARGTYPE_CHAR, 36000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata ARGTYPE_SHORT, 37000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata ARGTYPE_USHORT, 386f9f03b3108b68e790eca48fcf053f74ff433094Petr Machata ARGTYPE_FLOAT, 396f9f03b3108b68e790eca48fcf053f74ff433094Petr Machata ARGTYPE_DOUBLE, 40000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata ARGTYPE_ARRAY, /* Series of values in memory */ 41000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata ARGTYPE_STRUCT, /* Structure of values */ 42000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata ARGTYPE_POINTER, /* Pointer to some other type */ 43000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata}; 44000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 45000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatastruct arg_type_info { 46000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata enum arg_type type; 47000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata union { 48000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata struct vect entries; 49000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 50000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata /* ARGTYPE_ARRAY */ 51000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata struct { 52000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata struct arg_type_info *elt_type; 5394078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata struct expr_node *length; 54000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata int own_info:1; 5594078ecce3a103c28457e6f90f1e5b0dacc61146Petr Machata int own_length:1; 56000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata } array_info; 57000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 58000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata /* ARGTYPE_POINTER */ 59000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata struct { 60000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata struct arg_type_info *info; 61000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata int own_info:1; 62000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata } ptr_info; 63000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata } u; 6431af32cfcd61671cbb5e567870103766b3231521Petr Machata 6531af32cfcd61671cbb5e567870103766b3231521Petr Machata struct lens *lens; 6631af32cfcd61671cbb5e567870103766b3231521Petr Machata int own_lens; 67000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata}; 68000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 69000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Return a type info for simple type TYPE (which shall not be array, 70c07a26a8d0f86bc4137eb7b7fea8bbf9021275f1Petr Machata * struct, or pointer. Each call with the same TYPE yields the same 71c07a26a8d0f86bc4137eb7b7fea8bbf9021275f1Petr Machata * arg_type_info pointer. */ 72000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatastruct arg_type_info *type_get_simple(enum arg_type type); 73c65c24a7e4645559a0fb050ff5a96ec248827562Petr Machatastruct arg_type_info *type_get_voidptr(void); 74000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 75000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Initialize INFO so it becomes ARGTYPE_STRUCT. The created 76000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * structure contains no fields. Use type_struct_add to populate the 77000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * structure. */ 78000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatavoid type_init_struct(struct arg_type_info *info); 79000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 80000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Add a new field of type FIELD_INFO to a structure INFO. If OWN, 81000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * the field type is owned and destroyed together with INFO. */ 82000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machataint type_struct_add(struct arg_type_info *info, 83000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata struct arg_type_info *field_info, int own); 84000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 85000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Get IDX-th field of structure type INFO. */ 86000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatastruct arg_type_info *type_struct_get(struct arg_type_info *info, size_t idx); 87000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 88000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Return number of fields of structure type INFO. */ 89000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatasize_t type_struct_size(struct arg_type_info *info); 90000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 9164d6e060aa1d4607e766e40825bd9c9d13e8e1a4Petr Machata/* Return number of elements of an aggregate type INFO. This can be 9264d6e060aa1d4607e766e40825bd9c9d13e8e1a4Petr Machata * either ARGTYPE_STRUCT or ARGTYPE_ARRAY of constant length. If 9364d6e060aa1d4607e766e40825bd9c9d13e8e1a4Petr Machata * ARGTYPE_ARRAY does not have a constant length, this returns -1. */ 9464d6e060aa1d4607e766e40825bd9c9d13e8e1a4Petr Machatasize_t type_aggregate_size(struct arg_type_info *info); 9564d6e060aa1d4607e766e40825bd9c9d13e8e1a4Petr Machata 96000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Initialize INFO so it becomes ARGTYPE_ARRAY. The element type is 97000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * passed in ELEMENT_INFO, and array length in LENGTH_EXPR. If, 98000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * respectively, OWN_INFO and OWN_LENGTH are true, the pointee and 99000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * length are owned and destroyed together with INFO. */ 100000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatavoid type_init_array(struct arg_type_info *info, 101000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata struct arg_type_info *element_info, int own_info, 1026f9f03b3108b68e790eca48fcf053f74ff433094Petr Machata struct expr_node *length_expr, int own_length); 103000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 104000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Initialize INFO so it becomes ARGTYPE_POINTER. The pointee type is 105000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * passed in POINTEE_INFO. If OWN_INFO, the pointee type is owned and 106000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * destroyed together with INFO. */ 107000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatavoid type_init_pointer(struct arg_type_info *info, 108000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata struct arg_type_info *pointee_info, int own_info); 109000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 110000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Release any memory associated with INFO. Doesn't free INFO 111000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * itself. */ 112000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatavoid type_destroy(struct arg_type_info *info); 113000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 114cd6ff36657ef51369f72fe109d581bc2530be5f2Petr Machata/* Copy type INFO into the area pointed to by RETP. Return 0 on 115cd6ff36657ef51369f72fe109d581bc2530be5f2Petr Machata * success or a negative value on failure. */ 116cd6ff36657ef51369f72fe109d581bc2530be5f2Petr Machataint type_clone(struct arg_type_info *retp, const struct arg_type_info *info); 117cd6ff36657ef51369f72fe109d581bc2530be5f2Petr Machata 118000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Compute a size of given type. Return (size_t)-1 for error. */ 119929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatasize_t type_sizeof(struct process *proc, struct arg_type_info *type); 120000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 121000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Compute an alignment necessary for elements of this type. Return 122000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * (size_t)-1 for error. */ 123929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatasize_t type_alignof(struct process *proc, struct arg_type_info *type); 124000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 125000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Align value SZ to ALIGNMENT and return the result. */ 126000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatasize_t align(size_t sz, size_t alignment); 127000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 128000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Return ELT-th element of compound type TYPE. This is useful for 129000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * arrays and structures. */ 130000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machatastruct arg_type_info *type_element(struct arg_type_info *type, size_t elt); 131000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 132000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata/* Compute an offset of EMT-th element of type TYPE. This works for 133000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata * arrays and structures. Return (size_t)-1 for error. */ 134929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatasize_t type_offsetof(struct process *proc, 135000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata struct arg_type_info *type, size_t elt); 136000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata 137c07a26a8d0f86bc4137eb7b7fea8bbf9021275f1Petr Machata/* Whether TYPE is an integral type as defined by the C standard. */ 138c07a26a8d0f86bc4137eb7b7fea8bbf9021275f1Petr Machataint type_is_integral(enum arg_type type); 139c07a26a8d0f86bc4137eb7b7fea8bbf9021275f1Petr Machata 140c07a26a8d0f86bc4137eb7b7fea8bbf9021275f1Petr Machata/* Whether TYPE, which shall be integral, is a signed type. */ 141c07a26a8d0f86bc4137eb7b7fea8bbf9021275f1Petr Machataint type_is_signed(enum arg_type type); 142c07a26a8d0f86bc4137eb7b7fea8bbf9021275f1Petr Machata 143fcf256ceeab4b0b74cf1e18122e894aafce94fdcPetr Machata/* If INFO is floating point equivalent type, return the corresponding 144fcf256ceeab4b0b74cf1e18122e894aafce94fdcPetr Machata * floating point type. Otherwise return NULL. Floating point 145fcf256ceeab4b0b74cf1e18122e894aafce94fdcPetr Machata * equivalent types are either ARGTYPE_FLOAT, or ARGTYPE_DOUBLE, or 146fcf256ceeab4b0b74cf1e18122e894aafce94fdcPetr Machata * ARGTYPE_STRUCT whose sole member is a floating point equivalent 147fcf256ceeab4b0b74cf1e18122e894aafce94fdcPetr Machata * type. */ 148fcf256ceeab4b0b74cf1e18122e894aafce94fdcPetr Machatastruct arg_type_info *type_get_fp_equivalent(struct arg_type_info *info); 149fcf256ceeab4b0b74cf1e18122e894aafce94fdcPetr Machata 150982cbca34b2b49a158086ff5f43eb9bba89edeadPetr Machata/* If INFO is homogeneous floating-point aggregate, return the 151982cbca34b2b49a158086ff5f43eb9bba89edeadPetr Machata * corresponding floating point type, and set *COUNTP to number of 152982cbca34b2b49a158086ff5f43eb9bba89edeadPetr Machata * fields of the structure. Otherwise return NULL. INFO is a HFA if 153982cbca34b2b49a158086ff5f43eb9bba89edeadPetr Machata * it's an aggregate whose each field is either a HFA, or a 154982cbca34b2b49a158086ff5f43eb9bba89edeadPetr Machata * floating-point type. */ 155982cbca34b2b49a158086ff5f43eb9bba89edeadPetr Machatastruct arg_type_info *type_get_hfa_type(struct arg_type_info *info, 156982cbca34b2b49a158086ff5f43eb9bba89edeadPetr Machata size_t *countp); 157982cbca34b2b49a158086ff5f43eb9bba89edeadPetr Machata 158982cbca34b2b49a158086ff5f43eb9bba89edeadPetr Machata 159000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#endif /* TYPE_H */ 160