From patchwork Sat Dec 2 16:49:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 24691 Received: (qmail 93374 invoked by alias); 2 Dec 2017 16:50:01 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 93352 invoked by uid 89); 2 Dec 2017 16:49:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KB_WAM_FROM_NAME_SINGLEWORD, RCVD_IN_DNSWL_NONE, SPF_SOFTFAIL, UNWANTED_LANGUAGE_BODY autolearn=ham version=3.3.2 spammy=XML, Processing, H*m:simon, sk:unique_ X-HELO: barracuda.ebox.ca Received: from barracuda.ebox.ca (HELO barracuda.ebox.ca) (96.127.255.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 02 Dec 2017 16:49:53 +0000 X-ASG-Debug-ID: 1512233381-0c856e65d43e22df0001-fS2M51 Received: from smtp.ebox.ca (smtp.electronicbox.net [96.127.255.82]) by barracuda.ebox.ca with ESMTP id wA8yooqMhaDPPXVF (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 02 Dec 2017 11:49:41 -0500 (EST) X-Barracuda-Envelope-From: simon.marchi@polymtl.ca X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from simark.lan (192-222-251-162.qc.cable.ebox.net [192.222.251.162]) by smtp.ebox.ca (Postfix) with ESMTP id BAFEA441B21; Sat, 2 Dec 2017 11:49:40 -0500 (EST) From: Simon Marchi X-Barracuda-Effective-Source-IP: 192-222-251-162.qc.cable.ebox.net[192.222.251.162] X-Barracuda-Apparent-Source-IP: 192.222.251.162 X-Barracuda-RBL-IP: 192.222.251.162 To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH] Replace VEC(gdb_xml_value_s) with std::vector Date: Sat, 2 Dec 2017 11:49:37 -0500 X-ASG-Orig-Subj: [PATCH] Replace VEC(gdb_xml_value_s) with std::vector Message-Id: <20171202164937.13641-1-simon.marchi@polymtl.ca> X-Barracuda-Connect: smtp.electronicbox.net[96.127.255.82] X-Barracuda-Start-Time: 1512233381 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 38642 X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.00 X-Barracuda-Spam-Status: No, SCORE=2.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests=BSF_RULE7568M, BSF_SC0_MV0713, BSF_SC0_MV0713_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.45452 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M 1.00 BSF_SC0_MV0713_2 BSF_SC0_MV0713_2 0.50 BSF_SC0_MV0713 Custom rule MV0713 X-IsSubscribed: yes This patch replaces VEC(gdb_xml_value_s), which is passed to XML visitors, with an std::vector. In order to be able to remove the cleanup in gdb_xml_parser::start_element, the gdb_xml_parser structure is made to own the value with a gdb::unique_xmalloc_ptr. This patch has been tested on the buildbot. gdb/ChangeLog: * xml-support.h (struct gdb_xml_value): Add constructor. : Change type to unique_xmalloc_ptr. (gdb_xml_value_s): Remove typedef. (DEF_VEC_O (gdb_xml_value_s)): Remove. (gdb_xml_element_start_handler): Change parameter type to std::vector. (xml_find_attribute): Likewise. * xml-support.c (xml_find_attribute): Change parameter type to std::vector and adjust. (gdb_xml_values_cleanup): Remove. (gdb_xml_parser::start_element): Adjust to std::vector. (xinclude_start_include): Change paraeter type to std::vector and adjust. * btrace.c (check_xml_btrace_version): Likewise. (parse_xml_btrace_block): Likewise. (parse_xml_btrace_pt_config_cpu): Likewise. (parse_xml_btrace_pt): Likewise. (parse_xml_btrace_conf_bts): Likewise. (parse_xml_btrace_conf_pt): Likewise. * memory-map.c (memory_map_start_memory): Likewise. (memory_map_start_property): Likewise. * osdata.c (osdata_start_osdata): Likewise. (osdata_start_item): Likewise. (osdata_start_column): Likewise. * remote.c (start_thread): Likewise. * solib-aix.c (library_list_start_library): Likewise. (library_list_start_list): Likewise. * solib-svr4.c (library_list_start_library): Likewise. (svr4_library_list_start_list): Likewise. * solib-target.c (library_list_start_segment): Likewise. (library_list_start_section): Likewise. (library_list_start_library): Likewise. (library_list_start_list): Likewise. * tracepoint.c (traceframe_info_start_memory): Likewise. (traceframe_info_start_tvar): Likewise. * xml-syscall.c (syscall_start_syscall): Likewise. * xml-tdesc.c (tdesc_start_target): Likewise. (tdesc_start_feature): Likewise. (tdesc_start_reg): Likewise. (tdesc_start_union): Likewise. (tdesc_start_struct): Likewise. (tdesc_start_flags): Likewise. (tdesc_start_enum): Likewise. (tdesc_start_field): Likewise. (tdesc_start_enum_value): Likewise. (tdesc_start_vector): Likewise. --- gdb/btrace.c | 39 +++++++++++++++---------- gdb/memory-map.c | 14 +++++---- gdb/osdata.c | 13 +++++---- gdb/remote.c | 11 ++++---- gdb/solib-aix.c | 20 +++++++------ gdb/solib-svr4.c | 18 ++++++------ gdb/solib-target.c | 20 +++++++------ gdb/tracepoint.c | 11 ++++---- gdb/xml-support.c | 42 +++++++-------------------- gdb/xml-support.h | 14 +++++---- gdb/xml-syscall.c | 23 +++++++-------- gdb/xml-tdesc.c | 83 +++++++++++++++++++++++++++--------------------------- 12 files changed, 154 insertions(+), 154 deletions(-) diff --git a/gdb/btrace.c b/gdb/btrace.c index 8338ebfb0a..547f43d691 100644 --- a/gdb/btrace.c +++ b/gdb/btrace.c @@ -2004,10 +2004,11 @@ btrace_free_objfile (struct objfile *objfile) static void check_xml_btrace_version (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC (gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { const char *version - = (const char *) xml_find_attribute (attributes, "version")->value; + = (const char *) xml_find_attribute (attributes, "version")->value.get (); if (strcmp (version, "1.0") != 0) gdb_xml_error (parser, _("Unsupported btrace version: \"%s\""), version); @@ -2018,7 +2019,8 @@ check_xml_btrace_version (struct gdb_xml_parser *parser, static void parse_xml_btrace_block (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC (gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct btrace_data *btrace; struct btrace_block *block; @@ -2040,8 +2042,8 @@ parse_xml_btrace_block (struct gdb_xml_parser *parser, gdb_xml_error (parser, _("Btrace format error.")); } - begin = (ULONGEST *) xml_find_attribute (attributes, "begin")->value; - end = (ULONGEST *) xml_find_attribute (attributes, "end")->value; + begin = (ULONGEST *) xml_find_attribute (attributes, "begin")->value.get (); + end = (ULONGEST *) xml_find_attribute (attributes, "end")->value.get (); block = VEC_safe_push (btrace_block_s, btrace->variant.bts.blocks, NULL); block->begin = *begin; @@ -2094,16 +2096,20 @@ static void parse_xml_btrace_pt_config_cpu (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, - VEC (gdb_xml_value_s) *attributes) + std::vector &attributes) { struct btrace_data *btrace; const char *vendor; ULONGEST *family, *model, *stepping; - vendor = (const char *) xml_find_attribute (attributes, "vendor")->value; - family = (ULONGEST *) xml_find_attribute (attributes, "family")->value; - model = (ULONGEST *) xml_find_attribute (attributes, "model")->value; - stepping = (ULONGEST *) xml_find_attribute (attributes, "stepping")->value; + vendor = + (const char *) xml_find_attribute (attributes, "vendor")->value.get (); + family + = (ULONGEST *) xml_find_attribute (attributes, "family")->value.get (); + model + = (ULONGEST *) xml_find_attribute (attributes, "model")->value.get (); + stepping + = (ULONGEST *) xml_find_attribute (attributes, "stepping")->value.get (); btrace = (struct btrace_data *) user_data; @@ -2134,7 +2140,8 @@ parse_xml_btrace_pt_raw (struct gdb_xml_parser *parser, static void parse_xml_btrace_pt (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC (gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct btrace_data *btrace; @@ -2228,7 +2235,8 @@ parse_xml_btrace (struct btrace_data *btrace, const char *buffer) static void parse_xml_btrace_conf_bts (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC (gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct btrace_config *conf; struct gdb_xml_value *size; @@ -2239,7 +2247,7 @@ parse_xml_btrace_conf_bts (struct gdb_xml_parser *parser, size = xml_find_attribute (attributes, "size"); if (size != NULL) - conf->bts.size = (unsigned int) *(ULONGEST *) size->value; + conf->bts.size = (unsigned int) *(ULONGEST *) size->value.get (); } /* Parse a btrace-conf "pt" xml record. */ @@ -2247,7 +2255,8 @@ parse_xml_btrace_conf_bts (struct gdb_xml_parser *parser, static void parse_xml_btrace_conf_pt (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC (gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct btrace_config *conf; struct gdb_xml_value *size; @@ -2258,7 +2267,7 @@ parse_xml_btrace_conf_pt (struct gdb_xml_parser *parser, size = xml_find_attribute (attributes, "size"); if (size != NULL) - conf->pt.size = (unsigned int) *(ULONGEST *) size->value; + conf->pt.size = (unsigned int) *(ULONGEST *) size->value.get (); } static const struct gdb_xml_attribute btrace_conf_pt_attributes[] = { diff --git a/gdb/memory-map.c b/gdb/memory-map.c index e0982093a7..8c7f3a87e3 100644 --- a/gdb/memory-map.c +++ b/gdb/memory-map.c @@ -58,18 +58,19 @@ struct memory_map_parsing_data static void memory_map_start_memory (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct memory_map_parsing_data *data = (struct memory_map_parsing_data *) user_data; ULONGEST *start_p, *length_p, *type_p; start_p - = (ULONGEST *) xml_find_attribute (attributes, "start")->value; + = (ULONGEST *) xml_find_attribute (attributes, "start")->value.get (); length_p - = (ULONGEST *) xml_find_attribute (attributes, "length")->value; + = (ULONGEST *) xml_find_attribute (attributes, "length")->value.get (); type_p - = (ULONGEST *) xml_find_attribute (attributes, "type")->value; + = (ULONGEST *) xml_find_attribute (attributes, "type")->value.get (); data->memory_map->emplace_back (*start_p, *start_p + *length_p, (enum mem_access_mode) *type_p); @@ -97,13 +98,14 @@ memory_map_end_memory (struct gdb_xml_parser *parser, static void memory_map_start_property (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct memory_map_parsing_data *data = (struct memory_map_parsing_data *) user_data; char *name; - name = (char *) xml_find_attribute (attributes, "name")->value; + name = (char *) xml_find_attribute (attributes, "name")->value.get (); data->property_name.assign (name); } diff --git a/gdb/osdata.c b/gdb/osdata.c index a82cbf1ad2..487eb0a59d 100644 --- a/gdb/osdata.c +++ b/gdb/osdata.c @@ -56,14 +56,15 @@ struct osdata_parsing_data static void osdata_start_osdata (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct osdata_parsing_data *data = (struct osdata_parsing_data *) user_data; if (data->osdata != NULL) gdb_xml_error (parser, _("Seen more than on osdata element")); - char *type = (char *) xml_find_attribute (attributes, "type")->value; + char *type = (char *) xml_find_attribute (attributes, "type")->value.get (); data->osdata.reset (new struct osdata (std::string (type))); } @@ -72,7 +73,8 @@ osdata_start_osdata (struct gdb_xml_parser *parser, static void osdata_start_item (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct osdata_parsing_data *data = (struct osdata_parsing_data *) user_data; data->osdata->items.emplace_back (); @@ -83,11 +85,12 @@ osdata_start_item (struct gdb_xml_parser *parser, static void osdata_start_column (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct osdata_parsing_data *data = (struct osdata_parsing_data *) user_data; const char *name - = (const char *) xml_find_attribute (attributes, "name")->value; + = (const char *) xml_find_attribute (attributes, "name")->value.get (); data->property_name.assign (name); } diff --git a/gdb/remote.c b/gdb/remote.c index 0a62ae00e5..348d4e480e 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -3076,13 +3076,14 @@ remote_get_threads_with_ql (struct target_ops *ops, static void start_thread (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct threads_listing_context *data = (struct threads_listing_context *) user_data; struct gdb_xml_value *attr; - char *id = (char *) xml_find_attribute (attributes, "id")->value; + char *id = (char *) xml_find_attribute (attributes, "id")->value.get (); ptid_t ptid = read_ptid (id, NULL); data->items.emplace_back (ptid); @@ -3090,15 +3091,15 @@ start_thread (struct gdb_xml_parser *parser, attr = xml_find_attribute (attributes, "core"); if (attr != NULL) - item.core = *(ULONGEST *) attr->value; + item.core = *(ULONGEST *) attr->value.get (); attr = xml_find_attribute (attributes, "name"); if (attr != NULL) - item.name = (const char *) attr->value; + item.name = (const char *) attr->value.get (); attr = xml_find_attribute (attributes, "handle"); if (attr != NULL) - item.thread_handle = hex2bin ((const char *) attr->value); + item.thread_handle = hex2bin ((const char *) attr->value.get ()); } static void diff --git a/gdb/solib-aix.c b/gdb/solib-aix.c index de238e597b..d96467f1d1 100644 --- a/gdb/solib-aix.c +++ b/gdb/solib-aix.c @@ -134,30 +134,30 @@ static void library_list_start_library (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, - VEC (gdb_xml_value_s) *attributes) + std::vector &attributes) { VEC (lm_info_aix_p) **list = (VEC (lm_info_aix_p) **) user_data; lm_info_aix *item = new lm_info_aix; struct gdb_xml_value *attr; attr = xml_find_attribute (attributes, "name"); - item->filename = xstrdup ((const char *) attr->value); + item->filename = xstrdup ((const char *) attr->value.get ()); attr = xml_find_attribute (attributes, "member"); if (attr != NULL) - item->member_name = xstrdup ((const char *) attr->value); + item->member_name = xstrdup ((const char *) attr->value.get ()); attr = xml_find_attribute (attributes, "text_addr"); - item->text_addr = * (ULONGEST *) attr->value; + item->text_addr = * (ULONGEST *) attr->value.get (); attr = xml_find_attribute (attributes, "text_size"); - item->text_size = * (ULONGEST *) attr->value; + item->text_size = * (ULONGEST *) attr->value.get (); attr = xml_find_attribute (attributes, "data_addr"); - item->data_addr = * (ULONGEST *) attr->value; + item->data_addr = * (ULONGEST *) attr->value.get (); attr = xml_find_attribute (attributes, "data_size"); - item->data_size = * (ULONGEST *) attr->value; + item->data_size = * (ULONGEST *) attr->value.get (); VEC_safe_push (lm_info_aix_p, *list, item); } @@ -167,9 +167,11 @@ library_list_start_library (struct gdb_xml_parser *parser, static void library_list_start_list (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC (gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { - char *version = (char *) xml_find_attribute (attributes, "version")->value; + char *version + = (char *) xml_find_attribute (attributes, "version")->value.get (); if (strcmp (version, "1.0") != 0) gdb_xml_error (parser, diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 6e834fb5d7..bf639bb43b 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1144,17 +1144,18 @@ svr4_copy_library_list (struct so_list *src) static void library_list_start_library (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct svr4_library_list *list = (struct svr4_library_list *) user_data; const char *name - = (const char *) xml_find_attribute (attributes, "name")->value; + = (const char *) xml_find_attribute (attributes, "name")->value.get (); ULONGEST *lmp - = (ULONGEST *) xml_find_attribute (attributes, "lm")->value; + = (ULONGEST *) xml_find_attribute (attributes, "lm")->value.get (); ULONGEST *l_addrp - = (ULONGEST *) xml_find_attribute (attributes, "l_addr")->value; + = (ULONGEST *) xml_find_attribute (attributes, "l_addr")->value.get (); ULONGEST *l_ldp - = (ULONGEST *) xml_find_attribute (attributes, "l_ld")->value; + = (ULONGEST *) xml_find_attribute (attributes, "l_ld")->value.get (); struct so_list *new_elem; new_elem = XCNEW (struct so_list); @@ -1177,11 +1178,12 @@ library_list_start_library (struct gdb_xml_parser *parser, static void svr4_library_list_start_list (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct svr4_library_list *list = (struct svr4_library_list *) user_data; const char *version - = (const char *) xml_find_attribute (attributes, "version")->value; + = (const char *) xml_find_attribute (attributes, "version")->value.get (); struct gdb_xml_value *main_lm = xml_find_attribute (attributes, "main-lm"); if (strcmp (version, "1.0") != 0) @@ -1190,7 +1192,7 @@ svr4_library_list_start_list (struct gdb_xml_parser *parser, version); if (main_lm) - list->main_lm = *(ULONGEST *) main_lm->value; + list->main_lm = *(ULONGEST *) main_lm->value.get (); } /* The allowed elements and attributes for an XML library list. diff --git a/gdb/solib-target.c b/gdb/solib-target.c index 01171f85dd..a3d8a71245 100644 --- a/gdb/solib-target.c +++ b/gdb/solib-target.c @@ -79,12 +79,13 @@ solib_target_parse_libraries (const char *library) static void library_list_start_segment (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { VEC(lm_info_target_p) **list = (VEC(lm_info_target_p) **) user_data; lm_info_target *last = VEC_last (lm_info_target_p, *list); ULONGEST *address_p - = (ULONGEST *) xml_find_attribute (attributes, "address")->value; + = (ULONGEST *) xml_find_attribute (attributes, "address")->value.get (); CORE_ADDR address = (CORE_ADDR) *address_p; if (!last->section_bases.empty ()) @@ -97,12 +98,13 @@ library_list_start_segment (struct gdb_xml_parser *parser, static void library_list_start_section (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { VEC(lm_info_target_p) **list = (VEC(lm_info_target_p) **) user_data; lm_info_target *last = VEC_last (lm_info_target_p, *list); ULONGEST *address_p - = (ULONGEST *) xml_find_attribute (attributes, "address")->value; + = (ULONGEST *) xml_find_attribute (attributes, "address")->value.get (); CORE_ADDR address = (CORE_ADDR) *address_p; if (!last->segment_bases.empty ()) @@ -117,12 +119,13 @@ library_list_start_section (struct gdb_xml_parser *parser, static void library_list_start_library (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { VEC(lm_info_target_p) **list = (VEC(lm_info_target_p) **) user_data; lm_info_target *item = new lm_info_target; const char *name - = (const char *) xml_find_attribute (attributes, "name")->value; + = (const char *) xml_find_attribute (attributes, "name")->value.get (); item->name = xstrdup (name); VEC_safe_push (lm_info_target_p, *list, item); @@ -146,14 +149,15 @@ library_list_end_library (struct gdb_xml_parser *parser, static void library_list_start_list (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct gdb_xml_value *version = xml_find_attribute (attributes, "version"); /* #FIXED attribute may be omitted, Expat returns NULL in such case. */ if (version != NULL) { - const char *string = (const char *) version->value; + const char *string = (const char *) version->value.get (); if (strcmp (string, "1.0") != 0) gdb_xml_error (parser, diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 76d05dfc13..9ba37f43d8 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -3960,15 +3960,16 @@ parse_traceframe_info (const char *tframe_info) static void traceframe_info_start_memory (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct traceframe_info *info = (struct traceframe_info *) user_data; ULONGEST *start_p, *length_p; start_p - = (ULONGEST *) xml_find_attribute (attributes, "start")->value; + = (ULONGEST *) xml_find_attribute (attributes, "start")->value.get (); length_p - = (ULONGEST *) xml_find_attribute (attributes, "length")->value; + = (ULONGEST *) xml_find_attribute (attributes, "length")->value.get (); info->memory.emplace_back (*start_p, *length_p); } @@ -3979,11 +3980,11 @@ static void traceframe_info_start_tvar (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, - VEC(gdb_xml_value_s) *attributes) + std::vector &attributes) { struct traceframe_info *info = (struct traceframe_info *) user_data; const char *id_attrib - = (const char *) xml_find_attribute (attributes, "id")->value; + = (const char *) xml_find_attribute (attributes, "id")->value.get (); int id = gdb_xml_parse_ulongest (parser, id_attrib); info->tvars.push_back (id); diff --git a/gdb/xml-support.c b/gdb/xml-support.c index 2b59180c92..80e1d7e7d5 100644 --- a/gdb/xml-support.c +++ b/gdb/xml-support.c @@ -228,32 +228,16 @@ gdb_xml_error (struct gdb_xml_parser *parser, const char *format, ...) ATTRIBUTES. Returns NULL if not found. */ struct gdb_xml_value * -xml_find_attribute (VEC(gdb_xml_value_s) *attributes, const char *name) +xml_find_attribute (std::vector &attributes, + const char *name) { - struct gdb_xml_value *value; - int ix; - - for (ix = 0; VEC_iterate (gdb_xml_value_s, attributes, ix, value); ix++) - if (strcmp (value->name, name) == 0) - return value; + for (gdb_xml_value &value : attributes) + if (strcmp (value.name, name) == 0) + return &value; return NULL; } -/* Clean up a vector of parsed attribute values. */ - -static void -gdb_xml_values_cleanup (void *data) -{ - VEC(gdb_xml_value_s) **values = (VEC(gdb_xml_value_s) **) data; - struct gdb_xml_value *value; - int ix; - - for (ix = 0; VEC_iterate (gdb_xml_value_s, *values, ix, value); ix++) - xfree (value->value); - VEC_free (gdb_xml_value_s, *values); -} - /* Handle the start of an element. NAME is the element, and ATTRS are the names and values of this element's attributes. */ @@ -266,9 +250,7 @@ gdb_xml_parser::start_element (const XML_Char *name, const struct gdb_xml_element *element; const struct gdb_xml_attribute *attribute; - VEC(gdb_xml_value_s) *attributes = NULL; unsigned int seen; - struct cleanup *back_to; /* Push an error scope. If we return or throw an exception before filling this in, it will tell us to ignore children of this @@ -317,7 +299,7 @@ gdb_xml_parser::start_element (const XML_Char *name, scope.seen |= seen; - back_to = make_cleanup (gdb_xml_values_cleanup, &attributes); + std::vector attributes; for (attribute = element->attributes; attribute != NULL && attribute->name != NULL; @@ -326,7 +308,6 @@ gdb_xml_parser::start_element (const XML_Char *name, const char *val = NULL; const XML_Char **p; void *parsed_value; - struct gdb_xml_value new_value; for (p = attrs; *p != NULL; p += 2) if (!strcmp (attribute->name, p[0])) @@ -361,9 +342,7 @@ gdb_xml_parser::start_element (const XML_Char *name, else parsed_value = xstrdup (val); - new_value.name = attribute->name; - new_value.value = parsed_value; - VEC_safe_push (gdb_xml_value_s, attributes, &new_value); + attributes.emplace_back (attribute->name, parsed_value); } /* Check for unrecognized attributes. */ @@ -395,8 +374,6 @@ gdb_xml_parser::start_element (const XML_Char *name, scope_level &new_scope = m_scopes.back (); new_scope.element = element; new_scope.elements = element->children; - - do_cleanups (back_to); } /* Wrapper for gdb_xml_start_element, to prevent throwing exceptions @@ -803,11 +780,12 @@ struct xinclude_parsing_data static void xinclude_start_include (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct xinclude_parsing_data *data = (struct xinclude_parsing_data *) user_data; - char *href = (char *) xml_find_attribute (attributes, "href")->value; + char *href = (char *) xml_find_attribute (attributes, "href")->value.get (); gdb_xml_debug (parser, _("Processing XInclude of \"%s\""), href); diff --git a/gdb/xml-support.h b/gdb/xml-support.h index 74bc8117c0..d99174d8d0 100644 --- a/gdb/xml-support.h +++ b/gdb/xml-support.h @@ -74,11 +74,13 @@ bool xml_process_xincludes (std::string &result, struct gdb_xml_value { + gdb_xml_value (const char *name_, void *value_) + : name (name_), value (value_) + {} + const char *name; - void *value; + gdb::unique_xmalloc_ptr value; }; -typedef struct gdb_xml_value gdb_xml_value_s; -DEF_VEC_O(gdb_xml_value_s); /* The type of an attribute handler. @@ -146,7 +148,7 @@ enum gdb_xml_element_flag typedef void (gdb_xml_element_start_handler) (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes); + void *user_data, std::vector &attributes); /* A handler called at the end of an element. @@ -199,8 +201,8 @@ void gdb_xml_error (struct gdb_xml_parser *parser, const char *format, ...) /* Find the attribute named NAME in the set of parsed attributes ATTRIBUTES. Returns NULL if not found. */ -struct gdb_xml_value *xml_find_attribute (VEC(gdb_xml_value_s) *attributes, - const char *name); +struct gdb_xml_value *xml_find_attribute + (std::vector &attributes, const char *name); /* Parse an integer attribute into a ULONGEST. */ diff --git a/gdb/xml-syscall.c b/gdb/xml-syscall.c index 307c304512..db28773aef 100644 --- a/gdb/xml-syscall.c +++ b/gdb/xml-syscall.c @@ -227,29 +227,26 @@ syscall_create_syscall_desc (struct syscalls_info *syscalls_info, static void syscall_start_syscall (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, + std::vector &attributes) { struct syscall_parsing_data *data = (struct syscall_parsing_data *) user_data; - struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes); - int len, i; /* syscall info. */ char *name = NULL; int number = 0; char *groups = NULL; - len = VEC_length (gdb_xml_value_s, attributes); - - for (i = 0; i < len; i++) + for (const gdb_xml_value &attr : attributes) { - if (strcmp (attrs[i].name, "name") == 0) - name = (char *) attrs[i].value; - else if (strcmp (attrs[i].name, "number") == 0) - number = * (ULONGEST *) attrs[i].value; - else if (strcmp (attrs[i].name, "groups") == 0) - groups = (char *) attrs[i].value; + if (strcmp (attr.name, "name") == 0) + name = (char *) attr.value.get (); + else if (strcmp (attr.name, "number") == 0) + number = * (ULONGEST *) attr.value.get (); + else if (strcmp (attr.name, "groups") == 0) + groups = (char *) attr.value.get (); else internal_error (__FILE__, __LINE__, - _("Unknown attribute name '%s'."), attrs[i].name); + _("Unknown attribute name '%s'."), attr.name); } gdb_assert (name); diff --git a/gdb/xml-tdesc.c b/gdb/xml-tdesc.c index 5a1f459f98..5f70d0f986 100644 --- a/gdb/xml-tdesc.c +++ b/gdb/xml-tdesc.c @@ -144,9 +144,10 @@ tdesc_end_compatible (struct gdb_xml_parser *parser, static void tdesc_start_target (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, std::vector &attributes) { - char *version = (char *) xml_find_attribute (attributes, "version")->value; + char *version + = (char *) xml_find_attribute (attributes, "version")->value.get (); if (strcmp (version, "1.0") != 0) gdb_xml_error (parser, @@ -159,10 +160,10 @@ tdesc_start_target (struct gdb_xml_parser *parser, static void tdesc_start_feature (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, std::vector &attributes) { struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data; - char *name = (char *) xml_find_attribute (attributes, "name")->value; + char *name = (char *) xml_find_attribute (attributes, "name")->value.get (); data->current_feature = tdesc_create_feature (data->tdesc, name); } @@ -173,37 +174,36 @@ tdesc_start_feature (struct gdb_xml_parser *parser, static void tdesc_start_reg (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, std::vector &attributes) { struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data; - struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes); - int ix = 0, length; + int ix = 0; char *name, *group; const char *type; int bitsize, regnum, save_restore; - length = VEC_length (gdb_xml_value_s, attributes); + int length = attributes.size (); - name = (char *) attrs[ix++].value; - bitsize = * (ULONGEST *) attrs[ix++].value; + name = (char *) attributes[ix++].value.get (); + bitsize = * (ULONGEST *) attributes[ix++].value.get (); - if (ix < length && strcmp (attrs[ix].name, "regnum") == 0) - regnum = * (ULONGEST *) attrs[ix++].value; + if (ix < length && strcmp (attributes[ix].name, "regnum") == 0) + regnum = * (ULONGEST *) attributes[ix++].value.get (); else regnum = data->next_regnum; - if (ix < length && strcmp (attrs[ix].name, "type") == 0) - type = (char *) attrs[ix++].value; + if (ix < length && strcmp (attributes[ix].name, "type") == 0) + type = (char *) attributes[ix++].value.get (); else type = "int"; - if (ix < length && strcmp (attrs[ix].name, "group") == 0) - group = (char *) attrs[ix++].value; + if (ix < length && strcmp (attributes[ix].name, "group") == 0) + group = (char *) attributes[ix++].value.get (); else group = NULL; - if (ix < length && strcmp (attrs[ix].name, "save-restore") == 0) - save_restore = * (ULONGEST *) attrs[ix++].value; + if (ix < length && strcmp (attributes[ix].name, "save-restore") == 0) + save_restore = * (ULONGEST *) attributes[ix++].value.get (); else save_restore = 1; @@ -225,10 +225,10 @@ tdesc_start_reg (struct gdb_xml_parser *parser, static void tdesc_start_union (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, std::vector &attributes) { struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data; - char *id = (char *) xml_find_attribute (attributes, "id")->value; + char *id = (char *) xml_find_attribute (attributes, "id")->value.get (); data->current_type = tdesc_create_union (data->current_feature, id); data->current_type_size = 0; @@ -240,10 +240,10 @@ tdesc_start_union (struct gdb_xml_parser *parser, static void tdesc_start_struct (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, std::vector &attributes) { struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data; - char *id = (char *) xml_find_attribute (attributes, "id")->value; + char *id = (char *) xml_find_attribute (attributes, "id")->value.get (); struct tdesc_type *type; struct gdb_xml_value *attr; @@ -254,7 +254,7 @@ tdesc_start_struct (struct gdb_xml_parser *parser, attr = xml_find_attribute (attributes, "size"); if (attr != NULL) { - ULONGEST size = * (ULONGEST *) attr->value; + ULONGEST size = * (ULONGEST *) attr->value.get (); if (size > MAX_FIELD_SIZE) { @@ -270,12 +270,12 @@ tdesc_start_struct (struct gdb_xml_parser *parser, static void tdesc_start_flags (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, std::vector &attributes) { struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data; - char *id = (char *) xml_find_attribute (attributes, "id")->value; + char *id = (char *) xml_find_attribute (attributes, "id")->value.get (); ULONGEST size = * (ULONGEST *) - xml_find_attribute (attributes, "size")->value; + xml_find_attribute (attributes, "size")->value.get (); struct tdesc_type *type; if (size > MAX_FIELD_SIZE) @@ -293,12 +293,12 @@ tdesc_start_flags (struct gdb_xml_parser *parser, static void tdesc_start_enum (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, std::vector &attributes) { struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data; - char *id = (char *) xml_find_attribute (attributes, "id")->value; + char *id = (char *) xml_find_attribute (attributes, "id")->value.get (); int size = * (ULONGEST *) - xml_find_attribute (attributes, "size")->value; + xml_find_attribute (attributes, "size")->value.get (); struct tdesc_type *type; if (size > MAX_FIELD_SIZE) @@ -319,7 +319,7 @@ tdesc_start_enum (struct gdb_xml_parser *parser, static void tdesc_start_field (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, std::vector &attributes) { struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data; struct gdb_xml_value *attr; @@ -327,12 +327,12 @@ tdesc_start_field (struct gdb_xml_parser *parser, char *field_name, *field_type_id; int start, end; - field_name = (char *) xml_find_attribute (attributes, "name")->value; + field_name = (char *) xml_find_attribute (attributes, "name")->value.get (); attr = xml_find_attribute (attributes, "type"); if (attr != NULL) { - field_type_id = (char *) attr->value; + field_type_id = (char *) attr->value.get (); field_type = tdesc_named_type (data->current_feature, field_type_id); } else @@ -344,7 +344,7 @@ tdesc_start_field (struct gdb_xml_parser *parser, attr = xml_find_attribute (attributes, "start"); if (attr != NULL) { - ULONGEST ul_start = * (ULONGEST *) attr->value; + ULONGEST ul_start = * (ULONGEST *) attr->value.get (); if (ul_start > MAX_FIELD_BITSIZE) { @@ -360,7 +360,7 @@ tdesc_start_field (struct gdb_xml_parser *parser, attr = xml_find_attribute (attributes, "end"); if (attr != NULL) { - ULONGEST ul_end = * (ULONGEST *) attr->value; + ULONGEST ul_end = * (ULONGEST *) attr->value.get (); if (ul_end > MAX_FIELD_BITSIZE) { @@ -448,7 +448,7 @@ tdesc_start_field (struct gdb_xml_parser *parser, static void tdesc_start_enum_value (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, std::vector &attributes) { struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data; struct gdb_xml_value *attr; @@ -456,10 +456,10 @@ tdesc_start_enum_value (struct gdb_xml_parser *parser, ULONGEST ul_value; int value; - field_name = (char *) xml_find_attribute (attributes, "name")->value; + field_name = (char *) xml_find_attribute (attributes, "name")->value.get (); attr = xml_find_attribute (attributes, "value"); - ul_value = * (ULONGEST *) attr->value; + ul_value = * (ULONGEST *) attr->value.get (); if (ul_value > INT_MAX) { gdb_xml_error (parser, @@ -477,17 +477,16 @@ tdesc_start_enum_value (struct gdb_xml_parser *parser, static void tdesc_start_vector (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, - void *user_data, VEC(gdb_xml_value_s) *attributes) + void *user_data, std::vector &attributes) { struct tdesc_parsing_data *data = (struct tdesc_parsing_data *) user_data; - struct gdb_xml_value *attrs = VEC_address (gdb_xml_value_s, attributes); struct tdesc_type *field_type; char *id, *field_type_id; ULONGEST count; - id = (char *) attrs[0].value; - field_type_id = (char *) attrs[1].value; - count = * (ULONGEST *) attrs[2].value; + id = (char *) attributes[0].value.get (); + field_type_id = (char *) attributes[1].value.get (); + count = * (ULONGEST *) attributes[2].value.get (); if (count > MAX_VECTOR_SIZE) {