/*
* This file is part of ltrace.
* Copyright (C) 2011,2012,2013 Petr Machata, Red Hat Inc.
* Copyright (C) 1997-2009 Juan Cespedes
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#ifndef TYPE_H
#define TYPE_H
#include <stddef.h>
#include "forward.h"
#include "vect.h"
enum arg_type {
ARGTYPE_VOID,
ARGTYPE_INT,
ARGTYPE_UINT,
ARGTYPE_LONG,
ARGTYPE_ULONG,
ARGTYPE_CHAR,
ARGTYPE_SHORT,
ARGTYPE_USHORT,
ARGTYPE_FLOAT,
ARGTYPE_DOUBLE,
ARGTYPE_ARRAY, /* Series of values in memory */
ARGTYPE_STRUCT, /* Structure of values */
ARGTYPE_POINTER, /* Pointer to some other type */
};
struct arg_type_info {
enum arg_type type;
union {
struct vect entries;
/* ARGTYPE_ARRAY */
struct {
struct arg_type_info *elt_type;
struct expr_node *length;
int own_info:1;
int own_length:1;
} array_info;
/* ARGTYPE_POINTER */
struct {
struct arg_type_info *info;
int own_info:1;
} ptr_info;
} u;
struct lens *lens;
int own_lens;
};
/* Return a type info for simple type TYPE (which shall not be array,
* struct, or pointer. Each call with the same TYPE yields the same
* arg_type_info pointer. */
struct arg_type_info *type_get_simple(enum arg_type type);
struct arg_type_info *type_get_voidptr(void);
/* Initialize INFO so it becomes ARGTYPE_STRUCT. The created
* structure contains no fields. Use type_struct_add to populate the
* structure. */
void type_init_struct(struct arg_type_info *info);
/* Add a new field of type FIELD_INFO to a structure INFO. If OWN,
* the field type is owned and destroyed together with INFO. */
int type_struct_add(struct arg_type_info *info,
struct arg_type_info *field_info, int own);
/* Get IDX-th field of structure type INFO. */
struct arg_type_info *type_struct_get(struct arg_type_info *info, size_t idx);
/* Return number of fields of structure type INFO. */
size_t type_struct_size(struct arg_type_info *info);
/* Return number of elements of an aggregate type INFO. This can be
* either ARGTYPE_STRUCT or ARGTYPE_ARRAY of constant length. If
* ARGTYPE_ARRAY does not have a constant length, this returns -1. */
size_t type_aggregate_size(struct arg_type_info *info);
/* Initialize INFO so it becomes ARGTYPE_ARRAY. The element type is
* passed in ELEMENT_INFO, and array length in LENGTH_EXPR. If,
* respectively, OWN_INFO and OWN_LENGTH are true, the pointee and
* length are owned and destroyed together with INFO. */
void type_init_array(struct arg_type_info *info,
struct arg_type_info *element_info, int own_info,
struct expr_node *length_expr, int own_length);
/* Initialize INFO so it becomes ARGTYPE_POINTER. The pointee type is
* passed in POINTEE_INFO. If OWN_INFO, the pointee type is owned and
* destroyed together with INFO. */
void type_init_pointer(struct arg_type_info *info,
struct arg_type_info *pointee_info, int own_info);
/* Release any memory associated with INFO. Doesn't free INFO
* itself. */
void type_destroy(struct arg_type_info *info);
/* Copy type INFO into the area pointed to by RETP. Return 0 on
* success or a negative value on failure. */
int type_clone(struct arg_type_info *retp, const struct arg_type_info *info);
/* Compute a size of given type. Return (size_t)-1 for error. */
size_t type_sizeof(struct process *proc, struct arg_type_info *type);
/* Compute an alignment necessary for elements of this type. Return
* (size_t)-1 for error. */
size_t type_alignof(struct process *proc, struct arg_type_info *type);
/* Align value SZ to ALIGNMENT and return the result. */
size_t align(size_t sz, size_t alignment);
/* Return ELT-th element of compound type TYPE. This is useful for
* arrays and structures. */
struct arg_type_info *type_element(struct arg_type_info *type, size_t elt);
/* Compute an offset of EMT-th element of type TYPE. This works for
* arrays and structures. Return (size_t)-1 for error. */
size_t type_offsetof(struct process *proc,
struct arg_type_info *type, size_t elt);
/* Whether TYPE is an integral type as defined by the C standard. */
int type_is_integral(enum arg_type type);
/* Whether TYPE, which shall be integral, is a signed type. */
int type_is_signed(enum arg_type type);
/* If INFO is floating point equivalent type, return the corresponding
* floating point type. Otherwise return NULL. Floating point
* equivalent types are either ARGTYPE_FLOAT, or ARGTYPE_DOUBLE, or
* ARGTYPE_STRUCT whose sole member is a floating point equivalent
* type. */
struct arg_type_info *type_get_fp_equivalent(struct arg_type_info *info);
/* If INFO is homogeneous floating-point aggregate, return the
* corresponding floating point type, and set *COUNTP to number of
* fields of the structure. Otherwise return NULL. INFO is a HFA if
* it's an aggregate whose each field is either a HFA, or a
* floating-point type. */
struct arg_type_info *type_get_hfa_type(struct arg_type_info *info,
size_t *countp);
#endif /* TYPE_H */