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