From patchwork Fri May 22 17:18:56 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 135473 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1238E4BAD16C for ; Fri, 22 May 2026 17:19:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1238E4BAD16C Authentication-Results: sourceware.org; dkim=pass (2048-bit key, secure) header.d=adacore.com header.i=@adacore.com header.a=rsa-sha256 header.s=google header.b=ek/Esiei X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-oa1-x2b.google.com (mail-oa1-x2b.google.com [IPv6:2001:4860:4864:20::2b]) by sourceware.org (Postfix) with ESMTPS id 222034BABF18 for ; Fri, 22 May 2026 17:19:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 222034BABF18 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 222034BABF18 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2001:4860:4864:20::2b ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1779470340; cv=none; b=PbA1pmNuhx0ZTV739lcCv+wMlwjXjPXDbsUljtVA6h/K7CudY+sFCNuzyeyD0vtOTuSj9rnzSbKm6xzEBY6JeqgvtGt6wYbVLXiAsrW8SkrmhJ280YuX64PjH2bwGcQ48yK+0i4B4p2KHHF7P/rMKzl19hOB+L0wveqzHEo4SyY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1779470340; c=relaxed/simple; bh=JSIb1ihphtdaIv0eXOZRBu9NUM9BgXz5oRcCZUihXBo=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=SVGh8S+Md7KTPCVKspJEuFiojp6a7mW6KetC3prlveV+ShPVgNgNemgYZFn1zyNg/YWWPagU6xxedYmBOqC0uIivdcXrxFlnLmAIKUjC6xqLcbErAsJrO9lKp+8qSpv35TxRgCFOPGK714NR3FkY7bPassQBwR58tfBP0cD4EQ0= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, secure) header.d=adacore.com header.i=@adacore.com header.a=rsa-sha256 header.s=google header.b=ek/Esiei DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 222034BABF18 Received: by mail-oa1-x2b.google.com with SMTP id 586e51a60fabf-43b7987a9d1so461312fac.1 for ; Fri, 22 May 2026 10:19:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; t=1779470339; x=1780075139; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=MT80etr0y3dfhUkI9E3SjDRcaqdxUxFPdnBdhs1UQQw=; b=ek/EsieimiyRq1hH9tc9PL3pP8/ops6CSZCAfrxPPnv1iR+sqG1NfstjTvLb/nGaB9 KRV0qB0BT5mEhCM9G65mauM62t/AczTml1oM6wmhjY77US4gS2my/UPxQvYOn6LKF9BC oWIJWegrp57M2p8IlN33Rq6NoxR5mk7Rj5/4Iofe2rPbiuyhmv/06FWiJBtRYTVydN+C T5Tk/2uY5wJDu00NqgV+IVWwJzeUzCaJO87KfxWfZJu1YPJtmZgmmBQZ2+rfOBqNZxkZ 7rxsK4glers0aKdoZSFppmWhzDHuOnEWj3uvG7ECcisK+K/0lTIL+3nnbxqWnjZfMl0W 7YQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779470339; x=1780075139; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=MT80etr0y3dfhUkI9E3SjDRcaqdxUxFPdnBdhs1UQQw=; b=Cu23sF4H+kegaVLSDHirKsOFFsZK9TtHa0Y3hQIyi4lnTC1b8ennqQo46sGApHihP7 c82A39QjnVGL+GcdMfXrpPamBhslfAyuh1mD+jq9/LzqNdT7bZqgwpD8542UoGP2bmBP 7BW6iz+r6M2IXg9ztnUyOF5v8NKwB7I7HPhvM6Sf6fEFL61J768howQul8NZDnT1zkJD AH1vRMMpDtWuBjSqzcvJvL86nYIzuY8HuO6eY6CbIspwgplzgrEXBEpzIcakxyJ+wYAU 9v9chCyf1ux6TRQgrPnCOBsKwoEUuI0jrHaUY5FzhIWwpbc08rcK4vEPasMVJutvHLoR /aAQ== X-Gm-Message-State: AOJu0YzAXkdsl+ib+q+RNOwjnoBTp5OIpy/jWIVvCio0tkqF6VdG7OxB SqHsbdJwaqxgj12OCOQRvZM1SEDslVbnAuWqBPwAnU7cevurCzYC3KtjV5zRW4N7jshF4GsLORz hWQ0= X-Gm-Gg: Acq92OFpww6myrU7EEvhcwK0nZ7QqfQC9FI6nj3iiM/9+kYbH29brDbXWu4UreU4Ljb k5ISr77cMFyyHox+XvAmExcj3jNb3E/U3K4Rp5qxCL/5IHSuFIaC+DfHzNwB+mqVNfTuTiSRzJs bicNn3V6C6eQ4q1ughaOp6ATlpb115qcL3+wYz3pdDfApF70lIaHLQc+UhYw4ddBs53WUC1XNOl +JvfJTi8WGFTsoSre7hD5AxQbSg1biClYhOv1ygPu3YcxWZye+zL6cQXa8QGUMrd/FlkBPf2UPD kPzCxlqnyDZ+KbI4UlK4VKuTYqNGRbYBhER0GdMDbAfHutj5c+3c4HGwUvTKaq5MLgHFia0jPM9 nQzYpIOgrrgasI5+kpLi03SDIZSFd9fr3R3ggSVYIueyESpgHLGFEXl7e92xio8ItihIU6sYkAE /e/8tvr8XA7joWOZxDLdFKa+cx303MbxnLUP+lETy6qcg= X-Received: by 2002:a05:6820:f024:b0:69d:513e:1a62 with SMTP id 006d021491bc7-69d7ecf2d2bmr2426987eaf.56.1779470339456; Fri, 22 May 2026 10:18:59 -0700 (PDT) Received: from bapiya (75-166-225-82.hlrn.qwest.net. [75.166.225.82]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-43b63976dacsm2220082fac.11.2026.05.22.10.18.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 May 2026 10:18:59 -0700 (PDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Emit DWARF expressions from dwarf-to-dwarf-assembler.py Date: Fri, 22 May 2026 11:18:56 -0600 Message-ID: <20260522171856.3378166-1-tromey@adacore.com> X-Mailer: git-send-email 2.54.0 MIME-Version: 1.0 X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE, SPF_PASS, TXREP, URIBL_BLOCKED shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org 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~patchwork=sourceware.org@sourceware.org This changes dwarf-to-dwarf-assembler.py to attempt to emit DWARF expressions. It is not close to perfect, since it relies on the elftools formatting to some extent, but it does at least eliminate the need to do a separate "readelf" step to try to work on the expression by hand. --- gdb/contrib/dwarf-to-dwarf-assembler.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) base-commit: 1678d7d3d2e4cf83cda5a96334a0326573ad0f7c diff --git a/gdb/contrib/dwarf-to-dwarf-assembler.py b/gdb/contrib/dwarf-to-dwarf-assembler.py index 4832c6c8cb1..5f990f79569 100755 --- a/gdb/contrib/dwarf-to-dwarf-assembler.py +++ b/gdb/contrib/dwarf-to-dwarf-assembler.py @@ -52,6 +52,7 @@ from elftools.construct.lib.container import ListContainer from elftools.dwarf.compileunit import CompileUnit as RawCompileUnit from elftools.dwarf.die import DIE as RawDIE from elftools.dwarf.die import AttributeValue +from elftools.dwarf.dwarf_expr import DWARFExprParser from elftools.dwarf.enums import ENUM_DW_ATE, ENUM_DW_LANG from elftools.elf.elffile import ELFFile @@ -118,19 +119,27 @@ class DWARFAttribute: def __init__( self, + cu, die_offset: int, name: str, value: str | bytes | int | bool, form=None, ): + self.cu = cu self.die_offset = die_offset self.name = name self.value = value self.form = form - def _format_expr_value(self) -> str: - self.form = "SPECIAL_expr" - return "{ MANUAL: Fill expr list }" + def _format_expr_value(self, intro, indent_count: int) -> str: + result = indent(intro, indent_count) + "{\n" + parser = DWARFExprParser(self.cu.structs) + for op in parser.parse_expr(self.value): + result += indent(f"{op.op_name} 0x{op.op:02x}", indent_count + 1) + if op.args: + result += f" {op.args}" + result += "\n" + return result + indent("} SPECIAL_expr", indent_count) def _needs_escaping(self, str_value: str) -> bool: charset = set(str_value) @@ -151,9 +160,7 @@ class DWARFAttribute: def _format_value( self, offset_die_lookup: dict[int, "DWARFDIE"], indent_count: int = 0 ) -> str: - if self.form in EXPR_ATTRIBUTE_FORMS: - return self._format_expr_value() - elif isinstance(self.value, bool): + if isinstance(self.value, bool): return str(int(self.value)) elif isinstance(self.value, int): if self.form == "DW_FORM_ref4": @@ -218,6 +225,10 @@ class DWARFAttribute: s += "@" + LANG_NAME[self.value] elif self.name == "DW_AT_encoding" and isinstance(self.value, int): s += "@" + ATE_NAME[self.value] + elif self.form in EXPR_ATTRIBUTE_FORMS: + # This returns a complete description that is already + # indented. + return self._format_expr_value(s, indent_count) else: s += self._format_value(offset_die_lookup) @@ -491,7 +502,7 @@ class DWARFParser: self.referenced_offsets.add(referenced_die.offset) processed_attrs[attr_name] = DWARFAttribute( - raw_die.offset, attr_name, actual_value, attr_value.form + die_cu, raw_die.offset, attr_name, actual_value, attr_value.form ) if raw_die.tag == DWARFCompileUnit.compile_unit_tag: