From patchwork Tue Dec 12 16:12:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Domani X-Patchwork-Id: 81974 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 7569C385841A for ; Tue, 12 Dec 2023 16:13:33 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from sonic308-2.consmr.mail.bf2.yahoo.com (sonic308-2.consmr.mail.bf2.yahoo.com [74.6.130.41]) by sourceware.org (Postfix) with ESMTPS id E66D238582A0 for ; Tue, 12 Dec 2023 16:13:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E66D238582A0 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 E66D238582A0 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=74.6.130.41 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702397600; cv=none; b=arR7q1nbgjIDiy45mi94tUPIDB5vvct/sR5SkvD1qNsYKa0sjUMRnYwC4D8zPg3Bp6KbXNIl85idTY12NchFRU+g5mtOrkf38qwupwq2UnrhJTz8h1hAFJtybizGj73PF9rWuvNogYMxjP6h5dwgDD+Yjm+QjKeiWvmUcWGgTNY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702397600; c=relaxed/simple; bh=N+VxpRAaJiuzw5yigWlKy5HwxfFgXF7LPc9wkRe+PXI=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=HnPgwH1gJGgQniPZuOII8CTZTwnwS9mXrcjnK1/ZTJ4ulBk5NjoMWsANG90VlWTa56bbbq8/0zD70euGFvFLL6FDvnA7n20rQ8yZo/i9p/4Kl2C3oBBjaJiMYhA++Q9585mMPN4mtgmF1svZjMu7YmtHsGyNvkyOeIHYAC1G+nM= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1702397598; bh=rdQ6zyQlcJiv5/vMvmsPAQKoQwqLBKTQJnj7kBykTmw=; h=From:To:Subject:Date:References:From:Subject:Reply-To; b=SdELIkvK9qkRge8utCf6R6jyE/WF0Sjq58gSaooWkon7pHqTlugz8EBtXx+I4HdOjqGWzP616fbiCw1srwjbYT259nbXXo2IDMZwhDZyDDlQBDcPeWjyb6OdzJUkDPrrKhy/DKr/cSmoqLCwCfbT7TFDnmCpzxhewwNrmQW4Au9AI4ZX6Y06xSanD/Iu87EJmyHvcpgKNkd2K/O8Y3zrIvsGcvnkcnU5drV3pQt8fyzXwqhHPlPF8vgCD2WNKL0Er4+JEN2Io3WLvkqYc0x+6DvcM8OVrnSrnmQxaHfvoS/4kZnLZVMuwL0ari/s9nfQAZBLULAadsURmBCfsYPMCg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1702397598; bh=LuOP5BKHCKVtrkoNsnccm8cDbX897UVfHHCspcNA+dK=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=ChWhIw0XRtI8eHUZekc9RahCPw5c7aBoCkhQkIc/QvWXUuJTQc1LxkxiLAdTLcfQOrh6Hw2MDWic+fmr/fbGZ8hWn2qTidQ4Zpa0q+49PohPV7WvPQ1WzdjzyhmfkmLHjccG2DZVyoJFzw2N6XHXmi7attx70PUy3rwXdev5wQiR64HgVTJvG2KTdjnBOhQ7QEz5tAbpFSK9zUKfcQGWCFARC3FSSmxXDnS90PX254oVBqc33+kTa2yfLjLjCYmCyNGiCkJi183lHxnatO27ZNZaiAfLWJLrkz/E1Q/tEGkwMFXT2E9ToH5YmkR62Dnus/AW02OuHyUWm5FtlmyQag== X-YMail-OSG: iVFK3PQVM1nCv5qwkRiyLcATHSjLtjLEjrtHpcLqsnXtZ5HhIgkiOBuhupcNDFM MFzCTWPwbVZg5oQxoE.4vthYxc4ep2BOwo8KZavEPc4Cxlyn2TNAOGx9aVPBHJYoSnbBWQfIrVqS .cEnDm3PAfiUHtPvybLW7qBDc.gGpzggKsG0em5OjbFUm6_rU0dNFjbIWWAOfj1Bm2xJ_1gt4qhw ck5Hp9upckQH_LP4Kwbr2bnFhYhIqyL_y2bSBDYzf9whX7fJv26sAzWcH5wD8HMTHyQNyhlC1wof 2CJ2oCAwGdYYgn9S7T8QYfBK4.JwmH76l0AEEQijKhE1WumInhX1Hz7m9EV2fgFny3oWt39p_dIC Bq6HPJr35wS25EW6KYAu_dmz.eawmoErZpfnUfhCFT3jMMK31GsSpY5J_Hx8Rwwr2phUb6vNSfSu oFNJ9kmMN5Im_O2J6DAc4gRzsZpXBGrsfa5WQsdPfYoMf0Dp2HzyIfr.mxEFKaDQK3of6cfVw4ft PIyEwa69ID3Hd24BQdegCMRcgMXky3l7.RNAEnH64FCFvxFZZ7kTjvTW5PF_5Dd6vyzgb9HKK_bt 3Uwd2mV.ha6NWHkPNAuS6vmkaX1BFIqVp0yfxIBP2hGbVrdF3hIR1._ueE5_j8SmKvraFnxNjOIS zjAra6_8uC_phRqI3GiGvP1QavUin65IYvSJ2Tiy3RyvzD_K9M_JoR1eMkQLiNX_l9bPXzRyoUlR dmIoZwSv91BMBVhp5zfYfzddPEx.olPto_01J3glsMdXzrGozmXnJA7y1RW641a0vTlqrGPYGm6d U_fkg7x3XILzn.Tq.8htCYldLWNdsa8cOaGE1Y2MVILg3s2neES7vlQnyiEC8CnpnOtiEHtIQz5R 0ebDHslDXl_6l1SbgAWN7HJuEOBb4h0GP4l3lS4RzdWJeBgcUb631s.wyej18RR5gnOYisikYA6F tGoJkW2pOF6oUwRrD6894F6tihKq14E9W0uuIvD1T3K5aahPKsmJVFyCwZXsgj8stUJWxnm17Eaw UGdfYF.gIAmR549B6oIFrBJHxPkV_bZt2k5ohmMhdg9UFFeaWSii4yhE.rBfGKWGT51wKnkvAmDw zGpvqrfDSUMXnQ6ZGX4YKc5RESRz2uCTc1BlOVCmMnln7aGgKF240YbZq9yDMwIXKc76oIAD7uZ0 m_r4u0wOuQsRD7obahfZmmGndfyxmxphXB27It4jMjIzpG8IojflrOWYecti.rCnIL_IhhwAsYro YzevGKaG0GGmSPCixdwZECfUvE6L4.x4u1x7d7hNGPgIJd5oR2H6DDUPZeolTZwD7ZPnDCadudiy MfHc3S4weFRFsuTgoI9XmqrXqqvwUnLCCOPinjeXZZYipJc.WKRTajhIUjWZbd7IJGZitbR5K1FK ahQC048zqfXcbXmxBWSrKfW9X7ZODmpEmdsi81ArWCsuNOxOZacDJpSTMe9S5At4NVSzzFU61a_V 81DTsJJ9i7maWgH8taegLs4HdAYzuLjxFWlScITvi6Kj_s1_74bsvsByEQ0Ib7nGqnRZK7SyPpC3 kkPMK_vnu2Ua9KyIuDOx2g4N9AgyILkOUpTJhQUdVBvG_6qiWz2DJLG__cF4dczfFXdk5Itoy5PC wkvrmJRae85FCnE_y1MnxmH4NrU_aB.UasxBR66N_yAdwlyw96rws93wj8s21UuOJUI5TD6z3b9k BnE2QEiGzk99A.uLJ72N8jGUfCiK7FYbtwmpBWnIyan_atetalMCQoWnXlocYP1B3up0OHKzoZ91 W1yP0UNZEbm2526OcV1VIDgsElVrKzu25uWo_eX2MenItpc2M6RRQm6q8BgQQ_heSW6fmTmZdTZ3 H_P1NFujC4ynUHVj15z.jI7Ruh5hoOStWO4mb8Kjyu1a0dZ4eOqP3I1FNSXcu5dx9_5SZS3ZxA_H kHeHJtc2cis8amncW1wDBmxCz62mTeFqygSj9g_kwxM_PMrr8EWtibnY5GRVuMNxp8Jq3GDz5cEs Q6XeBoGMvwh_7Ubrq2jrvCgfZqvR6thuD0dPPcnuoeSqW2m7vnSTA3dNH77ZCMQ_x0lw1A3hPEAI cz4JmI7Q6NCeMSMsqDeYiSLJbypseQHMrUYXVEWXnEpoLwn.CacSoXqOXKcv9OLL1Bk.dIKZLeBA oS2kHr1gM4RYKCkRqmDXMPg4Z82LBxTNSs3jzaB7_9RFknCT.G_fQxCQqEfpLbxHTKbMAphwMqMj gCfvvjJ0WGVe5C3T_z3tzzXXOo7MJC_yDwg-- X-Sonic-MF: X-Sonic-ID: 92b0bb60-1089-4df1-888b-ee80d4910845 Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.bf2.yahoo.com with HTTP; Tue, 12 Dec 2023 16:13:18 +0000 Received: by hermes--production-ir2-95776f84c-nr22c (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID ffbbdc939369c4cd550eec918e82cd1a; Tue, 12 Dec 2023 16:13:13 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH] Allow calling of variadic C++ functions Date: Tue, 12 Dec 2023 17:12:55 +0100 Message-Id: <20231212161255.3597-1-ssbssa@yahoo.de> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 X-Antivirus: Avast (VPS 231212-2, 12/12/2023), Outbound message X-Antivirus-Status: Clean References: <20231212161255.3597-1-ssbssa.ref@yahoo.de> X-Spam-Status: No, score=-8.2 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 --- gdb/gdbtypes.c | 6 ++++-- gdb/gdbtypes.h | 3 ++- gdb/testsuite/gdb.cp/call-c.cc | 16 ++++++++++++++++ gdb/testsuite/gdb.cp/call-c.exp | 5 +++++ gdb/valops.c | 10 ++++++++-- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 4c70c9b8ae6..6b9bc661680 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -65,6 +65,7 @@ const struct rank INTEGER_PROMOTION_BADNESS = {1,0}; const struct rank FLOAT_PROMOTION_BADNESS = {1,0}; const struct rank BASE_PTR_CONVERSION_BADNESS = {1,0}; const struct rank CV_CONVERSION_BADNESS = {1, 0}; +const struct rank VARARG_BADNESS = {1, 0}; const struct rank INTEGER_CONVERSION_BADNESS = {2,0}; const struct rank FLOAT_CONVERSION_BADNESS = {2,0}; const struct rank INT_FLOAT_CONVERSION_BADNESS = {2,0}; @@ -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; @@ -4064,7 +4066,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..bcf08883788 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,19 @@ 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 main() { Foo f; @@ -41,5 +56,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..7cb9eef34c7 100644 --- a/gdb/testsuite/gdb.cp/call-c.exp +++ b/gdb/testsuite/gdb.cp/call-c.exp @@ -38,5 +38,10 @@ 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" + # 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) {