From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id wQPGIONY6mllEDcAWB0awg (envelope-from ) for ; Thu, 23 Apr 2026 13:37:39 -0400 Received: by simark.ca (Postfix, from userid 112) id 80CD01E0BA; Thu, 23 Apr 2026 13:37:39 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (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 D1BE71E093 for ; Thu, 23 Apr 2026 13:37:38 -0400 (EDT) Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id 7FDF34BAE7DB for ; Thu, 23 Apr 2026 17:37:37 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7FDF34BAE7DB Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id DFFEA4BA9021 for ; Thu, 23 Apr 2026 17:37:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DFFEA4BA9021 Authentication-Results: sourceware.org; dmarc=fail (p=none dis=none) header.from=efficios.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=efficios.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org DFFEA4BA9021 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=158.69.221.121 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776965834; cv=none; b=MVzWj0yk0FDCj2bdWHwO+2P1KKdxB/FLj7uuPVxtqJHqhXbrLgLWU8BO0+m8j2rr/PmOPJ6rxFsw+N8rifOdGKEACoYb5mYOvtERk3K5xxTllU2d9GDvwpMuYu2dBhvBKl1thEFD6q/rRJ6rsP8aRsbsWD9zN+rUVRw1FpexJCs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776965834; c=relaxed/simple; bh=TC5kYUcgJ1Ujyc6MVTh+RbL1SZ2aOtWw/N9TtUoYAns=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=JaDo5Y8xlEC9viO0kh/9L0PLWJE8HYzmHCqiaK4iHeiPaLQ+B6oSn+cTmma1crme6sUTUN6ceMp/fqEx1m3Vb76JsGNqRiS08H//mgJM2+7xHV03HYD6tqpXDo7mjBoI7f6P5pHH4/lbGSJJUVR8jbscKhqPGS1tQn0E+z/urxo= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DFFEA4BA9021 Received: by simark.ca (Postfix) id 9A9F81E093; Thu, 23 Apr 2026 13:37:12 -0400 (EDT) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH] gdb/dwarf: fix internal error in dwarf2_fetch_cfa_info for FDEs without a CFA rule Date: Thu, 23 Apr 2026 13:37:06 -0400 Message-ID: <20260423173711.804174-1-simon.marchi@efficios.com> X-Mailer: git-send-email 2.54.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 Commit a910478f65a5 ("gdb/dwarf: fix internal error when FDEs do not describe the CFA") fixed the switch on cfa_how in dwarf2_frame_cache, but there is a very similar switch in dwarf2_fetch_cfa_info that has the same issue. If the unwind info does not set a rule for the CFA, fs.regs.cfa_how is left as CFA_UNSET and we hit the default case, triggering an internal error. dwarf2_fetch_cfa_info is called from two places, both while compiling a DWARF expression that contains DW_OP_call_frame_cfa: - dwarf2_compile_expr_to_ax, when compiling to agent-expression bytecode - do_compile_dwarf_expr_to_c, when compiling to C source (used by the "compile" commands). Unlike dwarf2_frame_cache, where we can degrade gracefully by setting undefined_retaddr, the callers of dwarf2_fetch_cfa_info need a concrete CFA to generate code, so we can't continue. Throw an error with the same message used a few lines above, when the FDE itself cannot be found. Extend the debug-frame-no-cfa.exp test to reproduce this case: add a compile unit describing the "main" function and with a DW_AT_frame_base that uses DW_OP_call_frame_cfa and a local variable "x" that uses DW_OP_fbreg (the evaluation of which requires the CFA). Then, try to translate the location of "x" to agent-expression bytecode with "maint" agent. This hits the internal error without the corresponding fix. Change-Id: I82349e3d9259c8f943eabee5c2fce360876feee8 --- gdb/dwarf2/frame.c | 3 ++ .../gdb.dwarf2/debug-frame-no-cfa.exp | 36 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/gdb/dwarf2/frame.c b/gdb/dwarf2/frame.c index 2301d9146373..70895e90696d 100644 --- a/gdb/dwarf2/frame.c +++ b/gdb/dwarf2/frame.c @@ -793,6 +793,9 @@ dwarf2_fetch_cfa_info (struct gdbarch *gdbarch, CORE_ADDR pc, /* Calculate the CFA. */ switch (fs.regs.cfa_how) { + case CFA_UNSET: + error (_("Could not compute CFA; needed to translate this expression")); + case CFA_REG_OFFSET: { int regnum = dwarf_reg_to_regnum_or_error (gdbarch, fs.regs.cfa_reg); diff --git a/gdb/testsuite/gdb.dwarf2/debug-frame-no-cfa.exp b/gdb/testsuite/gdb.dwarf2/debug-frame-no-cfa.exp index 8442b5c3ddbb..3f7d77cf0745 100644 --- a/gdb/testsuite/gdb.dwarf2/debug-frame-no-cfa.exp +++ b/gdb/testsuite/gdb.dwarf2/debug-frame-no-cfa.exp @@ -26,6 +26,36 @@ set asm_file [standard_output_file $srcfile2] Dwarf::assemble $asm_file { get_func_info main + cu { version 5 } { + DW_TAG_compile_unit { + DW_AT_name debug-frame-no-cfa.c + DW_AT_comp_dir /tmp + } { + declare_labels int_type_label + + int_type_label: DW_TAG_base_type { + DW_AT_name "int" + DW_AT_encoding @DW_ATE_signed + DW_AT_byte_size 4 DW_FORM_sdata + } + + DW_TAG_subprogram { + MACRO_AT_func { main } + DW_AT_frame_base { + DW_OP_call_frame_cfa + } SPECIAL_expr + } { + DW_TAG_variable { + DW_AT_name x + DW_AT_type :$int_type_label + DW_AT_location { + DW_OP_fbreg 0 + } SPECIAL_expr + } + } + } + } + frame { declare_labels cie_label @@ -52,3 +82,9 @@ if { ![runto_main] } { # Make sure to match a single line, so that the test fails if an error # about stack unwind is printed after frame 0. gdb_test "backtrace" "^#0 \[^\r\n\]* main \[^\r\n\]*" + +# Translating the location of "x" to an agent expression requires +# evaluating its frame base, which uses DW_OP_call_frame_cfa. This would +# cause an internal error in dwarf2_fetch_cfa_info. +gdb_test "maint agent x" \ + "Could not compute CFA; needed to translate this expression" base-commit: 8dc535c59fdbcf99e28703425e5c1c711e63a1f1 -- 2.54.0