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 536E9385742A for ; Mon, 12 Jul 2021 22:07:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 536E9385742A 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 16CLvFuk026414; Mon, 12 Jul 2021 22:05:08 GMT Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70]) by mx0b-00069f02.pphosted.com with ESMTP id 39rnxdh71e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 12 Jul 2021 22:05:08 +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 16CLsdFv035444; Mon, 12 Jul 2021 22:05:07 GMT Received: from nam10-bn7-obe.outbound.protection.outlook.com (mail-bn7nam10lp2101.outbound.protection.outlook.com [104.47.70.101]) by aserp3020.oracle.com with ESMTP id 39q3c8tgba-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 12 Jul 2021 22:05:06 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IdPSJiA4Iktvj2Yi+k5ODqm7f98mnCN1JHaDwuwQ+y7NR9X2bpRFkEGXejyASAuHgb/7Ne/M4r4gkhMmU2PqRL5+msPXKjZpQ7Psaxk8JzAD6V3l9ONYs79H2Il0FqNHcuRJAN4+vkzBZSsrt2B94QfIXZPIA+wtv/u1UiA42zf2lJXGJlwDXvzInvFRdChZnnP13qaDEHeCSkk8D7YTaKBfsSQ+RCe/y1k1sGpAYwW3CA1YZPLqI3+EB05TSmw+S/tEPEOm9VPzYknC9BS1SrBWaH09i59uk8/z+YwVSgCQqMlAMXK0A95SfvJYUGKN7juc/eMhSnRn3hlp64gUPw== 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=F7OERVu9HsabDo4UXmK4C9aQ4ezlpqnGoL5aAUgqr+0=; b=hI2EVcrUyKNxUbzey01kberyhS3uGQP5aJQl17TqUmZu3Vq+0JpEI2Lj9IWyio4h8FiA8tZYTB2C4vfRynDQ8i2Y1jftigtd3KTytyyRpaIRv6ldHeRUKsQoajaBt91yFmWbYw1zEoQBWvsSYz5aYt9m5uElF78i+U5Try02sXbkUWtqp/lolNm99twFjRS35iwH2WJE5reAbU6lG8RsrtLZSJ+TWDsqBGnedAW1gp/bvoldY6l8NDFn2jxepO+GA1d6PU8L5MLmMNlpVEVVP/wVNq7+GtwO/1rBOb85zcytU3dWiDrMK588TbujHbkELBTXQ4NDXXSCeZvRCEYDog== 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 BN8PR10MB3396.namprd10.prod.outlook.com (2603:10b6:408:c5::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4308.21; Mon, 12 Jul 2021 22:05:04 +0000 Received: from BN6PR10MB1748.namprd10.prod.outlook.com ([fe80::ece6:fc47:e567:4335]) by BN6PR10MB1748.namprd10.prod.outlook.com ([fe80::ece6:fc47:e567:4335%7]) with mapi id 15.20.4308.026; Mon, 12 Jul 2021 22:05:04 +0000 Subject: [PING 3][PATCH V7] CTF: multi-CU and archive support To: gdb-patches@sourceware.org References: <1625009490-2088-1-git-send-email-weimin.pan@oracle.com> <88d4ff85-9642-9648-088a-47ccd30ec024@oracle.com> <6f12de99-4898-cb5e-ba1d-710e3b7bcea0@oracle.com> Cc: tom@tromey.com, jose.marchesi@oracle.com, lsix@lancelotsix.com, nick.alcock@oracle.com From: Wei-min Pan Message-ID: <5da0593c-35e5-e4ec-fbd2-1dd7dedac1bd@oracle.com> Date: Mon, 12 Jul 2021 15:05:01 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 In-Reply-To: <6f12de99-4898-cb5e-ba1d-710e3b7bcea0@oracle.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-ClientProxiedBy: SA9PR10CA0005.namprd10.prod.outlook.com (2603:10b6:806:a7::10) To BN6PR10MB1748.namprd10.prod.outlook.com (2603:10b6:405:9::16) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [IPv6:2600:1700:e320:43f0:d1be:9e22:cfd7:1fe4] (2600:1700:e320:43f0:d1be:9e22:cfd7:1fe4) by SA9PR10CA0005.namprd10.prod.outlook.com (2603:10b6:806:a7::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4308.20 via Frontend Transport; Mon, 12 Jul 2021 22:05:03 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5339a57f-001e-4a69-0eae-08d9458119e4 X-MS-TrafficTypeDiagnostic: BN8PR10MB3396: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:626; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: x0eC4O9TBdQqRiOD55KvHs0I8nQBAPG2aBnDhAt+v9vKhltAc4jSZ+g5RPT0x9KuWBfaJsPFm7EaIRU5l4HmLbOVSeHv8VUveVoPs2GvMGp6X9kHBdGxr/L/audxIGq1aBZnszmVjPtWh24fzO0VvkTaAHoOThY+vJuDzbonKddo4r6Xln8py2UYj/fD/mmRV8yKFmwQvpv4zEOfGewbjo9pzowh6adKHLfqcW+PeAMeV9Q4NwsJuPnzpyYRmbXARX7J+PdehG5BeXZteR+SSXsChrRLWKaBQV83O0VnTFt3sNQuSAU1eH6XjykblpyPIi24fSLLT5e1SjRroLpwU53K5Z2ODnwgOKiq7VaxPWkb25nd0HPdpUASbQGO5f6FKulXE1B+SnO8KJiCyXRCf/N4UYDX235e/+afviWYBizuvgSec9Gh/pPY/8O1GpUNRVylhuz1Lt4qftwf1WDqxvdJchjDBRGfqEbhmEjyFWImTyfdleBYa4Lai4eT1PppX3vh0JNrGaRoTj3YmOMMFOqNa6cC7siLpufqWt8aIw4u2ffjyAXGSHArJNqq78urI22GNP7IfSWzDylEET8TY6szDjXaoqVyGXswTJCYhF0X/um0gM7IHGzr66LedthnhGFwCCwavRuFm/J+dznaGXCQLWoAQdSfnIKviYHu9mT6j2vJhyhqhjwYuXTyoajM2k0Fy63G+5+VYrxR9+J+8y2HNPiSr9yxJSOnWdqrurzRLXVlp3s38E9Dza88Bavzy00/nSqFKM8PdnaS7/72HWHU/Q75/drEMpkjhGbMJV4dlxUKmvJMQBLTb7MXTv8quExjfstXf0XyYG5Ob+3BW0xNuPChWQHyW9VwmEAPaY/sZpLYOZ9aDt7dsPL5E5MFRl43AmRhw7xT64prsvyiTHoYxrI01fABwxHJdZRNfBwnepzEFt9peqalBRav3da1 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:(396003)(376002)(366004)(39860400002)(136003)(346002)(478600001)(6916009)(4326008)(86362001)(107886003)(5660300002)(30864003)(8936002)(8676002)(31686004)(38100700002)(66476007)(66946007)(66556008)(52116002)(186003)(53546011)(316002)(31696002)(966005)(83380400001)(6486002)(2906002)(2616005)(36756003)(2004002)(45980500001)(43740500002)(579004); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MC9sdWFSQ2ljZTVoZVQrbWZkTFN0blJPK3RaUHdGaStnVGhnbVF3dVQ3b2tJ?= =?utf-8?B?UWhJditOeXFSVnJSRkl3bHNRR21wU2lmTFY4bjBYVzREZ1N6ZzdwaFJuY3ND?= =?utf-8?B?S2REMXFqckIzcVNnVFNtK045SnZRWitjbVFzT2FWTVkwTzlQL3k5b1J1OWlk?= =?utf-8?B?UmR1WXNkS0J1QTU3ZE1tazVaR0dNc3FHTjRtK2RrQnRIcUdNeFB5VmdVeTg3?= =?utf-8?B?dUVvSkE3R1ozUWViK3YrcGI4cTY5NStZVDFvRFZNOTluMTViL21ndE02YVFj?= =?utf-8?B?Q2hVTzEyZkhXWHhkZ2dPWWkxREdWekl3YitSeU9zZ0lNSG5YOTdZblMvbmhB?= =?utf-8?B?Q3V0RktuczQ0YitjQUdmMzQ1a1dOOG5HaXJvVUt6Q1VjcWZ5MWw3ZnBZakhT?= =?utf-8?B?cm40a3NFWURaSXN2VGQwT0pwNkh4UjRac2F6SWQ5NDZmRnZUcHpoOEVMOUVh?= =?utf-8?B?OTZ3R2JYSDZERFJ0YUpuSUhZS3huWmtWcHhsRU0yWmx1SWlhVHFxT280V1FH?= =?utf-8?B?NndUYXhkSzZrNzJtNmdKVnlrQzljOVZra3BkbU9yeGNFcllvNWYvN3dHa1NL?= =?utf-8?B?em1IY0lNbzZpcHdUVnR4aDEyQ001UWs2TEJ1Qjhpd2ZQUFNUZW12T2wyVkh5?= =?utf-8?B?STVpQ1lldFhRY0NuQzFOUWhPcTZzeXJFcnNwOGZGeEMxMFZPNWlhVlBXME9T?= =?utf-8?B?dGtDT0RFYkdwTlNlWW11WnVyVVJnd0szM2pmREYvL0g5OUVkbFlWWFQ4MW5W?= =?utf-8?B?bGRkOXRZZzNIcHpjUTVPUTVtYkdQVDljYXRnRURVWVpjQ0RjL3N1NVlXRXNk?= =?utf-8?B?UkxGYjBZa1J4d1BPL01ySDBZdlZwOU1Ob0tzVVMzV3ora1FXN21VYTM4QUhB?= =?utf-8?B?eWt6WDBCR1grYjNkL3U2RHdoMVI1bDlMQ1RlMFMrcnJVd0tvS0NqU3hMaEl5?= =?utf-8?B?MU40eFR2UHg4VzJ1Z0dNbjlQZHdNbWtrWUlwUGhsVSs2Qkt4ekNWWFRvcklM?= =?utf-8?B?N1BxYmhYeWJYZm1aWUhJSzg5YXB1YVI3elEwNXN1ZWQ1Ukl2OTlsbXB0MXRV?= =?utf-8?B?V01LNlQyOTlqR1VrQWNCZm1KMFl6YUZCZitjNzltUFhhZG5JTCtwc2V2M3kr?= =?utf-8?B?STl6cFYyQ1NzeG1LRWp5TTFKOVRtMkQzY2FRNllscnFwWlVLcmFUczhQOXBT?= =?utf-8?B?cUtsRTdBaW8weGVWWXJsNmZQVmo3M28yeUE3MW4vd3R0Y0hQMzJYWDNSRXZ0?= =?utf-8?B?czVHY05uRERzellvYkNUWHdtc0JTcWtKd2ZYU0s4am1Sckprbzh6M25LaW45?= =?utf-8?B?bVgydjNoVVBwT3FmcEZZNVRpUDQ1NjdTUmZ2dEFuendvd1duOFdva2FpNkR3?= =?utf-8?B?NDlGZ2x2elFoQ1RWSEl2dkhFdjYyZGk1TDBHL3VFUEpjWUxmV2YwNXBsUE1Z?= =?utf-8?B?RHF0SzJyQ0VzTlB1TTIrL3pOaG9rdHNUMFdQeEw1SnBFRG0vQmg4YkdlY1V3?= =?utf-8?B?bXdEdE9TSFg4ZjVtTE0zeUU4akphUlcyYUF4Sk5sL1RYSVI3WlBYZTlQbERt?= =?utf-8?B?NW4vaktNRlFjS0xzSmhFYXRTSGRPc2pOd1NmOVYxZTRUQ3lUS0tvODJoY1o4?= =?utf-8?B?T2h2MWVLeUxxMzg5MFNBYkowZ1FDeVA4d3R2NnRyRzlBZHZZdkFDc0JPU2Q4?= =?utf-8?B?Z1V2TGk5TEl6Z1hOOVVBczA4cUR2K29UNXVSZVQ3MTgwSXBBV3ZnWmN3OWFU?= =?utf-8?B?d1pMdEVueFAvQXFEZHI1V0tPc0dZSmwvcElLY21EZDhxWkdqRW1hR3Uvc2hu?= =?utf-8?B?MnpKTTh1d2xycFFUQ1NZTjNRYTgrQzhlUzArRFFqTEd1ZGtzWmFmRFBqLytn?= =?utf-8?Q?4DW/rrDw7ZnP2?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5339a57f-001e-4a69-0eae-08d9458119e4 X-MS-Exchange-CrossTenant-AuthSource: BN6PR10MB1748.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Jul 2021 22:05:04.1298 (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: 6C27JfnYrGr+SS2Av2G6H4rDtfX1egziog4sG3VYorXyOMXUDQdE9OMqna8+YEIDCh2t/jviC4CA/c2/l1cwVA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN8PR10MB3396 X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=10043 signatures=668682 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 malwarescore=0 mlxscore=0 suspectscore=0 phishscore=0 adultscore=0 mlxlogscore=999 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107120151 X-Proofpoint-GUID: 5n2QbqyyeeLjoy2mTjZK_FhF_1_BDfw3 X-Proofpoint-ORIG-GUID: 5n2QbqyyeeLjoy2mTjZK_FhF_1_BDfw3 X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00, BODY_8BITS, 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: Mon, 12 Jul 2021 22:07:16 -0000 On 7/6/2021 5:09 PM, Weimin Pan via Gdb-patches wrote: > > On 7/2/2021 4:42 PM, Weimin Pan via Gdb-patches wrote: >> >> On 6/29/2021 4:31 PM, Weimin Pan via Gdb-patches wrote: >>> [Changes from V6: >>>   - The CTF/BTF support in GCC was pushed upstream yesterday: >>> https://urldefense.com/v3/__https://gcc.gnu.org/pipermail/gcc-patches/2021-June/573851.html__;!!ACWV5N9M2RV99hQ!d-eHRETgxNsmbtvaW-Y592cZ4ywMpnBOauNulLcwDll70oyaH0cSKZn7wdOpeEp6$ >>> . >>>     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}] >>>   }