From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by sourceware.org (Postfix) with ESMTPS id 6695E386102B for ; Tue, 27 Jul 2021 15:36:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6695E386102B Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 16RFGpAL019954; Tue, 27 Jul 2021 15:34:31 GMT Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70]) by mx0b-00069f02.pphosted.com with ESMTP id 3a234n23hs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jul 2021 15:34:29 +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 16RFFUxx079238; Tue, 27 Jul 2021 15:34:28 GMT Received: from nam11-dm6-obe.outbound.protection.outlook.com (mail-dm6nam11lp2176.outbound.protection.outlook.com [104.47.57.176]) by aserp3020.oracle.com with ESMTP id 3a2348cn64-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jul 2021 15:34:28 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Yc/oAu4KXUM/qNVlpwT77JsOAIgkn9HFJt/yGIE0nrvtL2JG8d8hqQmN7E5hEB+jw/p5a/wQkcyqqstGcoOsQhutYqmr7v0m/TF3KREukEA4hwPsdCmVIQC4IYI6EDZwcRpxQtCbD4ctdoCAobnnfWnBTHvgt9AiPCXr9fwpJtFyJlRtiFh03BDNJ7ArJjlDZKw8dZjskvOLroAFsnbI2JEUn+QnDIP77yEuKNt0jFKVheKmI708HjdXobeTrZU2g9n+Hx7PQJfrgcyCGv1Xpe1pDdYPNUaCtbAvH1ahhSXg8xTJE8upU+Wmz21yvhIs8csjpQjAFPAzBfq7CNPM4A== 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=STycAM22X+9ewwwWqrNVjZaHdKDhvZfRhcOgjfIptCs=; b=Awkzd1JBj1M7VZY1Dn0aYpqZENVPu/zJwhl9epdBTVdv5L7UEn3bErf0Gi62fIUJkBnWQCiVgQr3FCeysWQIJQHRSWC//IDBm5rboOEo0MsJno9bkf9txrCvUVHkvHnwv2CM3PpwnUz3OIeKxqhuk/7OoffAmY+wssTF/6CN8KgSicoZzxFPOlknOUL8LUz97Q+Z6hPAI3H5tNG7GFHm82omcjLPmV16OMgT9qpr3UgrfovS1dh/Ft7HbSW7hjrIvpC9199r5aKshzzy/VpjHNGE2oFGNsO78jiDsxGsP7CHqhQ1Ox8MRcdsJRqLSsoFXTkg9krK/xlgGC2m7tGsPw== 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 BYAPR10MB2888.namprd10.prod.outlook.com (2603:10b6:a03:88::32) by BY5PR10MB4244.namprd10.prod.outlook.com (2603:10b6:a03:207::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4352.28; Tue, 27 Jul 2021 15:34:26 +0000 Received: from BYAPR10MB2888.namprd10.prod.outlook.com ([fe80::5d49:ec20:468e:1b77]) by BYAPR10MB2888.namprd10.prod.outlook.com ([fe80::5d49:ec20:468e:1b77%7]) with mapi id 15.20.4352.031; Tue, 27 Jul 2021 15:34:26 +0000 From: "Jose E. Marchesi" To: Weimin Pan Cc: gdb-patches@sourceware.org, tom@tromey.com, lsix@lancelotsix.com, nick.alcock@oracle.com Subject: Re: [PATCH V7 PING 4] CTF: multi-CU and archive support References: <1626971472-1848-1-git-send-email-weimin.pan@oracle.com> Date: Tue, 27 Jul 2021 17:34:18 +0200 In-Reply-To: <1626971472-1848-1-git-send-email-weimin.pan@oracle.com> (Weimin Pan's message of "Thu, 22 Jul 2021 12:31:12 -0400") Message-ID: <87sfzz93et.fsf@oracle.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) Content-Type: text/plain X-ClientProxiedBy: LO2P265CA0096.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:8::36) To BYAPR10MB2888.namprd10.prod.outlook.com (2603:10b6:a03:88::32) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from termi.oracle.com (141.143.193.69) by LO2P265CA0096.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:8::36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4373.17 via Frontend Transport; Tue, 27 Jul 2021 15:34:24 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 721cb066-0535-45a5-0da8-08d9511403ca X-MS-TrafficTypeDiagnostic: BY5PR10MB4244: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:989; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 7oYT/Fn2edcUYEHlHCr87OoZSznbEluQKM1uANrVPNNSzdFcZM62aVz0CPE2rQKIs1qF1woHsqQurk7UB0Q/bEPRtzP+H5HZCgIsupvu5/UBm9WuEQN5EcCW6uoZIiYEe5hB3w7TsuOR0ZwRA/tZZO77/BuvWe95NTLV5N3NyVr7SL9z5Qh9ZQ/aT5ExQosActmjiq4e4/8/Wg9takLcHYhkiZVnL5jPzIwyW56b/5A7edj18uFRGoseIVnUdA7WtpzqkuSSTKINNtkfXFXxk1buN/6Lf3O9ordQU7L3jkdgGQY4yTZSZPuyJyQjN3CCMDpYZSiZBejT7SHYBdo9xSbChkkODndtoBlBwTDHcLsjInWZj6hwFih0TQdBv2XAaeLCwnoi+g1LeJ7PcG1mLitIZz8PMUufdk8kRw4SYriOAnZmrpuJk4rj5ChZNxa9ziDgUgiVQfg+T+K58S+IGiN6dcsHslDZ72T3ooAyrYlXFcqV23yQVXCYBjkjRo2QG9xKz9D3m5C+PGgYdiWtd3X87VGtoLG0rpcbnONrbmr6tuPrQ2mFeAXkNG9y/xZ4qM17gqjdeiOOPAffV/ATrpVZq4yD2/7grqINojitI/W6ANFBz3A83z2K+luo8TdnMRvQaV4FiG1DlztViBPK2faVnGZY46ZwDmUyNXI8SbR484nQhANpCHzpDRcGepubzs41R5u3wv7mem51g8z7UbTK2244ppygcTGPdz9nA9KXVcMLWjUltf2puAxksmsMhUb44NywlbwxH/VvO5aEo+GvLsDP3SyQ/2Htgz6GHj/x2Qq6q9XTallukPl52pabDiM3mOdxnquUI5ztDsfF1/XbICLPDvYirAe0eqh29wAxh87D4VEbiqpR4cYVgCW1jZrKJTF5ZkanQVlowkgbgQ== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:BYAPR10MB2888.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(346002)(366004)(136003)(396003)(376002)(39860400002)(66946007)(6636002)(2616005)(478600001)(66476007)(7696005)(6666004)(6486002)(86362001)(52116002)(37006003)(6862004)(2906002)(186003)(956004)(83380400001)(316002)(26005)(30864003)(107886003)(966005)(38100700002)(8676002)(66556008)(38350700002)(4326008)(36756003)(5660300002)(8936002)(2004002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?aRPyrGQ1entlb9ej+vQwkmgOQZXeOEtgN/moZtJ4hGqyXKWz4SzUAnpN73xL?= =?us-ascii?Q?wm2n50lcpZfJaghLp8PkyXMAoG01SIqVRwpnedXUVGa9lSgdYqPiO5JbxvEt?= =?us-ascii?Q?84g9vXa0TnrhxRohaUL7xI4t/1Gq+mrwoB6QoPericif4yipI0HZGgedlMM6?= =?us-ascii?Q?mp5Y4LudFq9f0HsVC/7eGUyu1f1PU8lxI9mTdJQCH3BkewBj6zHf59BTjfvY?= =?us-ascii?Q?vxL6RU3TcS4Ou2+5mWCE74bQ1CZndcVCb1cf02/OzvI34op8Fw0egEtMd1a4?= =?us-ascii?Q?Bn80Ddhx/sfnAJPrajI+p5WOEJA0tAPIMEkLXk8xq0zbklho+jc4HonvdKNA?= =?us-ascii?Q?ynp+KWIjfTdV4ACnQVPglQaumekr4PFe9D94/Q9vDSWJnQZyWxufsrsD7/PO?= =?us-ascii?Q?so6t+TyWR9+Nsz2ABQQbppr5UampBCgZP4MA/O2o9JpzJKCn/S0JNhqoglDg?= =?us-ascii?Q?IrecUMKocLmoPxLUU6HymSbiuaDuOdKj0vt7eU0+0UPmXUDgsDT6N4WuAMJK?= =?us-ascii?Q?7YKdrT+RyAxs4T35Z8daNEjcvkjAuip/7SEN4sqV4pM3/2iyZigpRpu9Ink+?= =?us-ascii?Q?Tf+0+Jm5fkFxm2fhogTlCCsRkwTB8C/VEudiEsm1OKkUQiJ81cu/2UyayWvq?= =?us-ascii?Q?0IzoPgY7OSJNfnYSPUqKDdwzA7QUazSlk4LF8abvddxceuNgqzw4bLD6ftJ/?= =?us-ascii?Q?szS+F9Z/HBAms3sH5rizikT7w2lfDH3jxsBO9cCTUbV018BA3o8M5Dlf8IhP?= =?us-ascii?Q?Xw9qY/TkJb+hxS+RNVHPRltfGcspF15BPR7ILMVAqsw1QRpgGHpHlGEKAfjy?= =?us-ascii?Q?wX7oWZ2Vni0vrL6SZVCRxMzS8lJkPgi0UW2G/QHFWF8efJiUdJqLBDq1t4Jg?= =?us-ascii?Q?EFX/FYlRlwiGDnbEwSU8lX8wU2yO+l4N8VZx7+H4HKclVPpZtDOn6eIa2voO?= =?us-ascii?Q?wUc3EoOyRND7KMJ2LMydaOTSLWQb9f9dSzv4bRgA9qnQnnY0MnbaKuuQaqzK?= =?us-ascii?Q?ovx5WQpeQl4kU+UkOENydAaTwnXdOS7yH9u3UkawT9tSRdhP+2lsW7z4Y7Bj?= =?us-ascii?Q?f1DjDdVGzVpA1Fw1N1M1elt2Zi2ddjqga85mkj64Pg7YDUY62o5O64L7jkY8?= =?us-ascii?Q?r129dSogOqE+jnX2S++HrjPbsEe/0Ftcnstd+DO2pYyjCis07Ob/G8HQaWFP?= =?us-ascii?Q?hUAj4dKPDsyuFSXcpzuwICn5cntG2wOi68DuJ+GlriFYT7k8GWTiy/c37XFL?= =?us-ascii?Q?OCmtfffnIy/4h7Ik1S/WEtbDv5bvdg3sV1pCIF51GpG/VGdhPDb1H5cTBCHM?= =?us-ascii?Q?cvFvkNurdzX+xkq3cZoqNraW?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 721cb066-0535-45a5-0da8-08d9511403ca X-MS-Exchange-CrossTenant-AuthSource: BYAPR10MB2888.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jul 2021 15:34:26.1271 (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: 1+dYtqkJIbQNt7DzPQ8csyN4JdXPuJuvCxm5n+6Ico5yegaJNTnIpfrjmzfMWeIcXup8uFnK71+CTiyxLszfpjUisLJEammBYQOWwRI7mC0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR10MB4244 X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=10057 signatures=668682 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 adultscore=0 suspectscore=0 malwarescore=0 spamscore=0 mlxlogscore=999 phishscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2107140000 definitions=main-2107270092 X-Proofpoint-ORIG-GUID: UV5bod1B3tiFle5UeuSwYRVAofcKRwdf X-Proofpoint-GUID: UV5bod1B3tiFle5UeuSwYRVAofcKRwdf X-Spam-Status: No, score=-11.5 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, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_BL, RCVD_IN_MSPIKE_L3, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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 Jul 2021 15:36:39 -0000 Hi people! Any chance we can get this reviewed (and hopefully committed) any time soon? GDB is the last toolchain piece to which add CTF support. Is there any particular difficulty/objection, other than everyone being very busy? :) > [Changes from V6: > - The CTF/BTF support in GCC was pushed upstream yesterday: > https://gcc.gnu.org/pipermail/gcc-patches/2021-June/573851.html. > Made the following changes after running the testsuite against it: > - Replaced -gt with -gctf. > - Fixed a type ordering difference concerning function arguments.] > > [Changes from V5: > - Remove the incorrect ctf_ref call which bumps the refcnt of a ctf_dict_t, > referring to an archive's source file. > - Change struct ctf_psymtab member to "struct ctf_context context;".] > > [Changes from V4: > - Treat CTF archives as CUs over dependencies to avoid over-expanding > psymtabs, as Tom Tromey pointed out. > - Avoid calling ctf_dict_close more than once on a dictionary.] > > Now gdb is capable of debugging executable, which consists of multiple > compilation units (CUs) with the CTF debug info. An executable could > potentially have one or more archives, which, in CTF context, contain > conflicting types. > > all changes were made in ctfread.c in which elfctf_build_psymtabs was > modified to handle archives, via the ctf archive iterator and its callback > build_ctf_archive_member and scan_partial_symbols was modified to scan > archives, which are treated as subfiles, to build the psymtabs. > > Also changes were made to handle CTF's data object section and function > info section which now share the same format of their contents - an array > of type IDs. New functions ctf_psymtab_add_stt_entries, which is called by > ctf_psymtab_add_stt_obj and ctf_psymtab_add_stt_func, and add_stt_entries, > which is called by add_stt_obj and add_stt_func when setting up psymtabs > and full symtab, respectively. > --- > gdb/ChangeLog | 16 ++ > gdb/ctfread.c | 335 +++++++++++++++++------------- > gdb/testsuite/ChangeLog | 9 + > gdb/testsuite/gdb.base/ctf-constvars.exp | 4 +- > gdb/testsuite/gdb.base/ctf-ptype.exp | 4 +- > gdb/testsuite/gdb.ctf/cross-tu-cyclic-1.c | 18 ++ > gdb/testsuite/gdb.ctf/cross-tu-cyclic-2.c | 16 ++ > gdb/testsuite/gdb.ctf/cross-tu-cyclic-3.c | 3 + > gdb/testsuite/gdb.ctf/cross-tu-cyclic-4.c | 4 + > gdb/testsuite/gdb.ctf/cross-tu-cyclic.exp | 43 ++++ > gdb/testsuite/gdb.ctf/ctf-a.c | 32 +++ > gdb/testsuite/gdb.ctf/ctf-a.h | 22 ++ > gdb/testsuite/gdb.ctf/ctf-b.c | 25 +++ > gdb/testsuite/gdb.ctf/ctf-b.h | 22 ++ > gdb/testsuite/gdb.ctf/ctf-c.c | 25 +++ > gdb/testsuite/gdb.ctf/ctf-c.h | 21 ++ > gdb/testsuite/gdb.ctf/funcreturn.exp | 4 +- > gdb/testsuite/gdb.ctf/multi.exp | 42 ++++ > gdb/testsuite/lib/gdb.exp | 4 +- > 19 files changed, 497 insertions(+), 152 deletions(-) > create mode 100644 gdb/testsuite/gdb.ctf/cross-tu-cyclic-1.c > create mode 100644 gdb/testsuite/gdb.ctf/cross-tu-cyclic-2.c > create mode 100644 gdb/testsuite/gdb.ctf/cross-tu-cyclic-3.c > create mode 100644 gdb/testsuite/gdb.ctf/cross-tu-cyclic-4.c > create mode 100644 gdb/testsuite/gdb.ctf/cross-tu-cyclic.exp > create mode 100644 gdb/testsuite/gdb.ctf/ctf-a.c > create mode 100644 gdb/testsuite/gdb.ctf/ctf-a.h > create mode 100644 gdb/testsuite/gdb.ctf/ctf-b.c > create mode 100644 gdb/testsuite/gdb.ctf/ctf-b.h > create mode 100644 gdb/testsuite/gdb.ctf/ctf-c.c > create mode 100644 gdb/testsuite/gdb.ctf/ctf-c.h > create mode 100644 gdb/testsuite/gdb.ctf/multi.exp > > diff --git a/gdb/ChangeLog b/gdb/ChangeLog > index 81e9dd5..964dc20 100644 > --- a/gdb/ChangeLog > +++ b/gdb/ChangeLog > @@ -1,3 +1,19 @@ > +2021-06-28 Weimin Pan > + > + * ctfread.c (ctf_per_tu_data): New struct. > + (add_stt_entries): New funtion. > + (add_stt_obj): Use it. > + (add_stt_func): Likewise. > + (ctf_psymtab_add_stt_entries): New function. > + (ctf_psymtab_add_stt_obj): Use it. > + (ctf_psymtab_add_stt_func): Likewise. > + (ctf_psymtab::expand_psymtab): Call expand_dependencies to expand > + archives. > + (scan_partial_symbols): Set up partial symtab list. > + (build_ctf_archive_member): New function. > + (elfctf_build_psymtabs): Call Iterater to set up archives. > + (read_func_kind_type): Handle argument's forward reference type. > + > 2021-05-16 Weimin Pan > > * ctfread.c (new_symbol): Set function address. > diff --git a/gdb/ctfread.c b/gdb/ctfread.c > index 23e859a..498c9bf 100644 > --- a/gdb/ctfread.c > +++ b/gdb/ctfread.c > @@ -117,6 +117,7 @@ struct ctf_context > struct objfile *of; > psymtab_storage *partial_symtabs; > partial_symtab *pst; > + ctf_archive_t *arc; > struct buildsym_compunit *builder; > }; > > @@ -134,7 +135,7 @@ struct ctf_psymtab : public standard_psymtab > void read_symtab (struct objfile *) override; > void expand_psymtab (struct objfile *) override; > > - struct ctf_context *context; > + struct ctf_context context; > }; > > /* The routines that read and process fields/members of a C struct, union, > @@ -166,6 +167,16 @@ struct ctf_field_info > std::vector nested_types_list; > }; > > +/* Data held for a translation unit. */ > + > +struct ctf_per_tu_data > +{ > + ctf_dict_t *fp; > + struct objfile *of; > + ctf_archive_t *arc; > + psymtab_storage *pss; > + psymbol_functions *psf; > +}; > > /* Local function prototypes */ > > @@ -245,10 +256,8 @@ struct ctf_tid_and_type > ids.tid = tid; > ids.type = typ; > slot = (struct ctf_tid_and_type **) htab_find_slot (htab, &ids, INSERT); > - if (*slot) > - complaint (_("An internal GDB problem: ctf_ id_t %ld type already set"), > - (tid)); > - *slot = XOBNEW (&of->objfile_obstack, struct ctf_tid_and_type); > + if (*slot == nullptr) > + *slot = XOBNEW (&of->objfile_obstack, struct ctf_tid_and_type); > **slot = ids; > return typ; > } > @@ -510,7 +519,7 @@ struct ctf_tid_and_type > break; > } > > - add_symbol_to_list (sym, ccp->builder->get_global_symbols ()); > + add_symbol_to_list (sym, ccp->builder->get_file_symbols ()); > } > > return sym; > @@ -706,6 +715,8 @@ struct ctf_tid_and_type > for (int iparam = 0; iparam < argc; iparam++) > { > atype = get_tid_type (of, argv[iparam]); > + if (atype == nullptr) /* A forward reference type? */ > + atype = read_type_record (ccp, argv[iparam]); > if (atype != nullptr) > type->field (iparam).set_type (atype); > else > @@ -1140,10 +1151,11 @@ struct ctf_tid_and_type > case CTF_K_CONST: > case CTF_K_POINTER: > case CTF_K_ARRAY: > - if (type) > + if (type != nullptr) > { > sym = new_symbol (ccp, type, id); > - sym->compute_and_set_names (name, false, ccp->of->per_bfd); > + if (sym != nullptr) > + sym->compute_and_set_names (name, false, ccp->of->per_bfd); > } > break; > case CTF_K_STRUCT: > @@ -1160,7 +1172,7 @@ struct ctf_tid_and_type > SYMBOL_DOMAIN (sym) = VAR_DOMAIN; > SYMBOL_ACLASS_INDEX (sym) = LOC_OPTIMIZED_OUT; > sym->compute_and_set_names (name, false, ccp->of->per_bfd); > - add_symbol_to_list (sym, ccp->builder->get_global_symbols ()); > + add_symbol_to_list (sym, ccp->builder->get_file_symbols ()); > break; > default: > complaint (_("ctf_add_var_cb: kind unsupported (%d)"), kind); > @@ -1173,81 +1185,48 @@ struct ctf_tid_and_type > return 0; > } > > -/* Add an ELF STT_OBJ symbol with index IDX to the symbol table. */ > +/* Add entries in either data objects or function info section, controlled > + by FUNCTIONS. */ > > -static struct symbol * > -add_stt_obj (struct ctf_context *ccp, unsigned long idx) > +static void > +add_stt_entries (struct ctf_context *ccp, int functions) > { > - struct symbol *sym; > - struct type *type; > + ctf_next_t *i = nullptr; > + const char *tname; > ctf_id_t tid; > + struct symbol *sym = nullptr; > + struct type *type; > > - if ((tid = ctf_lookup_by_symbol (ccp->fp, idx)) == CTF_ERR) > - return nullptr; > - > - type = fetch_tid_type (ccp, tid); > - if (type == nullptr) > - return nullptr; > - > - sym = new_symbol (ccp, type, tid); > - > - return sym; > + while ((tid = ctf_symbol_next (ccp->fp, &i, &tname, functions)) != CTF_ERR) > + { > + type = get_tid_type (ccp->of, tid); > + if (type == nullptr) > + continue; > + sym = new (&ccp->of->objfile_obstack) symbol; > + OBJSTAT (ccp->of, n_syms++); > + SYMBOL_TYPE (sym) = type; > + SYMBOL_DOMAIN (sym) = VAR_DOMAIN; > + SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC; > + sym->compute_and_set_names (tname, false, ccp->of->per_bfd); > + add_symbol_to_list (sym, ccp->builder->get_global_symbols ()); > + set_symbol_address (ccp->of, sym, tname); > + } > } > > -/* Add an ELF STT_FUNC symbol with index IDX to the symbol table. */ > +/* Add entries in data objects section. */ > > -static struct symbol * > -add_stt_func (struct ctf_context *ccp, unsigned long idx) > +static void > +add_stt_obj (struct ctf_context *ccp) > { > - struct type *ftype, *atyp, *rettyp; > - struct symbol *sym; > - ctf_funcinfo_t finfo; > - ctf_id_t argv[32]; > - uint32_t argc; > - ctf_id_t tid; > - struct type *void_type = objfile_type (ccp->of)->builtin_void; > - > - if (ctf_func_info (ccp->fp, idx, &finfo) == CTF_ERR) > - return nullptr; > - > - argc = finfo.ctc_argc; > - 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) > - return nullptr; > - > - tid = ctf_lookup_by_symbol (ccp->fp, idx); > - ftype = fetch_tid_type (ccp, tid); > - if ((finfo.ctc_flags & CTF_FUNC_VARARG) != 0) > - ftype->set_has_varargs (true); > - ftype->set_num_fields (argc); > - > - /* If argc is 0, it has a "void" type. */ > - if (argc != 0) > - ftype->set_fields > - ((struct field *) TYPE_ZALLOC (ftype, argc * sizeof (struct field))); > - > - /* TYPE_FIELD_TYPE must never be NULL. Fill it with void_type, if failed > - to find the argument type. */ > - for (int iparam = 0; iparam < argc; iparam++) > - { > - atyp = fetch_tid_type (ccp, argv[iparam]); > - if (atyp) > - ftype->field (iparam).set_type (atyp); > - else > - ftype->field (iparam).set_type (void_type); > - } > + add_stt_entries (ccp, 0); > +} > > - sym = new_symbol (ccp, ftype, tid); > - rettyp = fetch_tid_type (ccp, finfo.ctc_return); > - if (rettyp != nullptr) > - SYMBOL_TYPE (sym) = rettyp; > - else > - SYMBOL_TYPE (sym) = void_type; > +/* Add entries in function info section. */ > > - return sym; > +static void > +add_stt_func (struct ctf_context *ccp) > +{ > + add_stt_entries (ccp, 1); > } > > /* Get text segment base for OBJFILE, TSIZE contains the segment size. */ > @@ -1271,7 +1250,7 @@ struct ctf_tid_and_type > { > struct ctf_context *ccp; > > - ccp = pst->context; > + ccp = &pst->context; > ccp->builder = new buildsym_compunit > (of, of->original_name, nullptr, > language_c, text_offset); > @@ -1288,7 +1267,7 @@ struct ctf_tid_and_type > { > struct ctf_context *ccp; > > - ccp = pst->context; > + ccp = &pst->context; > struct compunit_symtab *result > = ccp->builder->end_symtab (end_addr, section); > delete ccp->builder; > @@ -1317,17 +1296,76 @@ struct ctf_tid_and_type > ctf_errmsg (ctf_errno (ccp->fp))); > } > > +/* Add entries in either data objects or function info section, controlled > + by FUNCTIONS, to psymtab. */ > + > +static void > +ctf_psymtab_add_stt_entries (ctf_dict_t *cfp, ctf_psymtab *pst, > + struct objfile *of, int functions) > +{ > + ctf_next_t *i = nullptr; > + ctf_id_t tid; > + const char *tname; > + > + while ((tid = ctf_symbol_next (cfp, &i, &tname, functions)) != CTF_ERR) > + { > + uint32_t kind = ctf_type_kind (cfp, tid); > + address_class aclass; > + domain_enum tdomain; > + switch (kind) > + { > + case CTF_K_STRUCT: > + case CTF_K_UNION: > + case CTF_K_ENUM: > + tdomain = STRUCT_DOMAIN; > + break; > + default: > + tdomain = VAR_DOMAIN; > + break; > + } > + > + if (kind == CTF_K_FUNCTION) > + aclass = LOC_STATIC; > + else if (kind == CTF_K_CONST) > + aclass = LOC_CONST; > + else > + aclass = LOC_TYPEDEF; > + > + pst->add_psymbol (tname, true, > + tdomain, aclass, -1, > + psymbol_placement::GLOBAL, > + 0, language_c, pst->context.partial_symtabs, of); > + } > +} > + > +/* Add entries in data objects section to psymtab. */ > + > +static void > +ctf_psymtab_add_stt_obj (ctf_dict_t *cfp, ctf_psymtab *pst, > + struct objfile *of) > +{ > + ctf_psymtab_add_stt_entries (cfp, pst, of, 0); > +} > + > +/* Add entries in function info section to psymtab. */ > + > +static void > +ctf_psymtab_add_stt_func (ctf_dict_t *cfp, ctf_psymtab *pst, > + struct objfile *of) > +{ > + ctf_psymtab_add_stt_entries (cfp, pst, of, 1); > +} > + > /* Read in full symbols for PST, and anything it depends on. */ > > void > ctf_psymtab::expand_psymtab (struct objfile *objfile) > { > - struct symbol *sym; > struct ctf_context *ccp; > > gdb_assert (!readin); > > - ccp = context; > + ccp = &context; > > /* Iterate over entries in data types section. */ > if (ctf_type_iter (ccp->fp, ctf_add_type_cb, ccp) == CTF_ERR) > @@ -1341,21 +1379,8 @@ struct ctf_tid_and_type > ctf_errmsg (ctf_errno (ccp->fp))); > > /* Add entries in data objects and function info sections. */ > - for (unsigned long i = 0; ; i++) > - { > - sym = add_stt_obj (ccp, i); > - if (sym == nullptr) > - { > - if (ctf_errno (ccp->fp) == EINVAL > - || ctf_errno (ccp->fp) == ECTF_NOSYMTAB) > - break; > - sym = add_stt_func (ccp, i); > - } > - if (sym == nullptr) > - continue; > - > - set_symbol_address (ccp->of, sym, sym->linkage_name ()); > - } > + add_stt_obj (ccp); > + add_stt_func (ccp); > > readin = true; > } > @@ -1409,6 +1434,7 @@ struct ctf_tid_and_type > > static ctf_psymtab * > create_partial_symtab (const char *name, > + ctf_archive_t *arc, > ctf_dict_t *cfp, > psymtab_storage *partial_symtabs, > struct objfile *objfile) > @@ -1418,13 +1444,11 @@ struct ctf_tid_and_type > > pst = new ctf_psymtab (name, partial_symtabs, objfile->per_bfd, 0); > > - ccx = XOBNEW (&objfile->objfile_obstack, struct ctf_context); > - ccx->fp = cfp; > - ccx->of = objfile; > - ccx->partial_symtabs = partial_symtabs; > - ccx->pst = pst; > - ccx->builder = nullptr; > - pst->context = ccx; > + pst->context.arc = arc; > + pst->context.fp = cfp; > + pst->context.of = objfile; > + pst->context.partial_symtabs = partial_symtabs; > + pst->context.pst = pst; > > return pst; > } > @@ -1486,7 +1510,7 @@ struct ctf_tid_and_type > > ccp->pst->add_psymbol (name, false, > domain, aclass, section, > - psymbol_placement::GLOBAL, > + psymbol_placement::STATIC, > 0, language_c, ccp->partial_symtabs, ccp->of); > > return 0; > @@ -1506,18 +1530,46 @@ struct ctf_tid_and_type > return 0; > } > > +/* Start a subfile for CTF. FNAME is the name of the archive. */ > + > +static void > +ctf_start_archive (struct ctf_context *ccx, struct objfile *of, > + const char *fname) > +{ > + if (ccx->builder == nullptr) > + { > + ccx->builder = new buildsym_compunit (of, > + of->original_name, nullptr, language_c, 0); > + ccx->builder->record_debugformat ("ctf"); > + } > + ccx->builder->start_subfile (fname); > +} > + > /* Setup partial_symtab's describing each source file for which > debugging information is available. */ > > static void > scan_partial_symbols (ctf_dict_t *cfp, psymtab_storage *partial_symtabs, > - struct objfile *of) > + struct ctf_per_tu_data *tup, const char *fname) > { > - bfd *abfd = of->obfd; > - const char *name = bfd_get_filename (abfd); > - ctf_psymtab *pst = create_partial_symtab (name, cfp, partial_symtabs, of); > + struct objfile *of = tup->of; > + bool isparent = false; > + > + if (strcmp (fname, ".ctf") == 0) > + { > + fname = bfd_get_filename (of->obfd); > + isparent = true; > + } > > - struct ctf_context *ccx = pst->context; > + ctf_psymtab *pst = create_partial_symtab (fname, tup->arc, cfp, > + partial_symtabs, of); > + > + struct ctf_context *ccx = &pst->context; > + if (isparent == false) > + { > + ctf_start_archive (ccx, of, fname); > + ccx->pst = pst; > + } > > if (ctf_type_iter (cfp, ctf_psymtab_type_cb, ccx) == CTF_ERR) > complaint (_("ctf_type_iter scan_partial_symbols failed - %s"), > @@ -1530,46 +1582,33 @@ struct ctf_tid_and_type > /* Scan CTF object and function sections which correspond to each > STT_FUNC or STT_OBJECT entry in the symbol table, > pick up what init_symtab has done. */ > - for (unsigned long idx = 0; ; idx++) > - { > - ctf_id_t tid; > - if ((tid = ctf_lookup_by_symbol (cfp, idx)) == CTF_ERR) > - { > - if (ctf_errno (cfp) == EINVAL || ctf_errno (cfp) == ECTF_NOSYMTAB) > - break; // Done, reach end of the section. > - else > - continue; > - } > - const char *tname = ctf_type_name_raw (cfp, tid); > - uint32_t kind = ctf_type_kind (cfp, tid); > - address_class aclass; > - domain_enum tdomain; > - switch (kind) > - { > - case CTF_K_STRUCT: > - case CTF_K_UNION: > - case CTF_K_ENUM: > - tdomain = STRUCT_DOMAIN; > - break; > - default: > - tdomain = VAR_DOMAIN; > - break; > - } > + ctf_psymtab_add_stt_obj (cfp, pst, of); > + ctf_psymtab_add_stt_func (cfp, pst, of); > > - if (kind == CTF_K_FUNCTION) > - aclass = LOC_STATIC; > - else if (kind == CTF_K_CONST) > - aclass = LOC_CONST; > - else > - aclass = LOC_TYPEDEF; > + pst->end (); > +} > > - pst->add_psymbol (tname, false, > - tdomain, aclass, -1, > - psymbol_placement::STATIC, > - 0, language_c, partial_symtabs, of); > +/* Callback to build the psymtab for archive member NAME. */ > + > +static int > +build_ctf_archive_member (ctf_dict_t *ctf, const char *name, void *arg) > +{ > + struct ctf_per_tu_data *tup = (struct ctf_per_tu_data *) arg; > + ctf_dict_t *parent = tup->fp; > + > + if (strcmp (name, ".ctf") != 0) > + ctf_import (ctf, parent); > + > + if (info_verbose) > + { > + printf_filtered (_("Scanning archive member %s..."), name); > + gdb_flush (gdb_stdout); > } > > - pst->end (); > + psymtab_storage *pss = tup->psf->get_partial_symtabs ().get (); > + scan_partial_symbols (ctf, pss, tup, name); > + > + return 0; > } > > /* Read CTF debugging information from a BFD section. This is > @@ -1579,6 +1618,7 @@ struct ctf_tid_and_type > void > elfctf_build_psymtabs (struct objfile *of) > { > + struct ctf_per_tu_data pcu; > bfd *abfd = of->obfd; > int err; > > @@ -1593,10 +1633,17 @@ struct ctf_tid_and_type > bfd_get_filename (abfd), ctf_errmsg (err)); > ctf_dict_key.emplace (of, fp); > > + pcu.fp = fp; > + pcu.of = of; > + pcu.arc = arc; > + > psymbol_functions *psf = new psymbol_functions (); > - psymtab_storage *partial_symtabs = psf->get_partial_symtabs ().get (); > of->qf.emplace_front (psf); > - scan_partial_symbols (fp, partial_symtabs, of); > + pcu.psf = psf; > + > + if (ctf_archive_iter (arc, build_ctf_archive_member, &pcu) < 0) > + error (_("ctf_archive_iter failed in input file %s: - %s"), > + bfd_get_filename (abfd), ctf_errmsg (err)); > } > > #else > diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog > index 0a8e5b2..5ab13bf 100644 > --- a/gdb/testsuite/ChangeLog > +++ b/gdb/testsuite/ChangeLog > @@ -1,3 +1,12 @@ > +2021-06-28 Weimin Pan > + > + * gdb.ctf/cross-tu-cyclic.exp: New file. > + * gdb.ctf/multi.exp: New file. > + * gdb.base/ctf-constvars.exp: Replace -gt with -gctf. > + * gdb.base/ctf-ptype.exp: Likewise. > + * gdb.ctf/funcreturn.exp: Likewise. > + * lib/gdb.exp: Likewise. > + > 2021-05-16 Weimin Pan > > * gdb.ctf/funcreturn.exp: New file. > diff --git a/gdb/testsuite/gdb.base/ctf-constvars.exp b/gdb/testsuite/gdb.base/ctf-constvars.exp > index 6e9210f..2e57ea0 100644 > --- a/gdb/testsuite/gdb.base/ctf-constvars.exp > +++ b/gdb/testsuite/gdb.base/ctf-constvars.exp > @@ -31,8 +31,8 @@ if [skip_ctf_tests] { > > standard_testfile .c > > -# Using `-gt` generates full-fledged CTF debug information. > -set opts "additional_flags=-gt" > +# Using `-gctf` generates full-fledged CTF debug information. > +set opts "additional_flags=-gctf" > if { [prepare_for_testing "failed to prepare" ${testfile} \ > [list $srcfile] [list $opts nowarnings]] } { > return 0 > diff --git a/gdb/testsuite/gdb.base/ctf-ptype.exp b/gdb/testsuite/gdb.base/ctf-ptype.exp > index 7dd6d95..a756edc 100644 > --- a/gdb/testsuite/gdb.base/ctf-ptype.exp > +++ b/gdb/testsuite/gdb.base/ctf-ptype.exp > @@ -22,8 +22,8 @@ if [skip_ctf_tests] { > > standard_testfile .c > > -# Using `-gt` generates full-fledged CTF debug information. > -set opts "additional_flags=-gt" > +# Using `-gctf` generates full-fledged CTF debug information. > +set opts "additional_flags=-gctf" > > if { [prepare_for_testing "failed to prepare" ${testfile} \ > [list $srcfile] [list $opts nowarnings]] } { > diff --git a/gdb/testsuite/gdb.ctf/cross-tu-cyclic-1.c b/gdb/testsuite/gdb.ctf/cross-tu-cyclic-1.c > new file mode 100644 > index 0000000..fe52b9e > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/cross-tu-cyclic-1.c > @@ -0,0 +1,18 @@ > +struct A; > +struct B > +{ > + int foo; > + struct A *bar; > +}; > + > +struct A > +{ > + long a; > + struct B *foo; > +}; > + > +static struct A *foo __attribute__((used)); > + > +int main() > +{ > +} > diff --git a/gdb/testsuite/gdb.ctf/cross-tu-cyclic-2.c b/gdb/testsuite/gdb.ctf/cross-tu-cyclic-2.c > new file mode 100644 > index 0000000..aa2d177 > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/cross-tu-cyclic-2.c > @@ -0,0 +1,16 @@ > +struct B; > +struct A > +{ > + long a; > + struct B *foo; > + struct C *bar; > +}; > + > +struct C > +{ > + struct B *foo; > + int b; > +}; > + > +static struct C *foo __attribute__((used)); > +static struct A *bar __attribute__((used)); > diff --git a/gdb/testsuite/gdb.ctf/cross-tu-cyclic-3.c b/gdb/testsuite/gdb.ctf/cross-tu-cyclic-3.c > new file mode 100644 > index 0000000..19947e8 > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/cross-tu-cyclic-3.c > @@ -0,0 +1,3 @@ > +struct A { struct B *foo; }; > +static struct A *a __attribute__((__used__)); > +static struct A *conflicty __attribute__((__used__)); > diff --git a/gdb/testsuite/gdb.ctf/cross-tu-cyclic-4.c b/gdb/testsuite/gdb.ctf/cross-tu-cyclic-4.c > new file mode 100644 > index 0000000..6e0c957 > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/cross-tu-cyclic-4.c > @@ -0,0 +1,4 @@ > +struct A { struct B *foo; }; > +struct B { struct B *next; }; > +static struct A *a __attribute__((__used__)); > +static struct B *conflicty __attribute__((__used__)); > diff --git a/gdb/testsuite/gdb.ctf/cross-tu-cyclic.exp b/gdb/testsuite/gdb.ctf/cross-tu-cyclic.exp > new file mode 100644 > index 0000000..f617f1b > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/cross-tu-cyclic.exp > @@ -0,0 +1,43 @@ > +# 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 . > + > +# This file is a subset of ptype.exp written by Rob Savoye. (rob@cygnus.com) > + > +if [skip_ctf_tests] { > + unsupported "no CTF debug format support, or CTF disabled in GDB" > + return 0 > +} > + > +standard_testfile cross-tu-cyclic-1.c cross-tu-cyclic-2.c \ > + cross-tu-cyclic-3.c cross-tu-cyclic-4.c > + > +# Using `-gctf` generates full-fledged CTF debug information. > +set opts "additional_flags=-gctf -Wl,--export-dynamic" > +if { [prepare_for_testing "failed to prepare" ${testfile} \ > + [list $srcfile $srcfile2 $srcfile3 $srcfile4] \ > + [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 > +} > + > +# Same thing with struct and union. > +gdb_test "ptype struct A" "type = struct A \{\[\r\n\]+\[ \t\]+struct B \\*foo;\[\r\n\]+\}.*" "ptype structure A" > +gdb_test "ptype struct B" "type = struct B \{\[\r\n\]+\[ \t\]+struct B \\*next;\[\r\n\]+\}.*" "ptype structure B" > +gdb_test "ptype struct C" "type = struct C \{\[\r\n\]+\[ \t\]+struct B \\*foo;\[\r\n\]+\[ \t\]+int b;\[\r\n\]+\}.*" "ptype structure C" > diff --git a/gdb/testsuite/gdb.ctf/ctf-a.c b/gdb/testsuite/gdb.ctf/ctf-a.c > new file mode 100644 > index 0000000..9aa2a8f > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/ctf-a.c > @@ -0,0 +1,32 @@ > +/* This test program is part of GDB, the GNU debugger. > + > + 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 . */ > + > +#include "ctf-a.h" > + > +static struct A a __attribute__((used)); > + > +extern struct C *foo (); > +extern int bar (); > + > +int main () > +{ > + struct C *cp; > + cp = foo (); > + if (cp) > + return bar (); > + return 0; > +} > diff --git a/gdb/testsuite/gdb.ctf/ctf-a.h b/gdb/testsuite/gdb.ctf/ctf-a.h > new file mode 100644 > index 0000000..297d740 > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/ctf-a.h > @@ -0,0 +1,22 @@ > +/* This test program is part of GDB, the GNU debugger. > + > + 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 . */ > + > +struct A { > + struct B *b; > + struct A *next; > +}; > + > diff --git a/gdb/testsuite/gdb.ctf/ctf-b.c b/gdb/testsuite/gdb.ctf/ctf-b.c > new file mode 100644 > index 0000000..c3a8ce5 > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/ctf-b.c > @@ -0,0 +1,25 @@ > +/* This test program is part of GDB, the GNU debugger. > + > + 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 . */ > + > +#include "ctf-b.h" > + > +static struct B b __attribute__((used)); > + > +int bar () > +{ > + return b.wombat; > +} > diff --git a/gdb/testsuite/gdb.ctf/ctf-b.h b/gdb/testsuite/gdb.ctf/ctf-b.h > new file mode 100644 > index 0000000..9dbdd7d > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/ctf-b.h > @@ -0,0 +1,22 @@ > +/* This test program is part of GDB, the GNU debugger. > + > + 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 . */ > + > +struct B { > + struct C *c; > + int wombat; > +}; > + > diff --git a/gdb/testsuite/gdb.ctf/ctf-c.c b/gdb/testsuite/gdb.ctf/ctf-c.c > new file mode 100644 > index 0000000..b4051b3 > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/ctf-c.c > @@ -0,0 +1,25 @@ > +/* This test program is part of GDB, the GNU debugger. > + > + 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 . */ > + > +#include "ctf-c.h" > + > +static struct C c __attribute__((used)); > + > +struct C * foo () > +{ > + return &c; > +} > diff --git a/gdb/testsuite/gdb.ctf/ctf-c.h b/gdb/testsuite/gdb.ctf/ctf-c.h > new file mode 100644 > index 0000000..fb18157 > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/ctf-c.h > @@ -0,0 +1,21 @@ > +/* This test program is part of GDB, the GNU debugger. > + > + 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 . */ > + > +struct C { > + struct A *a; > + int b; > +}; > diff --git a/gdb/testsuite/gdb.ctf/funcreturn.exp b/gdb/testsuite/gdb.ctf/funcreturn.exp > index 874160e..4443c2d 100644 > --- a/gdb/testsuite/gdb.ctf/funcreturn.exp > +++ b/gdb/testsuite/gdb.ctf/funcreturn.exp > @@ -26,8 +26,8 @@ if [target_info exists no_long_long] { > > standard_testfile whatis.c > > -# Using `-gt` generates full-fledged CTF debug information. > -set opts "additional_flags=-gt -Wl,--export-dynamic" > +# Using `-gctf` generates full-fledged CTF debug information. > +set opts "additional_flags=-gctf -Wl,--export-dynamic" > > if { [prepare_for_testing "failed to prepare" ${testfile} \ > [list $srcfile] [list $opts nowarnings]] } { > diff --git a/gdb/testsuite/gdb.ctf/multi.exp b/gdb/testsuite/gdb.ctf/multi.exp > new file mode 100644 > index 0000000..fbed20e > --- /dev/null > +++ b/gdb/testsuite/gdb.ctf/multi.exp > @@ -0,0 +1,42 @@ > +# 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 . > + > +# This file is a subset of ptype.exp written by Rob Savoye. (rob@cygnus.com) > + > +if [skip_ctf_tests] { > + unsupported "no CTF debug format support, or CTF disabled in GDB" > + return 0 > +} > + > +standard_testfile ctf-a.c ctf-b.c ctf-c.c > + > +# Using `-gctf` generates full-fledged CTF debug information. > +set opts "additional_flags=-gctf -Wl,--export-dynamic" > +if { [prepare_for_testing "failed to prepare" ${testfile} \ > + [list $srcfile $srcfile2 $srcfile3] \ > + [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 > +} > + > +# Same thing with struct and union. > +gdb_test "ptype struct A" "type = struct A \{\[\r\n\]+\[ \t\]+struct B \\*b;\[\r\n\]+\[ \t\]+struct A \\*next;\[\r\n\]+\}.*" "ptype structure A" > +gdb_test "ptype struct B" "type = struct B \{\[\r\n\]+\[ \t\]+struct C \\*c;\[\r\n\]+\[ \t\]+int \\wombat;\[\r\n\]+\}.*" "ptype structure B" > +gdb_test "ptype struct C" "type = struct C \{\[\r\n\]+\[ \t\]+struct A \\*a;\[\r\n\]+\[ \t\]+int b;\[\r\n\]+\}.*" "ptype structure C" > diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp > index 36a5fd4..412724d 100644 > --- a/gdb/testsuite/lib/gdb.exp > +++ b/gdb/testsuite/lib/gdb.exp > @@ -7449,7 +7449,7 @@ proc cmp_file_string { file str msg } { > } > } > > -# Does the compiler support CTF debug output using '-gt' compiler > +# Does the compiler support CTF debug output using '-gctf' compiler > # flag? If not then we should skip these tests. We should also > # skip them if libctf was explicitly disabled. > > @@ -7464,7 +7464,7 @@ gdb_caching_proc skip_ctf_tests { > int main () { > return 0; > } > - } executable "additional_flags=-gt"] > + } executable "additional_flags=-gctf"] > > return [expr {!$can_ctf}] > }