From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8262 invoked by alias); 29 Jan 2018 07:28:22 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 8252 invoked by uid 89); 29 Jan 2018 07:28:21 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-19.7 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,HTML_MESSAGE,KAM_LOTSOFHASH,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=ID, Lookup, H*c:alternative, 1 X-HELO: mail-qt0-f173.google.com Received: from mail-qt0-f173.google.com (HELO mail-qt0-f173.google.com) (209.85.216.173) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 29 Jan 2018 07:28:16 +0000 Received: by mail-qt0-f173.google.com with SMTP id o35so11462378qtj.13 for ; Sun, 28 Jan 2018 23:28:16 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=xWSNqbLxd3DA2OGUhgDkJPmJ9GHbmT3bUrbq0Wwoyjc=; b=Sb2zg9Ky5BD6jg6+lggrfWV5j53Fg+d+UgPPdRBQB7FVGv4UkMGB1r9iQHQPggKo9x ACEGjHhcndeaqztuPayPArY8VhzElqdPB0qYoypu2z5LqW6b/pshrtfZV6ih13ETfT6E W3waBVxXvWIqvKzL7WfUWz18TLl1NBUJs7LXR4+h9YCO2zoufH4dinl3OjrEHZ2xKvNP EdRPZ03s8LXtBewFNoHK/Na1U2BJn0jDpz5Thch+BNFZgUfD4rH65P9YLCXCh/MRjDnZ HAo+tJA4tT5e8kDFjXkSPeQ3/rS3lXJvyt3XDhhNTCZb2lQsREwLU3jEMF5k+UNH48Va z9Kw== X-Gm-Message-State: AKwxytd5ZmRus5InrF96/h5ouWXKdDGQZtB1LaOrNpl+f5CmIbv5vvok mMxf0zIUfA3HJxAqSParCfboRx9OnXK6IaQPV9wc+A== X-Google-Smtp-Source: AH8x224CM+1JyjCkMIHjYCXpjPdzcz1cxhIh5n6CVPZzgxtRSY2sKUTwqoLvjHXMrVNhV2FbFAOH1hyfHX+74Cd015s= X-Received: by 10.200.17.153 with SMTP id d25mr32796710qtj.97.1517210894841; Sun, 28 Jan 2018 23:28:14 -0800 (PST) MIME-Version: 1.0 Received: by 10.237.55.4 with HTTP; Sun, 28 Jan 2018 23:27:44 -0800 (PST) In-Reply-To: <20180125141259.544597d6@ThinkPad> References: <7C97CC6A-92CB-4702-820D-206022F07102@arm.com> <771B81D3-D1C8-4D94-9713-3AD466DBA5F8@arm.com> <20180125141259.544597d6@ThinkPad> From: Omair Javaid Date: Mon, 29 Jan 2018 07:28:00 -0000 Message-ID: Subject: Re: [PATCH v2 5/8] Use tdesc types in gdbserver tdesc To: Philipp Rudo Cc: Alan Hayward , "gdb-patches@sourceware.org" , nd Content-Type: text/plain; charset="UTF-8" X-IsSubscribed: yes X-SW-Source: 2018-01/txt/msg00582.txt.bz2 On 25 January 2018 at 18:12, Philipp Rudo wrote: > On Wed, 24 Jan 2018 09:29:20 +0000 > Alan Hayward wrote: > > [...] > > > Stubs of the make_gdb_type functions are added to gdbserver > > (they should never get called). > > See comment in patch #6. > > [...] > > > diff --git a/gdb/arch/tdesc.c b/gdb/arch/tdesc.c > > index 603ccd79434e1dccd17e69ef193193e673835dd0.. > 9518571d03d394ee7cbf78b31974818201c889cd 100644 > > --- a/gdb/arch/tdesc.c > > +++ b/gdb/arch/tdesc.c > > [...] > > > @@ -84,6 +106,36 @@ bool tdesc_feature::operator== (const tdesc_feature > &other) const > > return true; > > } > > > > +/* Lookup a predefined type. */ > > + > > +static struct tdesc_type * > > +tdesc_predefined_type (enum tdesc_type_kind kind) > > +{ > > + for (int ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++) > > + if (tdesc_predefined_types[ix].kind == kind) > > + return &tdesc_predefined_types[ix]; > > + > > + gdb_assert_not_reached ("bad predefined tdesc type"); > > +} > > + > > +/* See arch/tdesc.h. */ > > + > > +struct tdesc_type * > > +tdesc_named_type (const struct tdesc_feature *feature, const char *id) > > +{ > > + /* First try target-defined types. */ > > + for (const tdesc_type_up &type : feature->types) > > + if (type->name == id) > > + return type.get (); > > + > > + /* Next try the predefined types. */ > > + for (int ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++) > > + if (tdesc_predefined_types[ix].name == id) > > + return &tdesc_predefined_types[ix]; > > + > > + return NULL; > > +} > > + > > /* See arch/tdesc.h. */ > > > > void > > @@ -96,3 +148,144 @@ tdesc_create_reg (struct tdesc_feature *feature, > const char *name, > > > > feature->registers.emplace_back (reg); > > } > > + > > +/* See arch/tdesc.h. */ > > + > > +struct tdesc_type * > > +tdesc_create_vector (struct tdesc_feature *feature, const char *name, > > + struct tdesc_type *field_type, int count) > > +{ > > + tdesc_type_vector *type = new tdesc_type_vector (name, field_type, > count); > > + feature->types.emplace_back (type); > > + > > + return type; > > +} > > + > > +/* See arch/tdesc.h. */ > > + > > +tdesc_type_with_fields * > > +tdesc_create_struct (struct tdesc_feature *feature, const char *name) > > +{ > > + tdesc_type_with_fields *type > > + = new tdesc_type_with_fields (name, TDESC_TYPE_STRUCT); > > + feature->types.emplace_back (type); > > + > > + return type; > > +} > > + > > +/* See arch/tdesc.h. */ > > + > > +void > > +tdesc_set_struct_size (tdesc_type_with_fields *type, int size) > > +{ > > + gdb_assert (type->kind == TDESC_TYPE_STRUCT); > > + gdb_assert (size > 0); > > + type->size = size; > > +} > > + > > +/* See arch/tdesc.h. */ > > + > > +tdesc_type_with_fields * > > +tdesc_create_union (struct tdesc_feature *feature, const char *name) > > +{ > > + tdesc_type_with_fields *type > > + = new tdesc_type_with_fields (name, TDESC_TYPE_UNION); > > + feature->types.emplace_back (type); > > + > > + return type; > > +} > > + > > +/* See arch/tdesc.h. */ > > + > > +tdesc_type_with_fields * > > +tdesc_create_flags (struct tdesc_feature *feature, const char *name, > > + int size) > > +{ > > + gdb_assert (size > 0); > > + > > + tdesc_type_with_fields *type > > + = new tdesc_type_with_fields (name, TDESC_TYPE_FLAGS, size); > > + feature->types.emplace_back (type); > > + > > + return type; > > +} > > + > > +tdesc_type_with_fields * > > +tdesc_create_enum (struct tdesc_feature *feature, const char *name, > > + int size) > > +{ > > + gdb_assert (size > 0); > > + > > + tdesc_type_with_fields *type > > + = new tdesc_type_with_fields (name, TDESC_TYPE_ENUM, size); > > + feature->types.emplace_back (type); > > + > > + return type; > > +} > > + > > +/* See arch/tdesc.h. */ > > + > > +void > > +tdesc_add_field (tdesc_type_with_fields *type, const char *field_name, > > + struct tdesc_type *field_type) > > +{ > > + gdb_assert (type->kind == TDESC_TYPE_UNION > > + || type->kind == TDESC_TYPE_STRUCT); > > + > > + /* Initialize start and end so we know this is not a bit-field > > + when we print-c-tdesc. */ > > + type->fields.emplace_back (field_name, field_type, -1, -1); > > +} > > + > > +void > > +tdesc_add_typed_bitfield (tdesc_type_with_fields *type, const char > *field_name, > > + int start, int end, struct tdesc_type > *field_type) > > +{ > > + gdb_assert (type->kind == TDESC_TYPE_STRUCT > > + || type->kind == TDESC_TYPE_FLAGS); > > + gdb_assert (start >= 0 && end >= start); > > + > > + type->fields.emplace_back (field_name, field_type, start, end); > > +} > > + > > +/* See arch/tdesc.h. */ > > + > > +void > > +tdesc_add_bitfield (tdesc_type_with_fields *type, const char > *field_name, > > + int start, int end) > > +{ > > + struct tdesc_type *field_type; > > + > > + gdb_assert (start >= 0 && end >= start); > > + > > + if (type->size > 4) > > + field_type = tdesc_predefined_type (TDESC_TYPE_UINT64); > > + else > > + field_type = tdesc_predefined_type (TDESC_TYPE_UINT32); > > + > > + tdesc_add_typed_bitfield (type, field_name, start, end, field_type); > > +} > > + > > +/* See arch/tdesc.h. */ > > + > > +void > > +tdesc_add_flag (tdesc_type_with_fields *type, int start, > > + const char *flag_name) > > +{ > > + gdb_assert (type->kind == TDESC_TYPE_FLAGS > > + || type->kind == TDESC_TYPE_STRUCT); > > + > > + type->fields.emplace_back (flag_name, > > + tdesc_predefined_type (TDESC_TYPE_BOOL), > > + start, start); > > +} > > + > > +void > > +tdesc_add_enum_value (tdesc_type_with_fields *type, int value, > > + const char *name) > > +{ > > + gdb_assert (type->kind == TDESC_TYPE_ENUM); > > + type->fields.emplace_back (name, > > + tdesc_predefined_type (TDESC_TYPE_INT32), > > + value, -1); > > +} > > \ No newline at end of file > > With tdesc_features, tdesc_type_with_fields etc. being no longer opaque and > so many functions shared many of them could be made class methods. However > that exceeds the scope of this patch set, but should be kept in mind for > the > future. > Apparently, it may seem better to move the whole target description code to a common location and share it between gdb and gdbserver. Target descriptions are architecture specific but at the same time target description class code is architecture independent. So as highlighted by Phillip this code should be moved out of arc/ folder and placed elsewhere. It may seem a clean approach to create the division now and also refactor code now than doing it in a later patch. Only gotcha here is that this code is used by multiple targets so need to be tested aggressively. > > Philipp > > > > diff --git a/gdb/gdbserver/tdesc.c b/gdb/gdbserver/tdesc.c > > index bc94d83ae58b9e79d8b71d0ce21c073f11765dd4.. > f0bd266a54601484df74ee1c5f8dce6fe04661c4 100644 > > --- a/gdb/gdbserver/tdesc.c > > +++ b/gdb/gdbserver/tdesc.c > > @@ -197,70 +197,17 @@ tdesc_create_feature (struct target_desc *tdesc, > const char *name, > > return new_feature; > > } > > > > -/* See arch/tdesc.h. */ > > - > > -tdesc_type_with_fields * > > -tdesc_create_flags (struct tdesc_feature *feature, const char *name, > > - int size) > > -{ > > - return NULL; > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > -void > > -tdesc_add_flag (tdesc_type_with_fields *type, int start, > > - const char *flag_name) > > -{} > > - > > -/* See arch/tdesc.h. */ > > - > > -struct tdesc_type * > > -tdesc_named_type (const struct tdesc_feature *feature, const char *id) > > -{ > > - return NULL; > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > -tdesc_type_with_fields * > > -tdesc_create_union (struct tdesc_feature *feature, const char *id) > > +type *tdesc_type_builtin::make_gdb_type (struct gdbarch *gdbarch) const > > { > > - return NULL; > > + error (_("Cannot create gdbtypes.")); > > } > > > > -/* See arch/tdesc.h. */ > > - > > -tdesc_type_with_fields * > > -tdesc_create_struct (struct tdesc_feature *feature, const char *id) > > -{ > > - return NULL; > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > -struct tdesc_type * > > -tdesc_create_vector (struct tdesc_feature *feature, const char *name, > > - struct tdesc_type *field_type, int count) > > +type *tdesc_type_vector::make_gdb_type (struct gdbarch *gdbarch) const > > { > > - return NULL; > > + error (_("Cannot create gdbtypes.")); > > } > > > > -void > > -tdesc_add_bitfield (tdesc_type_with_fields *type, const char > *field_name, > > - int start, int end) > > -{} > > - > > -/* See arch/tdesc.h. */ > > - > > -void > > -tdesc_add_field (tdesc_type_with_fields *type, const char *field_name, > > - struct tdesc_type *field_type) > > -{} > > - > > -/* See arch/tdesc.h. */ > > - > > -void > > -tdesc_set_struct_size (tdesc_type_with_fields *type, int size) > > +type *tdesc_type_with_fields::make_gdb_type (struct gdbarch *gdbarch) > const > > { > > + error (_("Cannot create gdbtypes.")); > > } > > diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c > > index 8ead19efa24b3cb154c895c484e791b92ff61387.. > 4f11120dce4092f15de99680a7c4868c4a2f4493 100644 > > --- a/gdb/target-descriptions.c > > +++ b/gdb/target-descriptions.c > > @@ -50,80 +50,6 @@ struct property > > std::string value; > > }; > > > > -/* A named type from a target description. */ > > - > > -struct tdesc_type_field > > -{ > > - tdesc_type_field (const std::string &name_, tdesc_type *type_, > > - int start_, int end_) > > - : name (name_), type (type_), start (start_), end (end_) > > - {} > > - > > - std::string name; > > - struct tdesc_type *type; > > - /* For non-enum-values, either both are -1 (non-bitfield), or both are > > - not -1 (bitfield). For enum values, start is the value (which > could be > > - -1), end is -1. */ > > - int start, end; > > -}; > > - > > -struct tdesc_type_builtin : tdesc_type > > -{ > > - tdesc_type_builtin (const std::string &name, enum tdesc_type_kind > kind) > > - : tdesc_type (name, kind) > > - {} > > - > > - void accept (tdesc_element_visitor &v) const override > > - { > > - v.visit (this); > > - } > > - > > - type *make_gdb_type (struct gdbarch *gdbarch) const override; > > -}; > > - > > -/* tdesc_type for vector types. */ > > - > > -struct tdesc_type_vector : tdesc_type > > -{ > > - tdesc_type_vector (const std::string &name, tdesc_type > *element_type_, int count_) > > - : tdesc_type (name, TDESC_TYPE_VECTOR), > > - element_type (element_type_), count (count_) > > - {} > > - > > - void accept (tdesc_element_visitor &v) const override > > - { > > - v.visit (this); > > - } > > - > > - type *make_gdb_type (struct gdbarch *gdbarch) const override; > > - > > - struct tdesc_type *element_type; > > - int count; > > -}; > > - > > -/* tdesc_type for struct, union, flags, and enum types. */ > > - > > -struct tdesc_type_with_fields : tdesc_type > > -{ > > - tdesc_type_with_fields (const std::string &name, tdesc_type_kind kind, > > - int size_ = 0) > > - : tdesc_type (name, kind), size (size_) > > - {} > > - > > - void accept (tdesc_element_visitor &v) const override > > - { > > - v.visit (this); > > - } > > - > > - type *make_gdb_type_struct (struct gdbarch *gdbarch) const; > > - type *make_gdb_type_union (struct gdbarch *gdbarch) const; > > - type *make_gdb_type_flags (struct gdbarch *gdbarch) const; > > - type *make_gdb_type_enum (struct gdbarch *gdbarch) const; > > - type *make_gdb_type (struct gdbarch *gdbarch) const override; > > - > > - std::vector fields; > > - int size; > > -}; > > > > type * > > tdesc_type_builtin::make_gdb_type (struct gdbarch *gdbarch) const > > @@ -733,58 +659,6 @@ tdesc_feature_name (const struct tdesc_feature > *feature) > > return feature->name.c_str (); > > } > > > > -/* Predefined types. */ > > -static tdesc_type_builtin tdesc_predefined_types[] = > > -{ > > - { "bool", TDESC_TYPE_BOOL }, > > - { "int8", TDESC_TYPE_INT8 }, > > - { "int16", TDESC_TYPE_INT16 }, > > - { "int32", TDESC_TYPE_INT32 }, > > - { "int64", TDESC_TYPE_INT64 }, > > - { "int128", TDESC_TYPE_INT128 }, > > - { "uint8", TDESC_TYPE_UINT8 }, > > - { "uint16", TDESC_TYPE_UINT16 }, > > - { "uint32", TDESC_TYPE_UINT32 }, > > - { "uint64", TDESC_TYPE_UINT64 }, > > - { "uint128", TDESC_TYPE_UINT128 }, > > - { "code_ptr", TDESC_TYPE_CODE_PTR }, > > - { "data_ptr", TDESC_TYPE_DATA_PTR }, > > - { "ieee_single", TDESC_TYPE_IEEE_SINGLE }, > > - { "ieee_double", TDESC_TYPE_IEEE_DOUBLE }, > > - { "arm_fpa_ext", TDESC_TYPE_ARM_FPA_EXT }, > > - { "i387_ext", TDESC_TYPE_I387_EXT } > > -}; > > - > > -/* Lookup a predefined type. */ > > - > > -static struct tdesc_type * > > -tdesc_predefined_type (enum tdesc_type_kind kind) > > -{ > > - for (int ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++) > > - if (tdesc_predefined_types[ix].kind == kind) > > - return &tdesc_predefined_types[ix]; > > - > > - gdb_assert_not_reached ("bad predefined tdesc type"); > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > -struct tdesc_type * > > -tdesc_named_type (const struct tdesc_feature *feature, const char *id) > > -{ > > - /* First try target-defined types. */ > > - for (const tdesc_type_up &type : feature->types) > > - if (type->name == id) > > - return type.get (); > > - > > - /* Next try the predefined types. */ > > - for (int ix = 0; ix < ARRAY_SIZE (tdesc_predefined_types); ix++) > > - if (tdesc_predefined_types[ix].name == id) > > - return &tdesc_predefined_types[ix]; > > - > > - return NULL; > > -} > > - > > /* Lookup type associated with ID. */ > > > > struct type * > > @@ -1219,147 +1093,6 @@ tdesc_use_registers (struct gdbarch *gdbarch, > > > > /* See arch/tdesc.h. */ > > > > -struct tdesc_type * > > -tdesc_create_vector (struct tdesc_feature *feature, const char *name, > > - struct tdesc_type *field_type, int count) > > -{ > > - tdesc_type_vector *type = new tdesc_type_vector (name, field_type, > count); > > - feature->types.emplace_back (type); > > - > > - return type; > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > -tdesc_type_with_fields * > > -tdesc_create_struct (struct tdesc_feature *feature, const char *name) > > -{ > > - tdesc_type_with_fields *type > > - = new tdesc_type_with_fields (name, TDESC_TYPE_STRUCT); > > - feature->types.emplace_back (type); > > - > > - return type; > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > -void > > -tdesc_set_struct_size (tdesc_type_with_fields *type, int size) > > -{ > > - gdb_assert (type->kind == TDESC_TYPE_STRUCT); > > - gdb_assert (size > 0); > > - type->size = size; > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > -tdesc_type_with_fields * > > -tdesc_create_union (struct tdesc_feature *feature, const char *name) > > -{ > > - tdesc_type_with_fields *type > > - = new tdesc_type_with_fields (name, TDESC_TYPE_UNION); > > - feature->types.emplace_back (type); > > - > > - return type; > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > -tdesc_type_with_fields * > > -tdesc_create_flags (struct tdesc_feature *feature, const char *name, > > - int size) > > -{ > > - gdb_assert (size > 0); > > - > > - tdesc_type_with_fields *type > > - = new tdesc_type_with_fields (name, TDESC_TYPE_FLAGS, size); > > - feature->types.emplace_back (type); > > - > > - return type; > > -} > > - > > -tdesc_type_with_fields * > > -tdesc_create_enum (struct tdesc_feature *feature, const char *name, > > - int size) > > -{ > > - gdb_assert (size > 0); > > - > > - tdesc_type_with_fields *type > > - = new tdesc_type_with_fields (name, TDESC_TYPE_ENUM, size); > > - feature->types.emplace_back (type); > > - > > - return type; > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > -void > > -tdesc_add_field (tdesc_type_with_fields *type, const char *field_name, > > - struct tdesc_type *field_type) > > -{ > > - gdb_assert (type->kind == TDESC_TYPE_UNION > > - || type->kind == TDESC_TYPE_STRUCT); > > - > > - /* Initialize start and end so we know this is not a bit-field > > - when we print-c-tdesc. */ > > - type->fields.emplace_back (field_name, field_type, -1, -1); > > -} > > - > > -void > > -tdesc_add_typed_bitfield (tdesc_type_with_fields *type, const char > *field_name, > > - int start, int end, struct tdesc_type > *field_type) > > -{ > > - gdb_assert (type->kind == TDESC_TYPE_STRUCT > > - || type->kind == TDESC_TYPE_FLAGS); > > - gdb_assert (start >= 0 && end >= start); > > - > > - type->fields.emplace_back (field_name, field_type, start, end); > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > -void > > -tdesc_add_bitfield (tdesc_type_with_fields *type, const char > *field_name, > > - int start, int end) > > -{ > > - struct tdesc_type *field_type; > > - > > - gdb_assert (start >= 0 && end >= start); > > - > > - if (type->size > 4) > > - field_type = tdesc_predefined_type (TDESC_TYPE_UINT64); > > - else > > - field_type = tdesc_predefined_type (TDESC_TYPE_UINT32); > > - > > - tdesc_add_typed_bitfield (type, field_name, start, end, field_type); > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > -void > > -tdesc_add_flag (tdesc_type_with_fields *type, int start, > > - const char *flag_name) > > -{ > > - gdb_assert (type->kind == TDESC_TYPE_FLAGS > > - || type->kind == TDESC_TYPE_STRUCT); > > - > > - type->fields.emplace_back (flag_name, > > - tdesc_predefined_type (TDESC_TYPE_BOOL), > > - start, start); > > -} > > - > > -void > > -tdesc_add_enum_value (tdesc_type_with_fields *type, int value, > > - const char *name) > > -{ > > - gdb_assert (type->kind == TDESC_TYPE_ENUM); > > - type->fields.emplace_back (name, > > - tdesc_predefined_type (TDESC_TYPE_INT32), > > - value, -1); > > -} > > - > > -/* See arch/tdesc.h. */ > > - > > struct tdesc_feature * > > tdesc_create_feature (struct target_desc *tdesc, const char *name, > > const char *xml) > > > >