From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 8KstBPKbWGeV+woAWB0awg (envelope-from ) for ; Tue, 10 Dec 2024 14:52:18 -0500 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=gnx12ieB; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 0D7821E0BB; Tue, 10 Dec 2024 14:52:18 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-6.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=unavailable autolearn_force=no version=4.0.0 Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id C0EBF1E092 for ; Tue, 10 Dec 2024 14:52:16 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 62F063857B9B for ; Tue, 10 Dec 2024 19:52:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 62F063857B9B Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=gnx12ieB Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id 4D04C3858428 for ; Tue, 10 Dec 2024 19:51:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4D04C3858428 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4D04C3858428 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733860292; cv=none; b=nugCcfsjhsnIvRFpRw2fIgyMk/C1LbKK49IJET4YzLugf42USwnFu8sRzfRXY0L+tPuJUE2KuROPJ+dLaufH7ygr3maXk0yWsuQviFKHSg4cl3atN5+EtjLr+6E+vp95R8zuQ6IsFucOlcIUot+MgvSKbBY0T65pGs3uvZ6jJ3s= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733860292; c=relaxed/simple; bh=sqoysO7OP1TEFfZo+qqKXoYGYb/phm5yyXvWqBHJ08w=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=bO14ysVhAu4mtkZZgOVdmdB7VKiLiN6Vw6QnCq55Is5+7He2iOj4Zk/efnIYI+2xuPtYGRx314kNXkOaYu+nz/tel6sygCQ5He7YNQmTRzPaoonfw/sBkiF5dnjwBKuLWTNgk/u9+f4rE9bzRsHF9QDj5LrpbwZN2N3G9bdPJO8= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4D04C3858428 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1733860292; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=BtcYXnY9DMmKhdHEA6hkfqjHsMvPR+1ZAUDhxoxV74Q=; b=gnx12ieBgs8qoQIhcMWk4+FcqrX8KjssMQvAD3TJrJBCD6rn0ypk2RgyzRSfnfEZWSFx0n WqLhT6vuDPR4fasKAom8V8GFybSChBrEjMcqBB2e16YZRV14j9U/UYOc0zUrVE8XFIlLsk mKYX0tcJNRkLGWhSarDVjp2RINKYds8= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-192-z6yZPa_RMJqQ3P0h_Uy1Ng-1; Tue, 10 Dec 2024 14:51:28 -0500 X-MC-Unique: z6yZPa_RMJqQ3P0h_Uy1Ng-1 X-Mimecast-MFC-AGG-ID: z6yZPa_RMJqQ3P0h_Uy1Ng Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 067C21955D5A for ; Tue, 10 Dec 2024 19:51:28 +0000 (UTC) Received: from fedora.redhat.com (unknown [10.96.134.195]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id AC6A91956054; Tue, 10 Dec 2024 19:51:26 +0000 (UTC) From: Guinevere Larsen To: gdb-patches@sourceware.org Cc: Guinevere Larsen Subject: [PATCH v8 0/5] Modernize frame unwinders and add disable feature Date: Tue, 10 Dec 2024 16:51:10 -0300 Message-ID: <20241210195115.3046370-1-guinevere@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: q5wvJJwohUHtqxG0-OumImr2b-gI-GK5IdFrpUwoMWs_1733860288 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit content-type: text/plain; charset="US-ASCII"; x-default=true X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org This patch series started with me trying to make it easier to test GDB's ability to unwind using CFI data, to improve a previous patch I sent to the list. The first patch is just a minor change, storing frame unwinders in a vector instead of through an unwinder table accessible, still accessed throught the registry subsystem. This isn't required (like I originally thought it was), but it does make the whole system more readable in my opinion. Patch 2 adds a new field for frame unwinders, their "class", which roughly correlates to which area of GDB adds that unwinder. They were chosen rather arbitrarily based on my understanding, where the unwinder is added and its name. This class will be used to simplify bulk disabling of unwinders introduced by patch 4. Patch 3 has the real meat of the modernization, making GDB use polymorphism to handle frame unwinders. This is slightly slower than using function pointers, but much more readable in my opinion. Also, as noted by Thiago Bauermann, no frame unwinders that use the legacy class ever pass a frame_data pointer, so that field was removed from those unwinders. Patch 4 adds the possibility to disable unwinders based on their name or class, and disable all unwinders at once if desired. It also reverts commit 3c3bb0580be0 since that patch pointed out that if a more generic system was implemented it could be reverted. Patch 5 adds the test I was trying to upstream all along. All the documentation has been approved by Eli already. Patches 2 and 3 were already approved by Simon. Changes for v8: * Simplified the loop printing the table for "maint info frame-unwinders". * Used gdb::option to parse the options for "maint frame-unwinder disable" * Changed error message when no unwinder is found but some unwinders were disabled * Cosmetic fixes. Changes for v7: * Moved the std::vector back to being accessed through the registry system Removed the approvals from patch 1 because I think this change is reasonably big, and needs another review. * Several cosmetic changes to the code, following feedback from Simon and Thiago. * Fixed the test from patch 4, following Thiago's suggestion * Users can no longer specify the unwinder class with the FRAME_UNWINDER_ prefix Changes for v6: * Patches 1 and 2 were approved by Simon * Several cosmetic changes to patch 3 and 4 * New dealloc_cache default implementation (noop), and frame_unwind_legacy defaults to it if no function pointer is given. * New prev_arch default implementation (getting the current arch), and frame_unwind_legacy defaults to it if no pointer is given * Renamed "sniffer" to "sniff", to make it more clear what the method does * Fixed some problems with the testcase. Changes for v5: * Reverted commit 3c3bb0580be0, with patch 4 following the advice on that commit * on patch 3, some of the original functions were converted into the classes' methods instead of just passing the call along. * some methods of frame_unwind_legacy were switched to be purely virtual Changes for v4: * Rebase on current master (No changes needed) * improved documentation of unwinder classes follow Eli feedback * added KFAIL to new test on patch 5 if running on 32 bit arm Changes for v3: * Fixed Linaro CI issue in 32 bit arm * Fixed the few comments from Eli. * Documented addition of unwinder class in the patch that adds it. Changes for v2: * Added back the test that checks if GDB can handle a mix of CUs with and without debuginfo in a single backtrace. * Fixed all the nitpicks for style. * Removed FRAME_UNWIND_ prefix when talking about classes * Thoroughly changed the documentation, to be more readable Guinevere Larsen (5): gdb: make gdbarch store a vector of frame unwinders gdb: add "unwinder class" to frame unwinders gdb: Migrate frame unwinders to use C++ classes gdb: introduce ability to disable frame unwinders gdb/testsuite: Test for a backtrace through object without debuginfo gdb/NEWS | 21 + gdb/aarch64-tdep.c | 12 +- gdb/alpha-mdebug-tdep.c | 6 +- gdb/alpha-tdep.c | 12 +- gdb/amd64-obsd-tdep.c | 6 +- gdb/amd64-tdep.c | 24 +- gdb/amd64-windows-tdep.c | 6 +- gdb/amdgpu-tdep.c | 7 +- gdb/arc-tdep.c | 10 +- gdb/arm-tdep.c | 29 +- gdb/avr-tdep.c | 5 +- gdb/bfin-tdep.c | 6 +- gdb/bpf-tdep.c | 6 +- gdb/cris-tdep.c | 12 +- gdb/csky-tdep.c | 10 +- gdb/doc/gdb.texinfo | 64 +-- gdb/dummy-frame.c | 8 +- gdb/dummy-frame.h | 2 +- gdb/dwarf2/frame-tailcall.c | 9 +- gdb/dwarf2/frame-tailcall.h | 2 +- gdb/dwarf2/frame.c | 46 +- gdb/dwarf2/frame.h | 6 - gdb/frame-unwind.c | 420 ++++++++++++++---- gdb/frame-unwind.h | 173 +++++++- gdb/frame.c | 21 +- gdb/frv-linux-tdep.c | 6 +- gdb/frv-tdep.c | 5 +- gdb/ft32-tdep.c | 6 +- gdb/h8300-tdep.c | 5 +- gdb/hppa-linux-tdep.c | 5 +- gdb/hppa-tdep.c | 17 +- gdb/i386-obsd-tdep.c | 5 +- gdb/i386-tdep.c | 30 +- gdb/ia64-tdep.c | 24 +- gdb/inline-frame.c | 5 +- gdb/inline-frame.h | 2 +- gdb/iq2000-tdep.c | 5 +- gdb/jit.c | 6 +- gdb/lm32-tdep.c | 5 +- gdb/loongarch-tdep.c | 7 +- gdb/m32c-tdep.c | 5 +- gdb/m32r-linux-tdep.c | 5 +- gdb/m32r-tdep.c | 5 +- gdb/m68hc11-tdep.c | 5 +- gdb/m68k-linux-tdep.c | 6 +- gdb/m68k-tdep.c | 6 +- gdb/mep-tdep.c | 5 +- gdb/microblaze-tdep.c | 6 +- gdb/mips-sde-tdep.c | 6 +- gdb/mips-tdep.c | 24 +- gdb/mn10300-tdep.c | 5 +- gdb/moxie-tdep.c | 5 +- gdb/msp430-tdep.c | 5 +- gdb/nds32-tdep.c | 14 +- gdb/or1k-tdep.c | 7 +- gdb/ppc-fbsd-tdep.c | 5 +- gdb/ppc-obsd-tdep.c | 5 +- gdb/python/py-unwind.c | 61 ++- gdb/record-btrace.c | 12 +- gdb/record.h | 4 +- gdb/riscv-tdep.c | 8 +- gdb/rl78-tdep.c | 6 +- gdb/rs6000-aix-tdep.c | 5 +- gdb/rs6000-tdep.c | 12 +- gdb/rx-tdep.c | 10 +- gdb/s12z-tdep.c | 7 +- gdb/s390-linux-tdep.c | 5 +- gdb/s390-tdep.c | 10 +- gdb/sentinel-frame.c | 8 +- gdb/sentinel-frame.h | 2 +- gdb/sh-tdep.c | 11 +- gdb/sparc-netbsd-tdep.c | 6 +- gdb/sparc-obsd-tdep.c | 6 +- gdb/sparc-sol2-tdep.c | 6 +- gdb/sparc-tdep.c | 6 +- gdb/sparc64-fbsd-tdep.c | 6 +- gdb/sparc64-netbsd-tdep.c | 6 +- gdb/sparc64-obsd-tdep.c | 12 +- gdb/sparc64-sol2-tdep.c | 6 +- gdb/sparc64-tdep.c | 6 +- .../backtrace-through-cu-nodebug-caller.c | 28 ++ .../backtrace-through-cu-nodebug-main.c | 32 ++ .../gdb.base/backtrace-through-cu-nodebug.exp | 95 ++++ .../gdb.base/frame-info-consistent.exp | 8 +- gdb/testsuite/gdb.base/frame-unwind-disable.c | 22 + .../gdb.base/frame-unwind-disable.exp | 137 ++++++ gdb/testsuite/gdb.base/maint.exp | 4 - gdb/tic6x-tdep.c | 12 +- gdb/tilegx-tdep.c | 5 +- gdb/tramp-frame.c | 70 ++- gdb/v850-tdep.c | 5 +- gdb/vax-tdep.c | 6 +- gdb/windows-tdep.c | 35 +- gdb/windows-tdep.h | 16 +- gdb/xstormy16-tdep.c | 5 +- gdb/xtensa-tdep.c | 7 +- gdb/z80-tdep.c | 7 +- 97 files changed, 1339 insertions(+), 551 deletions(-) create mode 100644 gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-caller.c create mode 100644 gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-main.c create mode 100644 gdb/testsuite/gdb.base/backtrace-through-cu-nodebug.exp create mode 100644 gdb/testsuite/gdb.base/frame-unwind-disable.c create mode 100644 gdb/testsuite/gdb.base/frame-unwind-disable.exp -- 2.47.0