From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from aserp2130.oracle.com (aserp2130.oracle.com [141.146.126.79]) by sourceware.org (Postfix) with ESMTPS id C2E6C3844011 for ; Tue, 27 Apr 2021 01:01:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C2E6C3844011 Received: from pps.filterd (aserp2130.oracle.com [127.0.0.1]) by aserp2130.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 13R0oTh7147422 for ; Tue, 27 Apr 2021 01:01:21 GMT Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70]) by aserp2130.oracle.com with ESMTP id 385afpuuaf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 27 Apr 2021 01:01:20 +0000 Received: from pps.filterd (aserp3020.oracle.com [127.0.0.1]) by aserp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 13R0nkfw082835 for ; Tue, 27 Apr 2021 01:01:20 GMT Received: from nam11-co1-obe.outbound.protection.outlook.com (mail-co1nam11lp2168.outbound.protection.outlook.com [104.47.56.168]) by aserp3020.oracle.com with ESMTP id 384b55mbcy-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 27 Apr 2021 01:01:20 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eCLAvH3nXPtCH3QqmTJJmB3cBwDe6/hg0BJfaZ+vmcizeSi6yIjmf+nLNJcap/AInq4xMP0X4Z40E4K6HxyWJlDXAEXpGW5w9X/wae6CtkO3E9SlyuP5yf6+pGtpzv2ye2FViD+ydDiwYWGRHDhO6pg9GeVK4LLJhm1tHx5vKQK5LFoYdVX0Q7xSSf9QquqNJ/eoFWERVji1SrLO5AsgAfn2cqqrAbJDl44HmebObLtuNW1QaFihJhgrP0EnFnpvXiZMkio5TVnVvil9HL/4R3pXwjcJbO/zvMuocd448VP64e5WeBLMlHpqB6g+lQq+PHwqLSJ85F4iP4uK2XV4JQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=IkIyOmI9ZSPINqUFU7b6end7B3YO54t+f0HEXUxby7w=; b=gr3rep/4u6Dub2+9rFxi3ROCp2kFBrQb8e4BokL7fxu/407Wd86Twew3U+Qwohn30RwnR9F99QmCngkmMTKMoWleuBDtllm4rI6nXaUM8uSeDfTMrY9Z2efEquOSTJXjT+ZSppRZm2JuspZMtSx2QySZmTaDzE9yozfVnoQBz2192U5qH6GnuADUGvZHXOe9MkQV0W2K291J3hCrkyEwYgUWhkBeosV8lC/sZzSnTFWZMdZOwnGmLST9fRiHmy2irvqBtPiBj6gsvanONgv111BS1JDKwx7kZVZn3ZtprEudNkEvJY52nNLZzefy8XVEr1oKc2VgltzpcHs6Z9KOrQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none Received: from BN6PR10MB1748.namprd10.prod.outlook.com (2603:10b6:405:9::16) by BN6PR10MB1876.namprd10.prod.outlook.com (2603:10b6:404:ff::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4065.23; Tue, 27 Apr 2021 01:01:17 +0000 Received: from BN6PR10MB1748.namprd10.prod.outlook.com ([fe80::250a:e1c3:3146:8e02]) by BN6PR10MB1748.namprd10.prod.outlook.com ([fe80::250a:e1c3:3146:8e02%9]) with mapi id 15.20.4065.027; Tue, 27 Apr 2021 01:01:17 +0000 From: Weimin Pan To: gdb-patches@sourceware.org Subject: [PATCH,V4 1/2] CTF: fix incorrect function return type Date: Mon, 26 Apr 2021 21:00:53 -0400 Message-Id: <1619485254-7340-2-git-send-email-weimin.pan@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1619485254-7340-1-git-send-email-weimin.pan@oracle.com> References: <1619485254-7340-1-git-send-email-weimin.pan@oracle.com> Content-Type: text/plain X-Originating-IP: [148.87.23.13] X-ClientProxiedBy: SN2PR01CA0076.prod.exchangelabs.com (2603:10b6:800::44) To BN6PR10MB1748.namprd10.prod.outlook.com (2603:10b6:405:9::16) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.us.oracle.com (148.87.23.13) by SN2PR01CA0076.prod.exchangelabs.com (2603:10b6:800::44) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4065.20 via Frontend Transport; Tue, 27 Apr 2021 01:01:17 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 06ba2487-dbd3-4869-dc3e-08d90917f66d X-MS-TrafficTypeDiagnostic: BN6PR10MB1876: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:1923; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: r08RnpBMAnikDNdtP6UbjlpHvSTmLxMb85y1SHVFiSVQIAKObL9JZXi6+wgXbHwqaFe5oU7fFArevlo8DiFbjfvELNY6kHA80r1PjKy/BMAPQEJiYfK0NhJG5OSfHSJPEq0id+jGZW/UnDKR3SExPrsgAPdrflNS4K7HAdqfRr0jnhwIdV4H3yBNoR8Wf8LGkkZOwmW4z43HL4WLQoJTA+fO/MzD7QwXpyp44G5AnRO2ATUhks7ucpoQq/Yv4DbrTJz+B+7p2xZHqEplFLk3Uqd+RRW8I16okMtlX4ZR9Qkvy8t5uGKCQoDdtITzc2bmiW0meGXHAEegyRSYFMxAU0i/NnZx79AeHPHlSJNbJrulM96ha1S7YvDpN82pYY4TrwPNeGlEatE/NrhoPReZy0LGqQP6ctDEyD7/c+2Xub8DGCPAusZ4WafLbzZ2iQYjMUK/elyP5CII3xAgNdQ2Bm1R6Z6fxM283tWMVNxExU1weOvOdC6sOatAxtmLt6Op9o+xx1m8ylVucPleoW2+e5ywCIbKqvf/f2MxmPaggoEyFBKtqG/JMVMe3aEbkL74l3cp2uveazV+PhadNvHFs0EMP+aivhGocrTNFiuioqixfFPiNwu5CbYh2QaIOJT/mppdcnNCEw2SEmGZ9854P+sdlFn8CEWjwx6pYhwXj5pBHeQNpR8zXF7iM07dkHn0Z6b1LmT96mGINBiHAl95YnlihgWxO09ClWjzIaiYKRaxdNAJ/tgTTO3eNbefJa4d X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:BN6PR10MB1748.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(376002)(136003)(396003)(39860400002)(346002)(366004)(2906002)(38350700002)(38100700002)(6486002)(66476007)(478600001)(86362001)(66556008)(52116002)(7696005)(8676002)(16526019)(66946007)(83380400001)(956004)(6916009)(8936002)(36756003)(2616005)(6666004)(186003)(44832011)(5660300002)(316002)(30864003)(26005)(2004002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?FWLKRrzgy+p9lImI3/2xDrx4NZjWjgd+7mKlG72dPqG+cOjRQ5duACFVC8PO?= =?us-ascii?Q?AqlfnHDGwFn/dBmzjayImcRn9gv1A67navhv1oO/2x5ZBA3PbaHwide7i7LH?= =?us-ascii?Q?ns+/oYgXpbN3jkIHsrp1ipRy6KrEbBwY9ejcoZi+HEIq4jEezogcrBYEeMd8?= =?us-ascii?Q?SxZCs1/BXRRz1YIbRPde3vH2leQHGBJe8JYNxBX08JHchjhcm4CkpA/plWL+?= =?us-ascii?Q?eEBEvBZudAXsKIg93bVQSTeYJ3qKfDxSVH+Psxzq7P6vwGeh/Ddgx/Ch079Y?= =?us-ascii?Q?69DWd9t+yBpNCMC5wRdrWHVqgIMPz2sFDs9YQlOkmjPhrtRQv6btqyWJC5ph?= =?us-ascii?Q?fdKrYgZSMex3PJ41Obdx9owhOlIMZQmo+tGt5jnOhSDfBgKoCBMpa1UELrQj?= =?us-ascii?Q?htMKPoRSF2PwhT+TVc0f0JG7hoDkqdTCTtNCeJOlrsAa/cdziwEpsaX0otAG?= =?us-ascii?Q?Z8PEH7pA3gw6otMUGyKJYf2w+ptAxE5AbsO4kWeD0IMtMZSHJ4HAI3FZwC01?= =?us-ascii?Q?3GU0ciJLfery6/I8cnf16084eJA9Hlk1Cn+NgMEVK/zprrJlG61J5P0JY5qb?= =?us-ascii?Q?TinyBlchdEL+xutIKmotXPyLoXu4fFITqMW8c8rpzgc/ZGF0+0h5XWvr4lS6?= =?us-ascii?Q?kX/Wn8SbQr0aUnEa5mP78SkyUaNq+z81qgqDU6LH6a5rFou7PyzjismHtaxV?= =?us-ascii?Q?1Due/qIxcNyaErgX4ooTIkyRGevbPqAfquo4TUKx1ZzLA91CqzBuFLyB+Qgd?= =?us-ascii?Q?sNyxGaKqTh06YLCUFQf1HoE4Oi8PP2SSxLoKo8J/y/AcHbZzPtHDrjQyX08L?= =?us-ascii?Q?CaPBMlim8CBHiGlT9GhZ6v4SVYziu6nwY7T3ryHQ7GwCFnYGLgmHYUWYqD6J?= =?us-ascii?Q?Xt+2Iznou4Emqk9mnLWRIaI/j6hU3UnBpw32JHCT18JwAck/ffxh9WPENAAb?= =?us-ascii?Q?MtHg8Ja0t2hCQ5r9vcQXRwg+TLOMkEMy2jN0AKdyeO8pYSVRrBmMHF0Si0Dw?= =?us-ascii?Q?tNvIbvphNwowV9yiFEpXkRyIbAEfVi/nw2JO3ttpAO4j2OuPtK8jG+Bj0P5+?= =?us-ascii?Q?zoHnXC07F4H/NMtde2MonjaIcNRV6q04lJ6aRP5NGovb3mgXqghJpAKlXR/+?= =?us-ascii?Q?bX/mxQ8+TJPEtiFFRBS4GY8oKEXV2T4Ol/EMh583rTLwKHi7uhH1+0sE+0bO?= =?us-ascii?Q?0IWxBCHJTwmNEalkqYVxZh3nj2UVdmloTyVjS3wUMCQgKDkaOgyGVixssWXq?= =?us-ascii?Q?/pBTxcxog+alUTLWkWtTNei7+dPY3mS8ZXc8xhxZmQqag8EvLh0M9+An3Fb3?= =?us-ascii?Q?WA8mKMbqSiPJgfyHHY5qKpQ2?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 06ba2487-dbd3-4869-dc3e-08d90917f66d X-MS-Exchange-CrossTenant-AuthSource: BN6PR10MB1748.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Apr 2021 01:01:17.5247 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ObD2V9z9BdchJuqKrZOFrIdRJnXTCI6G9Gxp25pf/+1fLaorcMk9hmo1g8cw3RI+a68WZ0TZyKqSSEPImR4BUQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR10MB1876 X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=9966 signatures=668683 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 bulkscore=0 mlxscore=0 malwarescore=0 phishscore=0 adultscore=0 mlxlogscore=999 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104060000 definitions=main-2104270002 X-Proofpoint-ORIG-GUID: 17CricrHJZ6CJgE7sMhYZLwSmJPvAGD0 X-Proofpoint-GUID: 17CricrHJZ6CJgE7sMhYZLwSmJPvAGD0 X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=9966 signatures=668683 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 spamscore=0 phishscore=0 clxscore=1015 suspectscore=0 lowpriorityscore=0 mlxlogscore=999 mlxscore=0 adultscore=0 malwarescore=0 impostorscore=0 priorityscore=1501 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104060000 definitions=main-2104270002 X-Spam-Status: No, score=-10.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, KAM_STOCKGEN, MSGID_FROM_MTA_HEADER, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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: , X-List-Received-Date: Tue, 27 Apr 2021 01:01:25 -0000 The problems can be illustrated, with any program, below: (gdb) print main $1 = {main} 0x0 The return type was incorrectly set in read_func_kind_type, with the name of the function, which leads c_type_print_base_1 to print it. In addition, the address of a new function needs to be set with that info in its minimal symtab entry, when the new function is added. After the fix: (gdb) print main $1 = {int ()} 0x4004b7
A new test, gdb.ctf/funcreturn.exp, is added to the testsuite. --- gdb/ChangeLog | 6 + gdb/ctfread.c | 57 +++--- gdb/testsuite/ChangeLog | 5 + gdb/testsuite/gdb.ctf/funcreturn.exp | 190 ++++++++++++++++++++ gdb/testsuite/gdb.ctf/whatis.c | 339 +++++++++++++++++++++++++++++++++++ 5 files changed, 566 insertions(+), 31 deletions(-) create mode 100644 gdb/testsuite/gdb.ctf/funcreturn.exp create mode 100644 gdb/testsuite/gdb.ctf/whatis.c diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e817ba6..8abea2d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2021-04-16 Weimin Pan + + * ctfread.c (new_symbol): Set function address. + (read_func_kind_type): Remove incorrect type name setting. + Use ctf_type_name_raw to get type name throughout file. + 2021-04-07 Weimin Pan * ctfread.c (fetch_tid_type): New function, use throughout file. diff --git a/gdb/ctfread.c b/gdb/ctfread.c index e2b65b6..97355bf 100644 --- a/gdb/ctfread.c +++ b/gdb/ctfread.c @@ -462,14 +462,14 @@ struct ctf_tid_and_type ctf_dict_t *fp = ccp->fp; struct symbol *sym = nullptr; - gdb::unique_xmalloc_ptr name (ctf_type_aname_raw (fp, tid)); + const char *name = ctf_type_name_raw (fp, tid); if (name != nullptr) { sym = new (&objfile->objfile_obstack) symbol; OBJSTAT (objfile, n_syms++); sym->set_language (language_c, &objfile->objfile_obstack); - sym->compute_and_set_names (name.get (), true, objfile->per_bfd); + sym->compute_and_set_names (name, true, objfile->per_bfd); SYMBOL_DOMAIN (sym) = VAR_DOMAIN; SYMBOL_ACLASS_INDEX (sym) = LOC_OPTIMIZED_OUT; @@ -487,6 +487,7 @@ struct ctf_tid_and_type break; case CTF_K_FUNCTION: SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC; + set_symbol_address (objfile, sym, sym->linkage_name ()); break; case CTF_K_CONST: if (SYMBOL_TYPE (sym)->code () == TYPE_CODE_VOID) @@ -525,7 +526,7 @@ struct ctf_tid_and_type ctf_dict_t *fp = ccp->fp; ctf_encoding_t cet; struct type *type = nullptr; - char *name; + const char *name; uint32_t kind; if (ctf_type_encoding (fp, tid, &cet)) @@ -535,16 +536,15 @@ struct ctf_tid_and_type return nullptr; } - gdb::unique_xmalloc_ptr copied_name (ctf_type_aname_raw (fp, tid)); - if (copied_name == nullptr || strlen (copied_name.get ()) == 0) - { + name = ctf_type_name_raw (fp, tid); + if (name == nullptr || strlen (name) == 0) + { name = ctf_type_aname (fp, tid); if (name == nullptr) complaint (_("ctf_type_aname read_base_type failed - %s"), ctf_errmsg (ctf_errno (fp))); - } - else - name = obstack_strdup (&of->objfile_obstack, copied_name.get ()); + } + kind = ctf_type_kind (fp, tid); if (kind == CTF_K_INTEGER) @@ -623,9 +623,9 @@ struct ctf_tid_and_type type = alloc_type (of); - gdb::unique_xmalloc_ptr name (ctf_type_aname_raw (fp, tid)); - if (name != nullptr && strlen (name.get ()) != 0) - type->set_name (obstack_strdup (&of->objfile_obstack, name.get ())); + const char *name = ctf_type_name_raw (fp, tid); + if (name != nullptr && strlen (name) != 0) + type->set_name (name); kind = ctf_type_kind (fp, tid); if (kind == CTF_K_UNION) @@ -682,10 +682,6 @@ struct ctf_tid_and_type type = alloc_type (of); - gdb::unique_xmalloc_ptr name (ctf_type_aname_raw (fp, tid)); - if (name != nullptr && strlen (name.get ()) != 0) - type->set_name (obstack_strdup (&of->objfile_obstack, name.get ())); - type->set_code (TYPE_CODE_FUNC); ctf_func_type_info (fp, tid, &cfi); rettype = fetch_tid_type (ccp, cfi.ctc_return); @@ -734,9 +730,9 @@ struct ctf_tid_and_type type = alloc_type (of); - gdb::unique_xmalloc_ptr name (ctf_type_aname_raw (fp, tid)); - if (name != nullptr && strlen (name.get ()) != 0) - type->set_name (obstack_strdup (&of->objfile_obstack, name.get ())); + const char *name = ctf_type_name_raw (fp, tid); + if (name != nullptr && strlen (name) != 0) + type->set_name (name); type->set_code (TYPE_CODE_ENUM); TYPE_LENGTH (type) = ctf_type_size (fp, tid); @@ -972,9 +968,9 @@ struct ctf_tid_and_type type = alloc_type (of); - gdb::unique_xmalloc_ptr name (ctf_type_aname_raw (fp, tid)); - if (name != NULL && strlen (name.get()) != 0) - type->set_name (obstack_strdup (&of->objfile_obstack, name.get ())); + const char *name = ctf_type_name_raw (fp, tid); + if (name != nullptr && strlen (name) != 0) + type->set_name (name); kind = ctf_type_kind_forwarded (fp, tid); if (kind == CTF_K_UNION) @@ -1017,9 +1013,9 @@ struct ctf_tid_and_type break; case CTF_K_TYPEDEF: { - gdb::unique_xmalloc_ptr name (ctf_type_aname_raw (fp, tid)); + const char *name = ctf_type_name_raw (fp, tid); btid = ctf_type_reference (fp, tid); - type = read_typedef_type (ccp, tid, btid, name.get ()); + type = read_typedef_type (ccp, tid, btid, name); } break; case CTF_K_VOLATILE: @@ -1219,8 +1215,7 @@ struct ctf_tid_and_type if (ctf_func_args (ccp->fp, idx, argc, argv) == CTF_ERR) return nullptr; - gdb::unique_xmalloc_ptr name (ctf_type_aname_raw (ccp->fp, idx)); - if (name == nullptr) + if (ctf_type_name_raw (ccp->fp, idx) == nullptr) return nullptr; tid = ctf_lookup_by_symbol (ccp->fp, idx); @@ -1444,7 +1439,6 @@ struct ctf_tid_and_type short section = -1; ccp = (struct ctf_context *) arg; - gdb::unique_xmalloc_ptr name (ctf_type_aname_raw (ccp->fp, tid)); domain_enum domain = UNDEF_DOMAIN; enum address_class aclass = LOC_UNDEF; @@ -1486,10 +1480,11 @@ struct ctf_tid_and_type return 0; } - if (name == nullptr || strlen (name.get ()) == 0) + const char *name = ctf_type_name_raw (ccp->fp, tid); + if (name == nullptr || strlen (name) == 0) return 0; - ccp->pst->add_psymbol (name.get (), true, + ccp->pst->add_psymbol (name, true, domain, aclass, section, psymbol_placement::GLOBAL, 0, language_c, ccp->partial_symtabs, ccp->of); @@ -1545,7 +1540,7 @@ struct ctf_tid_and_type else continue; } - gdb::unique_xmalloc_ptr tname (ctf_type_aname_raw (cfp, tid)); + const char *tname = ctf_type_name_raw (cfp, tid); uint32_t kind = ctf_type_kind (cfp, tid); address_class aclass; domain_enum tdomain; @@ -1568,7 +1563,7 @@ struct ctf_tid_and_type else aclass = LOC_TYPEDEF; - pst->add_psymbol (tname.get (), true, + pst->add_psymbol (tname, true, tdomain, aclass, -1, psymbol_placement::STATIC, 0, language_c, partial_symtabs, of); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 53333f9..3d800c2 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2021-04-16 Weimin Pan + + * gdb.ctf/cross-tu-cyclic.exp: New file. + * gdb.ctf/multi.exp: New file. + 2021-04-07 Weimin Pan * gdb.base/ctf-ptype.c: Add struct link containing a forward diff --git a/gdb/testsuite/gdb.ctf/funcreturn.exp b/gdb/testsuite/gdb.ctf/funcreturn.exp new file mode 100644 index 0000000..874160e --- /dev/null +++ b/gdb/testsuite/gdb.ctf/funcreturn.exp @@ -0,0 +1,190 @@ +# Copyright 2021 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +if [skip_ctf_tests] { + unsupported "no CTF debug format support, or CTF disabled in GDB" + return 0 +} + +if [target_info exists no_long_long] { + set exec_opts [list debug additional_flags=-DNO_LONG_LONG] +} else { + set exec_opts [list debug] +} + +standard_testfile whatis.c + +# Using `-gt` generates full-fledged CTF debug information. +set opts "additional_flags=-gt -Wl,--export-dynamic" + +if { [prepare_for_testing "failed to prepare" ${testfile} \ + [list $srcfile] [list $opts nowarnings]] } { + return 0 +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info] { + return -1 +} + +# test print command with functions return type +set void "(void|)" +gdb_test "print v_char_func" \ + "$decimal = \{char \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print char function" + +gdb_test "print v_signed_char_func" \ + "$decimal = \{signed char \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print signed char function" + +gdb_test "print v_unsigned_char_func" \ + "$decimal = \{unsigned char \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print unsigned char function" + +gdb_test "print v_short_func" \ + "$decimal = \{short \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print short function" + +gdb_test "print v_signed_short_func" \ + "$decimal = \{signed short|short \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print signed short function" + +gdb_test "print v_unsigned_short_func" \ + "$decimal = \{unsigned short \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print unsigned short function" + +gdb_test "print v_int_func" \ + "$decimal = \{int \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print int function" + +gdb_test "print v_signed_int_func" \ + "$decimal = \{signed int|int \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print signed int function" + +gdb_test "print v_unsigned_int_func" \ + "$decimal = \{unsigned int \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print unsigned int function" + +gdb_test "print v_long_func" \ + "$decimal = \{long \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print long function" + +gdb_test "print v_signed_long_func" \ + "$decimal = \{signed long|long \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print signed long function" + +gdb_test "print v_unsigned_long_func" \ + "$decimal = \{unsigned long|long \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print unsigned long function" + +if ![target_info exists no_long_long] { + gdb_test "print v_long_long_func" \ + "$decimal = \{long long \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print long long function" + + gdb_test "print v_signed_long_long_func" \ + "$decimal = \{long long \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print signed long long function" + + gdb_test "print v_unsigned_long_long_func" \ + "$decimal = \{unsigned long long \\(\\)\} 0x\[0-9a-z\]+ .*" \ + "print unsigned long long function" +} + +# Sun /bin/cc calls this a function returning double. +if {!$gcc_compiled} then {setup_xfail "*-sun-sunos4*"} + gdb_test "print v_float_func" \ + "$decimal = \{float \\(\\)\} 0x\[0-9a-z\]+.*" \ + "print float function" + + gdb_test "print v_double_func" \ + "$decimal = \{double \\(\\)\} 0x\[0-9a-z\]+.*" \ + "print double function" \ +} + +# test whatis command with functions return type +gdb_test "whatis v_char_func" \ + "type = (signed |unsigned |)char \\($void\\)" \ + "whatis char function" + +gdb_test "whatis v_signed_char_func" \ + "type = (signed |unsigned |)char \\($void\\)" \ + "whatis signed char function" + +gdb_test "whatis v_unsigned_char_func" \ + "type = unsigned char \\($void\\)" \ + "whatis unsigned char function" + +gdb_test "whatis v_short_func" \ + "type = short (int |)\\($void\\)" \ + "whatis short function" + +gdb_test "whatis v_signed_short_func" \ + "type = (signed |)short (int |)\\($void\\)" \ + "whatis signed short function" + +gdb_test "whatis v_unsigned_short_func" \ + "type = (unsigned short|short unsigned int) \\($void\\)" \ + "whatis unsigned short function" + +gdb_test "whatis v_int_func" \ + "type = int \\($void\\)" \ + "whatis int function" + +gdb_test "whatis v_signed_int_func" \ + "type = (signed |)int \\($void\\)" \ + "whatis signed int function" + +gdb_test "whatis v_unsigned_int_func" \ + "type = unsigned int \\($void\\)" \ + "whatis unsigned int function" + +gdb_test "whatis v_long_func" \ + "type = (long|int|long int) \\($void\\)" \ + "whatis long function" + +gdb_test "whatis v_signed_long_func" \ + "type = (signed |)(int|long|long int) \\($void\\)" \ + "whatis signed long function" + +gdb_test "whatis v_unsigned_long_func" \ + "type = (unsigned (int|long|long int)|long unsigned int) \\($void\\)" \ + "whatis unsigned long function" + +if ![target_info exists no_long_long] { + gdb_test "whatis v_long_long_func" \ + "type = long long(| int) \\($void\\)" \ + "whatis long long function" + + gdb_test "whatis v_signed_long_long_func" \ + "type = (signed |)long long(| int) \\($void\\)" \ + "whatis signed long long function" + + gdb_test "whatis v_unsigned_long_long_func" \ + "type = (unsigned long long(| int)|long long unsigned int) \\($void\\)" \ + "whatis unsigned long long function" +} + +# Sun /bin/cc calls this a function returning double. +if {!$gcc_compiled} then {setup_xfail "*-sun-sunos4*"} + gdb_test "whatis v_float_func" \ + "type = float \\($void\\)" \ + "whatis float function" + + gdb_test "whatis v_double_func" \ + "type = double \\($void\\)" \ + "whatis double function" \ +} diff --git a/gdb/testsuite/gdb.ctf/whatis.c b/gdb/testsuite/gdb.ctf/whatis.c new file mode 100644 index 0000000..aec899d --- /dev/null +++ b/gdb/testsuite/gdb.ctf/whatis.c @@ -0,0 +1,339 @@ +/* This test program is part of GDB, the GNU debugger. + + Copyright 1992-2021 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* + * Test file with lots of different types, for testing the + * "whatis" command. + */ + +/* + * First the basic C types. + */ + +char v_char; +signed char v_signed_char; +unsigned char v_unsigned_char; + +short v_short; +signed short v_signed_short; +unsigned short v_unsigned_short; + +int v_int; +signed int v_signed_int; +unsigned int v_unsigned_int; + +long v_long; +signed long v_signed_long; +unsigned long v_unsigned_long; + +#ifndef NO_LONG_LONG +long long v_long_long; +signed long long v_signed_long_long; +unsigned long long v_unsigned_long_long; +#endif + +float v_float; +double v_double; + +/* + * Now some derived types, which are arrays, functions-returning, + * pointers, structures, unions, and enumerations. + */ + +/**** arrays *******/ + +char v_char_array[2]; +signed char v_signed_char_array[2]; +unsigned char v_unsigned_char_array[2]; + +short v_short_array[2]; +signed short v_signed_short_array[2]; +unsigned short v_unsigned_short_array[2]; + +int v_int_array[2]; +signed int v_signed_int_array[2]; +unsigned int v_unsigned_int_array[2]; + +long v_long_array[2]; +signed long v_signed_long_array[2]; +unsigned long v_unsigned_long_array[2]; + +#ifndef NO_LONG_LONG +long long v_long_long_array[2]; +signed long long v_signed_long_long_array[2]; +unsigned long long v_unsigned_long_long_array[2]; +#endif + +float v_float_array[2]; +double v_double_array[2]; + +/**** pointers *******/ + +/* Make sure they still print as pointer to foo even there is a typedef + for that type. Test this not just for char *, which might be + a special case kludge in GDB (Unix system include files like to define + caddr_t), but for a variety of types. */ +typedef char *char_addr; +char_addr a_char_addr; +typedef unsigned short *ushort_addr; +ushort_addr a_ushort_addr; +typedef signed long *slong_addr; +slong_addr a_slong_addr; +#ifndef NO_LONG_LONG +typedef signed long long *slong_long_addr; +slong_long_addr a_slong_long_addr; +#endif + +char *v_char_pointer; +signed char *v_signed_char_pointer; +unsigned char *v_unsigned_char_pointer; + +short *v_short_pointer; +signed short *v_signed_short_pointer; +unsigned short *v_unsigned_short_pointer; + +int *v_int_pointer; +signed int *v_signed_int_pointer; +unsigned int *v_unsigned_int_pointer; + +long *v_long_pointer; +signed long *v_signed_long_pointer; +unsigned long *v_unsigned_long_pointer; + +#ifndef NO_LONG_LONG +long long *v_long_long_pointer; +signed long long *v_signed_long_long_pointer; +unsigned long long *v_unsigned_long_long_pointer; +#endif + +float *v_float_pointer; +double *v_double_pointer; + +/**** structs *******/ + +struct t_struct { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; +#ifndef NO_LONG_LONG + long long v_long_long_member; +#endif + float v_float_member; + double v_double_member; +} v_struct1, *v_struct_ptr1; + +struct { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; +#ifndef NO_LONG_LONG + long long v_long_long_member; +#endif + float v_float_member; + double v_double_member; +} v_struct2, *v_struct_ptr2; + +/**** unions *******/ + +union t_union { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; +#ifndef NO_LONG_LONG + long long v_long_long_member; +#endif + float v_float_member; + double v_double_member; +} v_union, *v_union_ptr; + +union { + char v_char_member; + short v_short_member; + int v_int_member; + long v_long_member; +#ifndef NO_LONG_LONG + long long v_long_long_member; +#endif + float v_float_member; + double v_double_member; +} v_union2, *v_union_ptr2; + +/*** Functions returning type ********/ + +char v_char_func () { return(0); } +signed char v_signed_char_func () { return (0); } +unsigned char v_unsigned_char_func () { return (0); } + +short v_short_func () { return (0); } +signed short v_signed_short_func () { return (0); } +unsigned short v_unsigned_short_func () { return (0); } + +int v_int_func () { return (0); } +signed int v_signed_int_func () { return (0); } +unsigned int v_unsigned_int_func () { return (0); } + +long v_long_func () { return (0); } +signed long v_signed_long_func () { return (0); } +unsigned long v_unsigned_long_func () { return (0); } + +#ifndef NO_LONG_LONG +long long v_long_long_func () { return (0); } +signed long long v_signed_long_long_func () { return (0); } +unsigned long long v_unsigned_long_long_func () { return (0); } +#endif + +float v_float_func () { return (0.0); } +double v_double_func () { return (0.0); } + +/**** Some misc more complicated things *******/ + +struct link { + struct link *next; +#ifdef __STDC__ + struct link *(*linkfunc) (struct link *self, int flags); +#else + struct link *(*linkfunc) (); +#endif + struct t_struct stuff[1][2][3]; +} *s_link; + +union tu_link { + struct link *next; +#ifdef __STDC__ + struct link *(*linkfunc) (struct link *self, int flags); +#else + struct link *(*linkfunc) (); +#endif + struct t_struct stuff[1][2][3]; +} u_link; + +struct outer_struct { + int outer_int; + struct inner_struct { + int inner_int; + long inner_long; + }inner_struct_instance; + union inner_union { + int inner_union_int; + long inner_union_long; + }inner_union_instance; + long outer_long; +} nested_su; + +/**** Enumerations *******/ + +enum colors {red, green, blue} color; +enum cars {chevy, ford, porsche} clunker; + +/***********/ + +int main () +{ + /* Some linkers (e.g. on AIX) remove unreferenced variables, + so make sure to reference them. */ + v_char = 0; + v_signed_char = 1; + v_unsigned_char = 2; + + v_short = 3; + v_signed_short = 4; + v_unsigned_short = 5; + + v_int = 6; + v_signed_int = 7; + v_unsigned_int = 8; + + v_long = 9; + v_signed_long = 10; + v_unsigned_long = 11; + +#ifndef NO_LONG_LONG + v_long_long = 12; + v_signed_long_long = 13; + v_unsigned_long_long = 14; +#endif + + v_float = 100.0; + v_double = 200.0; + + + v_char_array[0] = v_char; + v_signed_char_array[0] = v_signed_char; + v_unsigned_char_array[0] = v_unsigned_char; + + v_short_array[0] = v_short; + v_signed_short_array[0] = v_signed_short; + v_unsigned_short_array[0] = v_unsigned_short; + + v_int_array[0] = v_int; + v_signed_int_array[0] = v_signed_int; + v_unsigned_int_array[0] = v_unsigned_int; + + v_long_array[0] = v_long; + v_signed_long_array[0] = v_signed_long; + v_unsigned_long_array[0] = v_unsigned_long; + +#ifndef NO_LONG_LONG + v_long_long_array[0] = v_long_long; + v_signed_long_long_array[0] = v_signed_long_long; + v_unsigned_long_long_array[0] = v_unsigned_long_long; +#endif + + v_float_array[0] = v_float; + v_double_array[0] = v_double; + + v_char_pointer = &v_char; + v_signed_char_pointer = &v_signed_char; + v_unsigned_char_pointer = &v_unsigned_char; + + v_short_pointer = &v_short; + v_signed_short_pointer = &v_signed_short; + v_unsigned_short_pointer = &v_unsigned_short; + + v_int_pointer = &v_int; + v_signed_int_pointer = &v_signed_int; + v_unsigned_int_pointer = &v_unsigned_int; + + v_long_pointer = &v_long; + v_signed_long_pointer = &v_signed_long; + v_unsigned_long_pointer = &v_unsigned_long; + +#ifndef NO_LONG_LONG + v_long_long_pointer = &v_long_long; + v_signed_long_long_pointer = &v_signed_long_long; + v_unsigned_long_long_pointer = &v_unsigned_long_long; +#endif + + v_float_pointer = &v_float; + v_double_pointer = &v_double; + + color = red; + clunker = porsche; + + u_link.next = s_link; + + v_union2.v_short_member = v_union.v_short_member; + + v_struct1.v_char_member = 0; + v_struct2.v_char_member = 0; + + nested_su.outer_int = 0; + return 0; +} -- 1.8.3.1