d4a0e8b57d
This patch makes tdesc_type an abstract base class and creates three subclasses: - tdesc_type_builtin, for builtin types - tdesc_type_vector, for vector types - tdesc_type_with_fields, for struct, union, flag and enum types This allows getting rid of the union in tdesc_type and to not allow the std::vector separately. I tried to go further and create separate classes for struct, union, flag and enum, but it proved too difficult. One problem is that from the point of the of the target description code, the types tdesc_type_* are opaque (only forward-declared). Therefore, it doesn't know about inheritance relationship between those classes. This makes it impossible to make functions that accept a pointer to a base class and pass a pointer to a derived class, for example. I think this patch here is a good compromise, and if somebody wants to improve things further, the door is open. A make_gdb_type virtual pure method is added to tdesc_type, which replaces the current tdesc_gdb_type function. Calling this method on a tdesc_type returns the corresponding built gdb type. gdb/ChangeLog: * target-descriptions.c (struct tdesc_type): Use default destructor. <u>: Remove. <accept>: Remove. (struct tdesc_type_builtin): New. (struct tdesc_type_vector): New. (struct tdesc_type_with_fields): New. (tdesc_predefined_types): Change type to tdesc_type_builtin[]. (tdesc_gdb_type): Remove. (tdesc_register_type): Adjust. (tdesc_create_vector): Create tdesc_type_vector. (tdesc_create_struct): Create tdesc_type_with_fields. (tdesc_set_struct_size): Change parameter type. (tdesc_create_union): Create tdesc_type_with_fields. (tdesc_create_flags): Likewise. (tdesc_create_enum): Likewise. (tdesc_add_field): Change parameter type. (tdesc_add_typed_bitfield): Likewise. (tdesc_add_bitfield): Likewise. (tdesc_add_flag): Likewise. (tdesc_add_enum_value): Likewise. (print_c_tdesc) <visit>: Remove overload with tdesc_type parameter, add overloads for tdesc_type_builtin, tdesc_type_with_fields and tdesc_type_vector. <m_printed_type>: Remove. <m_printed_element_type, m_printed_type_with_fields>: Add. * target-descriptions.h (tdesc_create_enum): Change return type. (tdesc_add_typed_bitfield): Change parameter type. (tdesc_add_enum_value): Change parameter type. * xml-tdesc.c (struct tdesc_parsing_data) <current_type>: Change type to tdesc_type_with_fields. (tdesc_start_struct): Adjust. (tdesc_start_flags): Adjust. (tdesc_start_enum): Adjust. (tdesc_start_field): Adjust. * arch/tdesc.h (struct tdesc_type_builtin): Forward-declare. (struct tdesc_type_vector): Forward-declare. (struct tdesc_type_with_fields): Forward-declare. (tdesc_create_struct): Change return type. (tdesc_create_union): Likewise. (tdesc_create_flags): Likewise. (tdesc_add_field): Change parameter type. (tdesc_set_struct_size): Likewise. (tdesc_add_bitfield): Likewise. (tdesc_add_flag): Likewise. * features: Re-generate C files. gdb/gdbserver/ChangeLog: * tdesc.c (struct tdesc_type): Change return type. (tdesc_add_flag): Change parameter type. (tdesc_add_bitfield): Likewise. (tdesc_add_field): Likewise. (tdesc_set_struct_size): Likewise.
96 lines
3.5 KiB
C
96 lines
3.5 KiB
C
/* Copyright (C) 2006-2017 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
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 3 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, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef ARCH_TDESC_H
|
|
#define ARCH_TDESC_H 1
|
|
|
|
struct tdesc_feature;
|
|
struct tdesc_type;
|
|
struct tdesc_type_builtin;
|
|
struct tdesc_type_vector;
|
|
struct tdesc_type_with_fields;
|
|
struct tdesc_reg;
|
|
struct target_desc;
|
|
|
|
/* Allocate a new target_desc. */
|
|
target_desc *allocate_target_description (void);
|
|
|
|
/* Set TARGET_DESC's architecture by NAME. */
|
|
void set_tdesc_architecture (target_desc *target_desc,
|
|
const char *name);
|
|
|
|
/* Set TARGET_DESC's osabi by NAME. */
|
|
void set_tdesc_osabi (target_desc *target_desc, const char *name);
|
|
|
|
/* Return the type associated with ID in the context of FEATURE, or
|
|
NULL if none. */
|
|
struct tdesc_type *tdesc_named_type (const struct tdesc_feature *feature,
|
|
const char *id);
|
|
|
|
/* Return the created feature named NAME in target description TDESC. */
|
|
struct tdesc_feature *tdesc_create_feature (struct target_desc *tdesc,
|
|
const char *name,
|
|
const char *xml = nullptr);
|
|
|
|
|
|
/* Return the created vector tdesc_type named NAME in FEATURE. */
|
|
struct tdesc_type *tdesc_create_vector (struct tdesc_feature *feature,
|
|
const char *name,
|
|
struct tdesc_type *field_type,
|
|
int count);
|
|
|
|
/* Return the created struct tdesc_type named NAME in FEATURE. */
|
|
tdesc_type_with_fields *tdesc_create_struct (struct tdesc_feature *feature,
|
|
const char *name);
|
|
|
|
/* Return the created union tdesc_type named NAME in FEATURE. */
|
|
tdesc_type_with_fields *tdesc_create_union (struct tdesc_feature *feature,
|
|
const char *name);
|
|
|
|
/* Return the created flags tdesc_type named NAME in FEATURE. */
|
|
tdesc_type_with_fields *tdesc_create_flags (struct tdesc_feature *feature,
|
|
const char *name,
|
|
int size);
|
|
|
|
/* Add a new field to TYPE. FIELD_NAME is its name, and FIELD_TYPE is
|
|
its type. */
|
|
void tdesc_add_field (tdesc_type_with_fields *type, const char *field_name,
|
|
struct tdesc_type *field_type);
|
|
|
|
/* Set the total length of TYPE. Structs which contain bitfields may
|
|
omit the reserved bits, so the end of the last field may not
|
|
suffice. */
|
|
void tdesc_set_struct_size (tdesc_type_with_fields *type, int size);
|
|
|
|
/* Add a new untyped bitfield to TYPE.
|
|
Untyped bitfields become either uint32 or uint64 depending on the size
|
|
of the underlying type. */
|
|
void tdesc_add_bitfield (tdesc_type_with_fields *type, const char *field_name,
|
|
int start, int end);
|
|
|
|
/* A flag is just a typed(bool) single-bit bitfield.
|
|
This function is kept to minimize changes in generated files. */
|
|
void tdesc_add_flag (tdesc_type_with_fields *type, int start,
|
|
const char *flag_name);
|
|
|
|
/* Create a register in feature FEATURE. */
|
|
void tdesc_create_reg (struct tdesc_feature *feature, const char *name,
|
|
int regnum, int save_restore, const char *group,
|
|
int bitsize, const char *type);
|
|
|
|
#endif /* ARCH_TDESC_H */
|