From patchwork Sun Jan 15 22:42:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ed Catmur X-Patchwork-Id: 63217 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 89271385842C for ; Sun, 15 Jan 2023 22:43:23 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from wout3-smtp.messagingengine.com (wout3-smtp.messagingengine.com [64.147.123.19]) by sourceware.org (Postfix) with ESMTPS id 6F90B3858D32 for ; Sun, 15 Jan 2023 22:43:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6F90B3858D32 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=catmur.uk Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=catmur.uk Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.west.internal (Postfix) with ESMTP id 651E632007E8; Sun, 15 Jan 2023 17:43:06 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute3.internal (MEProxy); Sun, 15 Jan 2023 17:43:06 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=catmur.uk; h=cc :cc:content-transfer-encoding:date:date:from:from:in-reply-to :message-id:mime-version:reply-to:sender:subject:subject:to:to; s=fm3; t=1673822586; x=1673908986; bh=gdqMQ8n1yaWZVxNUUtBSZOZ8k +niVigP5k0n+SuB1v4=; b=OPOg3cnghzcOBP2LN7SxLxE5Z54YZUrYT22u/C8xr lrTpkTVAhVcW8Vuosyioez5VEmXBEctouqod9+oF7Cy/DjxFJg5T445NpF4TjGJ3 ciMbHQTvsEDNaNyxqhukAp2pzbST16FOv8THi2a0P0T4ZP8jnB1Fl3GGCIQeUNE0 7wW9Ch29NXFxOP+LPVpre/MR229JXUrElCYxnTyMkoPihCGi1XT1EIoj+VqSLuOG QBSJAp/h+WomdbwWn/auZ0YYzLO3XdRj1IR14k6VJ1ZSG1+L6pU2xUUTV1NbWnCn YdvYh33LQDS9jznhiJXacp4WzT+Fqk94MMy8bnSTn15hw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding:date:date :feedback-id:feedback-id:from:from:in-reply-to:message-id :mime-version:reply-to:sender:subject:subject:to:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t= 1673822586; x=1673908986; bh=gdqMQ8n1yaWZVxNUUtBSZOZ8k+niVigP5k0 n+SuB1v4=; b=VW/1moV3NEUhGOF2QFhT75EogNtuUlrG7MBaXqKY6iluZkwJH4F sHkLbBUdzrQt84ejcNAPqgVQ3zMmJDg8FT+3TmR1Tqa67tmRpDLF+JjRiP18/bwH qZLWuqNVliLXVk8v1fgAWOIKHXuamQo9X55f8KCCTBSgxNZ7LuOjYuCcggnZ1d6C IXtxNwh66hkYU5TnH+kQKT3I75wXwwGe4UkM0bI403MiimmsJQkYNVO1FsCyLzcM DBPTTMncMp8sUPt13sjM4Uvd6jMMJ6uh7Q/v8jY0os4fsRAWUaxBx+88VGgX5GZF vlktA4XYhJ2XwqMei03GL+hzSq+Hx/RZ6FA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvhedruddtfedgtdduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffoggfgsedtkeertd ertddtnecuhfhrohhmpefgugcuvegrthhmuhhruceovggusegtrghtmhhurhdruhhkqeen ucggtffrrghtthgvrhhnpeejgeegheekheetfeejfeegveejgedtheetffegteekudekge egvedvgeffiedvgeenucffohhmrghinhepshhouhhrtggvfigrrhgvrdhorhhgnecuvehl uhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepvggusegtrghtmh hurhdruhhk X-ME-Proxy: Feedback-ID: i5729427b:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 15 Jan 2023 17:43:05 -0500 (EST) From: Ed Catmur To: gdb-patches@sourceware.org Cc: Ed Catmur Subject: [PATCH] Support DW_TAG_GNU_formal_parameter_pack and DW_TAG_GNU_template_parameter_pack. Date: Sun, 15 Jan 2023 22:42:42 +0000 Message-Id: <20230115224242.29922-1-ed@catmur.uk> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Spam-Status: No, score=-13.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_STOCKGEN, RCVD_IN_DNSWL_LOW, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" https://sourceware.org/bugzilla/show_bug.cgi?id=17272 Synthesize type and parameter names as T#n, p#n e.g. Args#1, args#1. This is a pretty simple approach but it seems to work OK and is compatible with the old style type and parameter names emitted by old versions of gcc and when it's writing stabs+ format. --- gdb/dwarf2/read.c | 71 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 851852404eb..cee9b7c4e02 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -12112,7 +12112,8 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) for (child_die = die->child; child_die; child_die = child_die->sibling) { if (child_die->tag == DW_TAG_template_type_param - || child_die->tag == DW_TAG_template_value_param) + || child_die->tag == DW_TAG_template_value_param + || child_die->tag == DW_TAG_GNU_template_parameter_pack) { templ_func = new (&objfile->objfile_obstack) template_symbol; templ_func->subclass = SYMBOL_TEMPLATE; @@ -12161,6 +12162,23 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) if (arg != NULL) template_args.push_back (arg); } + else if (child_die->tag == DW_TAG_GNU_template_parameter_pack) + { + struct die_info *pack_die; + for (pack_die = child_die->child; pack_die; pack_die = pack_die->sibling) + { + struct symbol *arg = new_symbol (pack_die, NULL, cu); + + if (arg != NULL) + template_args.push_back (arg); + } + } + else if (child_die->tag == DW_TAG_GNU_formal_parameter_pack) + { + struct die_info *pack_die; + for (pack_die = child_die->child; pack_die; pack_die = pack_die->sibling) + process_die (pack_die, cu); + } else process_die (child_die, cu); child_die = child_die->sibling; @@ -16648,6 +16666,11 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu) { if (child_die->tag == DW_TAG_formal_parameter) nparams++; + else if (child_die->tag == DW_TAG_GNU_formal_parameter_pack) + { + child_die = child_die->child; + continue; + } else if (child_die->tag == DW_TAG_unspecified_parameters) ftype->set_has_varargs (true); @@ -16723,6 +16746,11 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu) ftype->field (iparams).set_type (arg_type); iparams++; } + else if (child_die->tag == DW_TAG_GNU_formal_parameter_pack) + { + child_die = child_die->child; + continue; + } child_die = child_die->sibling; } } @@ -20844,13 +20872,16 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, sym->set_type (type); else sym->set_type (die_type (die, cu)); - attr = dwarf2_attr (die, + struct die_info *line_file_die = die; + if (die->tag == DW_TAG_formal_parameter && die->parent && die->parent->tag == DW_TAG_GNU_formal_parameter_pack) + line_file_die = die->parent; + attr = dwarf2_attr (line_file_die, inlined_func ? DW_AT_call_line : DW_AT_decl_line, cu); if (attr != nullptr) sym->set_line (attr->constant_value (0)); - attr = dwarf2_attr (die, + attr = dwarf2_attr (line_file_die, inlined_func ? DW_AT_call_file : DW_AT_decl_file, cu); if (attr != nullptr && attr->is_nonnegative ()) @@ -21070,6 +21101,8 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, list_to_add = cu->list_in_scope; } break; + case DW_TAG_GNU_formal_parameter_pack: + break; case DW_TAG_unspecified_parameters: /* From varargs functions; gdb doesn't seem to have any interest in this information, so just ignore it for now. @@ -22078,8 +22111,11 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu) if (attr_name == nullptr && die->tag != DW_TAG_namespace && die->tag != DW_TAG_class_type + && die->tag != DW_TAG_formal_parameter && die->tag != DW_TAG_interface_type && die->tag != DW_TAG_structure_type + && die->tag != DW_TAG_template_type_param + && die->tag != DW_TAG_template_value_param && die->tag != DW_TAG_namelist && die->tag != DW_TAG_union_type && die->tag != DW_TAG_template_type_param @@ -22108,9 +22144,36 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu) return attr_name; return CP_ANONYMOUS_NAMESPACE_STR; - /* DWARF does not actually require template tags to have a name. */ + case DW_TAG_formal_parameter: case DW_TAG_template_type_param: case DW_TAG_template_value_param: + if (!attr + && die->parent + && (die->parent->tag == DW_TAG_GNU_formal_parameter_pack + || die->parent->tag == DW_TAG_GNU_template_parameter_pack)) + { + const char *parent_name; + int ordinal = 0; + struct die_info *child_die; + size_t size; + char *name; + parent_name = dwarf2_name(die->parent, cu); + if (!parent_name) + return NULL; + for (child_die = die->parent->child; child_die != die; child_die = child_die->sibling) + ++ordinal; + size = snprintf(NULL, 0, "%s#%d", parent_name, ordinal) + 1; + name = ((char *) obstack_alloc (&cu->per_objfile->per_bfd->obstack, size)); + snprintf(name, size, "%s#%d", parent_name, ordinal); + return name; + } + if (die->tag == DW_TAG_formal_parameter) + { + if (!attr || attr_name == NULL) + return NULL; + break; + } + /* DWARF does not actually require template tags to have a name. */ if (attr_name == nullptr) return unnamed_template_tag_name (die, cu); /* FALLTHROUGH. */