From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 6IVTNGucWGeV+woAWB0awg (envelope-from ) for ; Tue, 10 Dec 2024 14:54:19 -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=XFIrE0Tj; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id D2F181E097; Tue, 10 Dec 2024 14:54:19 -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 4C86F1E091 for ; Tue, 10 Dec 2024 14:54:19 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F1425385842C for ; Tue, 10 Dec 2024 19:54:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F1425385842C 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=XFIrE0Tj 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 93A323857B98 for ; Tue, 10 Dec 2024 19:52:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 93A323857B98 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 93A323857B98 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=1733860320; cv=none; b=I/gkXhqWyVkYvXbf2kVuKEY37TzQ7mG2l9lK4fwtf2fMg1dg05MkgTfXNnLmERcrwkKnVYeY8NHUbiQhdYhVZ/kRRwpfvP9SNSXD8Rim9YhILnuM3SJ7oSk+9DVLSVLscA6oPZf7nfzNSYB8d/ezIiZO5FaRnjN74Z9uEPkZv5U= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733860320; c=relaxed/simple; bh=iFHfCcyzPhZpMiimjkG+oGLDfTbXAjCyh91QU5T5ZoE=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=nR838UCq+Lh+YVbi96OHoiRRg6ZrFhaxcIUY5Ayq/jsAYqZAve0WQJiqyyd52Gozilcn945zyqM9sQC9rqxyeQkGQSWs9iNs5f8amjxN/XJtIxqkQfBUE513/m8L7y4iKI3hLd5anbZi6APtAw6ZcXY/tKHSbRH2V7dDO5uBci0= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 93A323857B98 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1733860320; 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: in-reply-to:in-reply-to:references:references; bh=OHsmuL+3YoVQ86SqFU6sslcZWaUn2ymb0/11yZ8wnYs=; b=XFIrE0TjF5CSF1vBaAVkGCNZ6kyroNSsJyfBd9D+f4YjXcjpL99YegcP1BIvuyFoEH+uJ7 2v69AhOYFDe250uvmN3GuAkUdiG51CUHt/N5mAT2MMX6Kaho1ZL/m6CxPZZJVpwnYnxYLf jGgSU3nI4o9AIBhhlnpzqA1mqzFPlAQ= Received: from mx-prod-mc-02.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-548-_NKwzYwsNVuQgz8o2A84sw-1; Tue, 10 Dec 2024 14:51:59 -0500 X-MC-Unique: _NKwzYwsNVuQgz8o2A84sw-1 X-Mimecast-MFC-AGG-ID: _NKwzYwsNVuQgz8o2A84sw 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-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id A7B041956060; Tue, 10 Dec 2024 19:51:57 +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 633CB1956060; Tue, 10 Dec 2024 19:51:55 +0000 (UTC) From: Guinevere Larsen To: gdb-patches@sourceware.org Cc: Guinevere Larsen , Jan Kratochvil , Thiago Jung Bauermann Subject: [PATCH v8 5/5] gdb/testsuite: Test for a backtrace through object without debuginfo Date: Tue, 10 Dec 2024 16:51:15 -0300 Message-ID: <20241210195115.3046370-6-guinevere@redhat.com> In-Reply-To: <20241210195115.3046370-1-guinevere@redhat.com> References: <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: NvN3RT79z-fKnWvV5yKsJL2tOiDv2PniQeZDfctPaUI_1733860318 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 Fedora has been carrying this test since back in the Project Archer days. A change back then caused GDB to stop being able to backtrace when only some of the object files had debug information. Even though the changed code never seems to have made its way into the main GDB project, I think it makes sense to bring the test along to ensure something like this doesn't pass unnoticed. Co-Authored-By: Jan Kratochvil Reviewed-by: Thiago Jung Bauermann --- .../backtrace-through-cu-nodebug-caller.c | 28 ++++++ .../backtrace-through-cu-nodebug-main.c | 32 +++++++ .../gdb.base/backtrace-through-cu-nodebug.exp | 95 +++++++++++++++++++ 3 files changed, 155 insertions(+) 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 diff --git a/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-caller.c b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-caller.c new file mode 100644 index 00000000000..3a63d72a468 --- /dev/null +++ b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-caller.c @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2005-2024 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 . */ + +typedef int (*callback_t) (void); + +int +caller (callback_t callback) +{ + /* Ensure some frame content to push away the return address. */ + volatile const long one = 1; + + /* Modify the return value to prevent any tail-call optimization. */ + return (*callback) () - one; +} diff --git a/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-main.c b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-main.c new file mode 100644 index 00000000000..3e7ac57a166 --- /dev/null +++ b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug-main.c @@ -0,0 +1,32 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2005-2024 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 . */ + +typedef int (*callback_t) (void); + +extern int caller (callback_t callback); + +int +callback (void) +{ + return 1; +} + +int +main (void) +{ + return caller (callback); +} diff --git a/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug.exp b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug.exp new file mode 100644 index 00000000000..c0940b406a8 --- /dev/null +++ b/gdb/testsuite/gdb.base/backtrace-through-cu-nodebug.exp @@ -0,0 +1,95 @@ +# Copyright 2010-2024 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test that GDB can generate accurate backtraces even if some of the stack +# trace goes through a function with no debug information. + +standard_testfile -caller.c -main.c +set objmainfile ${testfile}-main.o +set objcallerfile ${testfile}-caller.o + +# recompile the inferior with or without CFI information, then run the +# inferior until the point where the important test starts +# returns TRUE on an ERROR. +proc prepare_test {has_cfi} { + global srcdir subdir srcfile srcfile2 objmainfile objcallerfile binfile + if {$has_cfi} { + set extension "cfi" + if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" \ + "${srcdir}/${subdir}/${objcallerfile}" \ + object [list {additional_flags=-fomit-frame-pointer \ + -funwind-tables -fasynchronous-unwind-tables}]] != "" } { + untested "couldn't compile with cfi" + return true + } + } else { + set extension "no-cfi" + if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" \ + "${srcdir}/${subdir}/${objcallerfile}" \ + object [list {additional_flags=-fomit-frame-pointer \ + -fno-unwind-tables \ + -fno-asynchronous-unwind-tables}]] != "" } { + untested "couldn't compile without cfi" + return true + } + } + if {[gdb_compile [list "${srcdir}/${subdir}/${objmainfile}" \ + "${srcdir}/${subdir}/${objcallerfile}"] \ + "${binfile}-${extension}" binfile {}] != ""} { + untested "couldn't link object files" + return true + } + + clean_restart "$binfile-${extension}" + + with_test_prefix "${extension}" { + + if ![runto callback] then { + fail "has_cfi=$has_cfi: Can't run to callback" + return true + } + gdb_test_no_output "maint frame-unwinder disable ARCH" + return false + } +} + +if {[gdb_compile "${srcdir}/${subdir}/${srcfile2}" \ + "${srcdir}/${subdir}/${objmainfile}" \ + object {debug}] != "" } { + untested "couldn't compile main file" + return +} + +if { [prepare_test false] } { + untested ${testfile}.exp +} else { + gdb_test "bt" "Required frame unwinder may have been disabled.*" \ + "verify unwind fail without CFI" +} + +if { [prepare_test true] } { + untested ${testfile}.exp +} else { + if { [istarget "arm*-*-*"] } { + setup_kfail backtrace/31950 *-*-* + } + set text {[^\r\n]+} + # #0 callback () at ... + # #1 0x00000000004004e9 in caller () + # #2 0x00000000004004cd in main () at ... + gdb_test "bt" \ + "#0 +callback $text\r\n#1 $text in caller $text\r\n#2 $text in main $text" \ + "verify unwinding works for CFI without DIEs" +} -- 2.47.0