From patchwork Wed Dec 13 18:11:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Domani X-Patchwork-Id: 82079 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 72333385E007 for ; Wed, 13 Dec 2023 18:11:52 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from sonic306-20.consmr.mail.ir2.yahoo.com (sonic306-20.consmr.mail.ir2.yahoo.com [77.238.176.206]) by sourceware.org (Postfix) with ESMTPS id 0B2EB385841F for ; Wed, 13 Dec 2023 18:11:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0B2EB385841F Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=yahoo.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=yahoo.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0B2EB385841F Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=77.238.176.206 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702491100; cv=none; b=b4Mih912bz6/jbE6czZy4xw54C9EEGHvjUN4c9NDEIsW4Ov8WuOcfheyGJJZvQH6tRl3+zEZTs2EfyJsK9rv2EwrzlYhs5+Oj+G1+q+2BEsnO1I1heBQxOdJAsf70n0Lb+Id1Lk4NQIu2SnIhoL42Vh7euf/9WJeZS1H7hNQIR0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702491100; c=relaxed/simple; bh=MC/xcgCJXapAAywpojlLWngbHUdC28HVplF6cQCmu1Y=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=wZtDRvIwFe5rZ62BfKGk7zidR7Zud0EZbLu5H1OpxY9xtQQ1JLjOSQinDsjd5CgyW+kq+vvsPBlJCpYDnGy0wdDpavC5ljJ2dv0uPujvarX52XMwA7C+FBkbmTgPd2COHScO/MIIQGjPIZBxhvP18FtXIwQ+ioUcl+u/W6M3KZg= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1702491095; bh=yO6fdEYcEbzMleUYWBRAUsd6/HuaNOKlW0hrMieJ2Xk=; h=From:To:Subject:Date:References:From:Subject:Reply-To; b=g/G97l5JBSWN3JjyZsG7IYYlhqDbrf+qfh54vEViZetDqp20dCivehVXv0ogJCyTBoTHqRN2xxq3yFy2B0CYxBYara1/kPyOvzobtaFvSyqDTVfVMSWfHc1LfP3IRm/PUXWOBbqHJx1spMLmH5b4GQLNBBagpIfrheJH9Z+0aKSsj6a5oI7X1yZdNti3QmHmhrFnR3h2/GlXfv7/vwG5o/hmSpzSo+8oio7ymnKKWAYLywasoJtJoGpFeiiIlrp9ZOaqufbDqT3V71ALQ4G2197hwAQJ71DHPiPI6Vc4PDQ9spRMES6S0SocmTz74yfQPNwXL1jrfcArS+rCfSbXRQ== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1702491095; bh=fB0u961ldZqnJ7D464DKwIAhizY/4QgLCc80yrwtJHn=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=bH/8oJK4lmYKxV97AD2gdkoXjIgqW5nz86UjzB9Uiph3ilIHMS9nUkLqZIVsAMmOvY2O0koEzJFN5DUuFWYh61LywbIWl8QzWlP3UP7uJpwubrZbiBYDsP7f0ZGlrBL+KQqdnNRSl8e2gut6AxpIpLvvPyEQtMro5QUaJtMWzpGxQz78ki1HVQy45yaKo4TeOCjw1Yedg63uXdnWClMb3srv5tVTMrrtWkRcMY7yg0wtlPly2Xa1Qvd1wldI6xFaAUWuKYtzWjr8FNhMoPCGdMnBCdfEZ9+kunaZkfM9s+iBqzFTvMEhSdxIJoKNVp5kU5bIJ3QKv4z35JrTTswk+w== X-YMail-OSG: 6W7klqUVM1lR2fe9SYATPaJEt_vHcSL9CpcDiTWzhEHTHPG_yKi3PspCMCmnFJ4 QKKxtllAcF2qsDieKsmTAagjaGzzmHH1rZV5FThRyLkcle.hDV7C5YOAfomOwkgrBmYo9XEQHSQ0 oj5IUzXY0JN_GXlmzGbFrTzWyllK5I0MwT21uqkOCGAIdHDO0vuX02YQaxCNpjuAw1ml35nehkFN 6VgiOmO2Z1J_0DKsjJY9yx71jqk3LvB21w8enoXBiMagn0zCCC7cvmL0t0VDpWpLh.r.3GHOiVi2 RGrNGMji3FnUTwiSpWwPkeHEy_7SBvy8ovZxZCTmND7m9OGSeUjrWP1j_ld7D_mv0WFjFhT624jp PZeXxgPjQ6AreI.8bqTZQyC3d89gQB28xdFCveSEKmFacvNoi4PJ05BYwCyKgmr4lewKUELe92uS MJ9kRH26vM590fqOm27AtewDLk_X2c3Dtc0gkOTDE1S4XB763nzcWb0r08fwazGXi5j.KFzB5q.Z xQEIvgzhlZTp3KQGqgQUdgRDezuwdypX3ce2VMI4i1SosSTR2M9va3c5uoIppkYunmyDkmRll_eQ dIaWmN3ZgWIl3hqCqlr3lACWUHfZ5.cEkNl3JlONoCIcXhBN2yJkG5hMCcv0VdZ3kI9DwuMVNkcQ 2LMXP7dnp2rivYVoSWjXy.ckRE2fN4OLWCgPjSeh27fN80a4129N6xgJVaFdNVqk5cbX5jK9Y5QL ijOu.OKruLVpAoTvCsWyDYU61bYIqhWfREYHBbD1PQC39neFtFSnFOh9ns682UkZ_UGWPyhiHm3Y giEA3Boy6AnuOC9L.lbTPj1ukk4vmgoITkkQnDzUMp3ohHpgcKjhKuneRAYFfh3VrVFPgA82MxaW 6sPNSFCHCdY5SFbBcFawnvTN0xIG.2Zpu_AR93EjsvwlTkER1ZxSyzN1IN_6F2Wty5W5usdFAvSx T.llwhZxYyGw5mWkOkaXXbdbnPVEzawpyni9c5N.SuqINzUgqsS.Qp97LYr4_EXyhftJL2w1OXlS 8rzE47atFPJdT.0zRSLqk0hnYIV1fq7xJNhXSYvln4JBw8aHXMHJuqVVbJuL4Vw1sFhuQ8Uo3vXa GpjsHGP_gj8PPTZVLvGqxkhc4EBUwQJ4ZRCGXEzZR2N4mVe7gUDG3cn07nKG.m6pWmS_1tjP.aN0 o1wVaew63GtG6wVHGuOk2fLivs5vlIFWFWPnRwp5RYQimLViDo1Y1cuQ2jLLoH1Q6i47tXqJdfZ2 Trm2_Jiy68w.p.tycqXhWwVaV1t_dnf3SKemduuvCWnRM5uBriSH27zQjqqU8Z5IQ7.0gVieXw5v IwqpUWKbvqqc3NARwhD.SFqKk4nkYoH8NcE0VVp1QoXP5UiIW.o3lv54DD9qbPnLzAwlVOznwA5J tWIB0xXOy289LrBYQqaBZOHWdbeT2nVkxoJz7KSI6yiRphJTngW22r7wCY9HCHXid9hEjL9UUpr7 5BZ0jswSxwIZZdNsKOnVMyxlaSVk75bInjCOgg8.9bAsjCrAU6UFP5m_OZvuIrJcCfkLHOwImRSm jMBeJ4QaFxDFJGVy5bLiWzBShCOSgzRCQTwH8uXB7BxuE7qartcatBSVczb1dJsteUWIj8NACgEQ zUg.ViuS7V4SDjqQHpypAan7P4oyYvPe2Glhva8bKJyGMucXgwfxaMYQvGreL1GYCO4OHCnrAWD. aL5_bA9hIOs_Sek.YcqZC6WP2oIcFfY.R0vzwjOhOtMaaIG8Ez7tYi8s2uE0_n7zUUsc6nJ5Q6pC eN5Y4.Im.4RKESNSdoVUs0Dl4ghe8uT_1d5oNERCltiB5ggNNtLy5zGWLrI0_RX84K42jfXas7Jd du6_eKNZBG0QUCZeF9gt3XidjejVS7QfjLPP5c5p78C5He8eU83Odex5ri_hwZ.nVbXX03eU1.DB _8rK7WbunqjorZ5P9LQ0umkfkjYs93MPTwxO2tZZ_pQgiAzCN27xdgbnPK.IQw8ttzGiNIZ_rQL6 CdkPgU8ZDNu8twZ5L79F.KMb6dcy7AfzeMjACrtJGlg4U6KJnw__ibj_y6hC6z3FJ0R950zHsC1L Ix4we3zbb3AdA0MLr7fQ2Z0BGzx8bGILRocn7CEIRjrjJ8D2UGZlNeWZW7x.R.iPDzD9OoJhFrSh 3J2TH76ItveCyHzhPbHBjXBWoxGUgjtURDAQ95jqNuWUAfU45EVREHZl2QepykdNDlyJAeJSS65y Bqbhvm1IFKqRu.WZ1D9AtTaGrMwnLP_5_9Z9qgQ-- X-Sonic-MF: X-Sonic-ID: 8f2dc613-87f7-466c-a49a-9894de31ddb1 Received: from sonic.gate.mail.ne1.yahoo.com by sonic306.consmr.mail.ir2.yahoo.com with HTTP; Wed, 13 Dec 2023 18:11:35 +0000 Received: by hermes--production-ir2-6488884f6f-kblsg (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 18e03456ece62d7b88d34e0aab376817; Wed, 13 Dec 2023 18:11:30 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH v2] Allow calling of variadic C++ functions Date: Wed, 13 Dec 2023 19:11:09 +0100 Message-Id: <20231213181109.3572-1-ssbssa@yahoo.de> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 X-Antivirus: Avast (VPS 231213-4, 12/13/2023), Outbound message X-Antivirus-Status: Clean References: <20231213181109.3572-1-ssbssa.ref@yahoo.de> X-Spam-Status: No, score=-9.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, LOTS_OF_MONEY, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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.30 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 Currently, it's not possible to call a variadic C++ function: ``` (gdb) print sum_vararg_int(1, 10) Cannot resolve function sum_vararg_int to any overloaded instance (gdb) print sum_vararg_int(2, 20, 30) Cannot resolve function sum_vararg_int to any overloaded instance ``` It's because all additional arguments get the TOO_FEW_PARAMS_BADNESS rank by rank_function, which disqualifies the function. To fix this, I've created the new VARARG_BADNESS rank, which is used only for additional arguments of variadic functions, allowing them to be called: ``` (gdb) print sum_vararg_int(1, 10) $1 = 10 (gdb) print sum_vararg_int(2, 20, 30) $2 = 50 ``` Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28589 --- v2: - Fixed ranking of overloaded varargs functions, plus some tests added for this. --- gdb/gdbtypes.c | 9 ++++++--- gdb/gdbtypes.h | 3 ++- gdb/testsuite/gdb.cp/call-c.cc | 26 ++++++++++++++++++++++++++ gdb/testsuite/gdb.cp/call-c.exp | 13 +++++++++++++ gdb/valops.c | 10 ++++++++-- 5 files changed, 55 insertions(+), 6 deletions(-) diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 4c70c9b8ae6..2580b4f19ee 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -76,6 +76,7 @@ const struct rank REFERENCE_SEE_THROUGH_BADNESS = {0,1}; const struct rank NULL_POINTER_CONVERSION_BADNESS = {2,0}; const struct rank NS_POINTER_CONVERSION_BADNESS = {10,0}; const struct rank NS_INTEGER_POINTER_CONVERSION_BADNESS = {3,0}; +const struct rank VARARG_BADNESS = {4, 0}; /* Floatformat pairs. */ const struct floatformat *floatformats_ieee_half[BFD_ENDIAN_UNKNOWN] = { @@ -4038,7 +4039,8 @@ compare_badness (const badness_vector &a, const badness_vector &b) badness_vector rank_function (gdb::array_view parms, - gdb::array_view args) + gdb::array_view args, + bool varargs) { /* add 1 for the length-match rank. */ badness_vector bv; @@ -4051,7 +4053,8 @@ rank_function (gdb::array_view parms, arguments and ellipsis parameter lists, we should consider those and rank the length-match more finely. */ - bv.push_back ((args.size () != parms.size ()) + bv.push_back ((args.size () != parms.size () + && (! varargs || args.size () < parms.size ())) ? LENGTH_MISMATCH_BADNESS : EXACT_MATCH_BADNESS); @@ -4064,7 +4067,7 @@ rank_function (gdb::array_view parms, /* If more arguments than parameters, add dummy entries. */ for (size_t i = min_len; i < args.size (); i++) - bv.push_back (TOO_FEW_PARAMS_BADNESS); + bv.push_back (varargs ? VARARG_BADNESS : TOO_FEW_PARAMS_BADNESS); return bv; } diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index eca92196364..4b563e79546 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -2735,7 +2735,8 @@ extern int compare_badness (const badness_vector &, const badness_vector &); extern badness_vector rank_function (gdb::array_view parms, - gdb::array_view args); + gdb::array_view args, + bool varargs = false); extern struct rank rank_one_type (struct type *, struct type *, struct value *); diff --git a/gdb/testsuite/gdb.cp/call-c.cc b/gdb/testsuite/gdb.cp/call-c.cc index 4362bbf2143..1677755b4b9 100644 --- a/gdb/testsuite/gdb.cp/call-c.cc +++ b/gdb/testsuite/gdb.cp/call-c.cc @@ -15,6 +15,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +#include + int func(int x) { return x; @@ -33,6 +35,29 @@ extern "C" { int foo(int); } +int sum_vararg_int (int count, ...) +{ + va_list va; + int sum = 0; + + va_start (va, count); + for (int i = 0; i < count; i++) + sum += va_arg (va, int); + va_end (va); + + return sum; +} + +int vararg_func (int a, ...) +{ + return 1; +} + +int vararg_func (int a, int b, ...) +{ + return 2; +} + int main() { Foo f; @@ -41,5 +66,6 @@ int main() FooHandle handle = pf; rf->func(); /* set breakpoint here */ foo(0); + sum_vararg_int (1, 5); return func(0); } diff --git a/gdb/testsuite/gdb.cp/call-c.exp b/gdb/testsuite/gdb.cp/call-c.exp index b20bc8698ca..36c0c1e2a75 100644 --- a/gdb/testsuite/gdb.cp/call-c.exp +++ b/gdb/testsuite/gdb.cp/call-c.exp @@ -38,5 +38,18 @@ gdb_test "print foo(1)" "\\\$$decimal = 1" gdb_test "continue" ".*breakpoint here.*" "continue to bp" gdb_test "print rf->func()" "\\\$$decimal = 1" +gdb_test "print sum_vararg_int(0)" "0" +gdb_test "print sum_vararg_int(1, 10)" "10" +gdb_test "print sum_vararg_int(2, 20, 30)" "50" +gdb_test "print sum_vararg_int(5, 20, 30, 40, 50, 60)" "200" + +gdb_test "print vararg_func(1)" "1" +gdb_test "print vararg_func(2, 3)" "2" +gdb_test "print vararg_func(4, 5.5)" "2" +gdb_test "print vararg_func(6, \"7\")" "1" +gdb_test "print vararg_func(8, 9, 10)" "2" +gdb_test "print vararg_func(11, 12, 13.5)" "2" +gdb_test "print vararg_func(14, 15, \"16\")" "2" + # Regression test for method call via a typedef. gdb_test "print handle->func()" "\\\$$decimal = 1" diff --git a/gdb/valops.c b/gdb/valops.c index 49ea1fd7676..a15c92bd222 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -3226,6 +3226,7 @@ find_oload_champ (gdb::array_view args, { int jj; int static_offset = 0; + bool varargs = false; std::vector parm_types; if (xmethods != NULL) @@ -3238,9 +3239,13 @@ find_oload_champ (gdb::array_view args, { nparms = TYPE_FN_FIELD_TYPE (methods, ix)->num_fields (); static_offset = oload_method_static_p (methods, ix); + varargs = TYPE_FN_FIELD_TYPE (methods, ix)->has_varargs (); } else - nparms = functions[ix]->type ()->num_fields (); + { + nparms = functions[ix]->type ()->num_fields (); + varargs = functions[ix]->type ()->has_varargs (); + } parm_types.reserve (nparms); for (jj = 0; jj < nparms; jj++) @@ -3255,7 +3260,8 @@ find_oload_champ (gdb::array_view args, /* Compare parameter types to supplied argument types. Skip THIS for static methods. */ bv = rank_function (parm_types, - args.slice (static_offset)); + args.slice (static_offset), + varargs); if (overload_debug) {