public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] repo/gentoo:master commit in: sys-devel/dwz/, sys-devel/dwz/files/
Date: Wed,  6 Nov 2024 11:27:27 +0000 (UTC)	[thread overview]
Message-ID: <1730892402.ed3a59ce3689b466cfbf16633abb0b1fecb0761f.sam@gentoo> (raw)

commit:     ed3a59ce3689b466cfbf16633abb0b1fecb0761f
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Wed Nov  6 11:26:42 2024 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Nov  6 11:26:42 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ed3a59ce

sys-devel/dwz: backport fix for gdb-15 compat

Signed-off-by: Sam James <sam <AT> gentoo.org>

 sys-devel/dwz/dwz-0.15-r2.ebuild          |  57 +++++
 sys-devel/dwz/files/dwz-0.15-gdb-15.patch | 369 ++++++++++++++++++++++++++++++
 2 files changed, 426 insertions(+)

diff --git a/sys-devel/dwz/dwz-0.15-r2.ebuild b/sys-devel/dwz/dwz-0.15-r2.ebuild
new file mode 100644
index 000000000000..09e446237df4
--- /dev/null
+++ b/sys-devel/dwz/dwz-0.15-r2.ebuild
@@ -0,0 +1,57 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit toolchain-funcs
+
+DESCRIPTION="DWARF optimization and duplicate removal tool"
+HOMEPAGE="https://sourceware.org/dwz"
+if [[ ${PV} == 9999 ]] ; then
+	EGIT_REPO_URI="https://sourceware.org/git/dwz.git"
+	inherit git-r3
+else
+	SRC_URI="https://sourceware.org/ftp/dwz/releases/${P}.tar.xz"
+	S="${WORKDIR}/${PN}"
+
+	KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~riscv ~sparc ~x86"
+fi
+
+LICENSE="GPL-2+ GPL-3+"
+SLOT="0"
+IUSE="test"
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+	dev-libs/elfutils
+	dev-libs/xxhash
+"
+DEPEND="${RDEPEND}"
+BDEPEND="
+	test? (
+		dev-debug/gdb
+		dev-libs/elfutils[utils]
+		dev-util/dejagnu
+	)
+"
+
+PATCHES=(
+	"${FILESDIR}"/${P}-gdb-15.patch
+)
+
+src_prepare() {
+	default
+	tc-export CC
+}
+
+src_compile() {
+	emake CFLAGS="${CFLAGS}" srcdir="${S}"
+}
+
+src_test() {
+	emake CFLAGS="${CFLAGS}" srcdir="${S}" check
+}
+
+src_install() {
+	emake DESTDIR="${D}" CFLAGS="${CFLAGS}" srcdir="${S}" install
+}

diff --git a/sys-devel/dwz/files/dwz-0.15-gdb-15.patch b/sys-devel/dwz/files/dwz-0.15-gdb-15.patch
new file mode 100644
index 000000000000..3d1754f37ddc
--- /dev/null
+++ b/sys-devel/dwz/files/dwz-0.15-gdb-15.patch
@@ -0,0 +1,369 @@
+https://sourceware.org/git/?p=dwz.git;a=commit;h=1ae37f476bc6c9f7a756fee4830766f03600866c
+
+From 1ae37f476bc6c9f7a756fee4830766f03600866c Mon Sep 17 00:00:00 2001
+From: Mark Wielaard <mark@klomp.org>
+Date: Wed, 2 Oct 2024 23:20:57 +0200
+Subject: [PATCH] Add support for version 9 .gdb_index
+
+Version 9 .gdb_index adds a new shortcut table. The table itself is
+just two offset_type values (2 * 4 bytes) describing the language of
+the main function expresses as an DW_LANG_ constant and the offset of
+the main function's name in the constant pool.
+
+The offset to the shortcut table in the header is between the symbol
+table and constant pool offsets.
+
+write_gdb_index explicitly copies the function's name into the new
+constant pool (if lang is not zero) because it might not be an offset
+to an existing name of a symbol.
+
+Some extra checks and warnings have been added to let the user know
+when parsing the .gdb_index fails. Add a const char *file argument to
+write_gdb_index for better error reporting.
+
+Add -D_GNU_SOURCE to Makefile CFLAGS_COMMON to use memrchr.
+
+This fixes the gdb-add-index.sh testcase with gdb 15+.
+
+https://sourceware.org/PR32146
+--- a/Makefile
++++ b/Makefile
+@@ -8,7 +8,7 @@ CFLAGS = -O2 -g
+ DWZ_VERSION := $(shell cat $(srcdir)/VERSION)
+ CFLAGS_VERSION = -DDWZ_VERSION='"$(DWZ_VERSION)"'
+ CFLAGS_COPYRIGHT = $(shell cat $(srcdir)/COPYRIGHT_YEARS)
+-CFLAGS_COMMON = -Wall -W -D_FILE_OFFSET_BITS=64
++CFLAGS_COMMON = -Wall -W -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
+ XXH_PROG = "\#define XXH_INLINE_ALL 1\n\#include <xxhash.h>\n"
+ XXH_INLINE_ALL_WORKS = $(shell printf $(XXH_PROG) \
+ 		| $(CC) -xc -c - -o /dev/null 2>/dev/null \
+--- a/dwz.c
++++ b/dwz.c
+@@ -1,6 +1,7 @@
+ /* Copyright (C) 2001-2021 Red Hat, Inc.
+    Copyright (C) 2003 Free Software Foundation, Inc.
+    Copyright (C) 2019-2021 SUSE LLC.
++   Copyright (C) 2024 Mark J. Wielaard <mark@klomp.org>
+    Written by Jakub Jelinek <jakub@redhat.com>, 2012.
+ 
+    This program is free software; you can redistribute it and/or modify
+@@ -13222,12 +13223,13 @@ gdb_index_tu_cmp (const void *p, const void *q)
+ /* Construct new .gdb_index section in malloced memory
+    if it needs adjustment.  */
+ static void
+-write_gdb_index (void)
++write_gdb_index (const char *file)
+ {
+   dw_cu_ref cu, cu_next, first_tu = NULL;
+-  unsigned char *gdb_index, *ptr, *inptr, *end;
++  unsigned char *gdb_index, *ptr, *inptr, *end, *conststart;
+   unsigned int ncus = 0, npus = 0, ntus = 0, ndelcus = 0, ver;
+   unsigned int culistoff, cutypesoff, addressoff, symboloff, constoff;
++  unsigned int headersize, shortcutoff, nextoff;
+   unsigned int *tuindices = NULL, tuidx = 0, *cumap = NULL, i, j, k;
+   bool fail = false;
+ 
+@@ -13235,14 +13237,27 @@ write_gdb_index (void)
+   if (likely (!op_multifile)
+       && (debug_sections[GDB_INDEX].data == NULL
+ 	  || debug_sections[GDB_INDEX].size < 0x18))
+-    return;
++    {
++      if (file && debug_sections[GDB_INDEX].data != NULL)
++	error (0, 0, "%s: .gdb_index too small 0x%zx", file,
++	       debug_sections[GDB_INDEX].size);
++      return;
++    }
+   inptr = (unsigned char *) debug_sections[GDB_INDEX].data;
+   if (unlikely (op_multifile))
+     ver = multi_gdb_index_ver;
+   else
+     ver = buf_read_ule32 (inptr);
+-  if (ver < 4 || ver > 8)
+-    return;
++  if (ver < 4 || ver > 9)
++    {
++      if (file)
++	error (0, 0, "%s: Unknown .gdb_index section version 0x%x", file, ver);
++      return;
++    }
++
++  /* Version 9 added a shortcut table offset (4 bytes) between the
++     address and symbol table offsets.  */
++  headersize = ver < 9 ? 0x18 : 0x1c;
+ 
+   for (cu = first_cu; cu; cu = cu->cu_next)
+     if (cu->cu_kind == CU_PU)
+@@ -13259,25 +13274,38 @@ write_gdb_index (void)
+   /* Starting with version 7 CU indexes are limited to 24 bits,
+      so if we have more CUs, give up.  */
+   if (npus + ncus + ntus - ndelcus >= (1U << 24))
+-    return;
++    {
++      if (file)
++	error (0, 0, "%s: Cannot write %u CUs to .gdb_index",
++	       file, npus + ncus + ntus - ndelcus);
++      return;
++    }
+ 
+   if (unlikely (op_multifile))
+     {
+       assert (ncus == 0 && ntus == 0);
++      /* Version 9 index contain an (empty) shortcut table of 2 32bit
++	 entries (8 byte).  */
+       debug_sections[GDB_INDEX].new_size
+-	= 0x18 + npus * 16 + 16;
++	= headersize + npus * 16 + 16 + (ver >= 9 ? 8 : 0);
+       gdb_index = malloc (debug_sections[GDB_INDEX].new_size);
+       if (gdb_index == NULL)
+ 	dwz_oom ();
+       debug_sections[GDB_INDEX].new_data = gdb_index;
+       /* Write new header.  */
+       buf_write_le32 (gdb_index + 0x00, ver);
+-      buf_write_le32 (gdb_index + 0x04, 0x18);
+-      buf_write_le32 (gdb_index + 0x08, 0x18 + npus * 16);
+-      buf_write_le32 (gdb_index + 0x0c, 0x18 + npus * 16);
+-      buf_write_le32 (gdb_index + 0x10, 0x18 + npus * 16);
+-      buf_write_le32 (gdb_index + 0x14, 0x18 + npus * 16 + 16);
+-      ptr = gdb_index + 0x18;
++      buf_write_le32 (gdb_index + 0x04, headersize);
++      buf_write_le32 (gdb_index + 0x08, headersize + npus * 16);
++      buf_write_le32 (gdb_index + 0x0c, headersize + npus * 16);
++      buf_write_le32 (gdb_index + 0x10, headersize + npus * 16);
++      if (ver >= 9)
++	{
++	  buf_write_le32 (gdb_index + 0x14, headersize + npus * 16 + 16);
++	  buf_write_le32 (gdb_index + 0x18, headersize + npus * 16 + 16 + 8);
++	}
++      else
++	buf_write_le32 (gdb_index + 0x14, headersize + npus * 16 + 16);
++      ptr = gdb_index + headersize;
+       /* Write new CU list.  */
+       for (cu = first_cu; cu; cu = cu->cu_next)
+ 	{
+@@ -13290,6 +13318,10 @@ write_gdb_index (void)
+ 	}
+       /* Write an empty hash table (with two entries).  */
+       memset (ptr, '\0', 16);
++      /* Write an empty shortcut table (two zero offset types,
++	 indicating no main function or language).  */
++      if (ver >= 9)
++	memset (ptr + 16, '\0', 8);
+       return;
+     }
+ 
+@@ -13297,18 +13329,34 @@ write_gdb_index (void)
+   cutypesoff = buf_read_ule32 (inptr + 0x08);
+   addressoff = buf_read_ule32 (inptr + 0x0c);
+   symboloff = buf_read_ule32 (inptr + 0x10);
+-  constoff = buf_read_ule32 (inptr + 0x14);
+-  if (culistoff != 0x18
+-      || cutypesoff != 0x18 + ncus * 16
++  if (ver >= 9)
++    {
++      shortcutoff = buf_read_ule32 (inptr + 0x14);
++      constoff = buf_read_ule32 (inptr + 0x18);
++      nextoff = shortcutoff;
++    }
++  else
++    {
++      shortcutoff = 0;
++      constoff = buf_read_ule32 (inptr + 0x14);
++      nextoff = constoff;
++    }
++
++  if (culistoff != headersize
++      || cutypesoff != headersize + ncus * 16
+       || addressoff != cutypesoff + ntus * 24
+       || symboloff < addressoff
+       || ((symboloff - addressoff) % 20) != 0
+-      || constoff < symboloff
+-      || ((constoff - symboloff) & (constoff - symboloff - 1)) != 0
+-      || ((constoff - symboloff) & 7) != 0
++      || nextoff < symboloff
++      || ((nextoff - symboloff) & (nextoff - symboloff - 1)) != 0
++      || ((nextoff - symboloff) & 7) != 0
+       || debug_sections[GDB_INDEX].size < constoff)
+-    return;
+-  inptr += 0x18;
++    {
++      if (file)
++	error (0, 0, "%s: Unexpected offsets in .gdb_index", file);
++      return;
++    }
++  inptr += headersize;
+   if (ndelcus)
+     cumap = (unsigned int *)
+ 	    obstack_alloc (&ob2, ncus * sizeof (unsigned int));
+@@ -13319,6 +13367,8 @@ write_gdb_index (void)
+ 	  {
+ 	    if (cumap)
+ 	      obstack_free (&ob2, (void *) cumap);
++	    if (file)
++	      error (0, 0, "%s: unexpected cu cu_offset in .gdb_index", file);
+ 	    return;
+ 	  }
+ 	inptr += 16;
+@@ -13353,6 +13403,8 @@ write_gdb_index (void)
+ 	      obstack_free (&ob2, (void *) cumap);
+ 	    else
+ 	      obstack_free (&ob2, (void *) tuindices);
++	    if (file)
++	      error (0, 0, "%s: unexpected tui cu_offset in .gdb_index", file);
+ 	    return;
+ 	  }
+     }
+@@ -13375,8 +13427,16 @@ write_gdb_index (void)
+   buf_write_le32 (gdb_index + 0x08, cutypesoff + npus * 16 - ndelcus * 16);
+   buf_write_le32 (gdb_index + 0x0c, addressoff + npus * 16 - ndelcus * 16);
+   buf_write_le32 (gdb_index + 0x10, symboloff + npus * 16 - ndelcus * 16);
+-  buf_write_le32 (gdb_index + 0x14, constoff + npus * 16 - ndelcus * 16);
+-  ptr = gdb_index + 0x18;
++  if (ver >= 9)
++    {
++      buf_write_le32 (gdb_index + 0x14,
++		      shortcutoff + npus * 16 - ndelcus * 16);
++      buf_write_le32 (gdb_index + 0x18,
++		      constoff + npus * 16 - ndelcus * 16);
++    }
++  else
++    buf_write_le32 (gdb_index + 0x14, constoff + npus * 16 - ndelcus * 16);
++  ptr = gdb_index + headersize;
+   /* Write new CU list.  */
+   for (cu = first_cu; cu; cu = cu_next)
+     {
+@@ -13434,12 +13494,43 @@ write_gdb_index (void)
+       inptr += 20;
+     }
+   /* Copy the symbol hash table.  */
+-  memcpy (ptr, inptr, constoff - symboloff);
++  memcpy (ptr, inptr, nextoff - symboloff);
+   /* Clear the const pool initially.  */
+-  memset (ptr + (constoff - symboloff), '\0',
++  memset (ptr + (nextoff - symboloff) + (ver < 9 ? 0 : 8), '\0',
+ 	  debug_sections[GDB_INDEX].size - constoff);
++  /* Copy the shortcut table.  */
++  if (ver >= 9)
++    {
++      unsigned char *inscptr = inptr + (nextoff - symboloff);
++      unsigned char *scptr = ptr + (nextoff - symboloff);
++      uint32_t lang = buf_read_ule32 (inscptr);
++      uint32_t name = buf_read_ule32 (inscptr + 4);
++      buf_write_le32 (scptr, lang);
++      buf_write_le32 (scptr + 4, name);
++
++      /* If lang is not zero then put the name in the const table, it
++	 might not be an offset to the name of a symbol.  */
++      if (lang != 0)
++	{
++	  if (name > debug_sections[GDB_INDEX].size - constoff - 1
++	      || memrchr (debug_sections[GDB_INDEX].data
++			  + debug_sections[GDB_INDEX].size, '\0',
++			  debug_sections[GDB_INDEX].size
++			  - constoff - name) == NULL)
++	    {
++	      error (0, 0, "%s: bad shortcut table name in .gdb_index", file);
++	      goto fail;
++	    }
++	  strcpy ((char *) ptr + (constoff - symboloff) + name,
++		  (char *) inptr + (constoff - symboloff) + name);
++	}
++    }
+   ptr = ptr + (constoff - symboloff);
+-  end = inptr + (constoff - symboloff);
++  end = inptr + (nextoff - symboloff);
++  if (ver >= 9)
++    conststart = end + (constoff - nextoff);
++  else
++    conststart = end;
+   /* Finally copy over const objects into the const pool, strings as is,
+      CU vectors with CU indexes adjusted.  */
+   while (inptr < end)
+@@ -13450,9 +13541,11 @@ write_gdb_index (void)
+       inptr += 8;
+       if (name == 0 && cuvec == 0)
+ 	continue;
+-      if (name > debug_sections[GDB_INDEX].size - constoff - 1
+-	  || cuvec > debug_sections[GDB_INDEX].size - constoff - 4)
++      if (name > debug_sections[GDB_INDEX].size - nextoff - 1
++	  || cuvec > debug_sections[GDB_INDEX].size - nextoff - 4)
+ 	{
++	  if (file)
++	    error (0, 0, "%s: name or cuvec too large in .gdb_index", file);
+ 	fail:
+ 	  free (gdb_index);
+ 	  debug_sections[GDB_INDEX].new_size = 0;
+@@ -13460,26 +13553,36 @@ write_gdb_index (void)
+ 	}
+       if (ptr[name] == '\0')
+ 	{
+-	  unsigned char *strend = end + name;
++	  unsigned char *strend = conststart + name;
+ 	  while (*strend != '\0')
+ 	    {
+ 	      if (strend + 1
+-		  == end + (debug_sections[GDB_INDEX].size - constoff))
+-		goto fail;
++		  == conststart + (debug_sections[GDB_INDEX].size - constoff))
++		{
++		  if (file)
++		    error (0, 0, "%s: name too large in .gdb_index", file);
++		  goto fail;
++		}
+ 	      strend++;
+ 	    }
+-	  memcpy (ptr + name, end + name, strend + 1 - (end + name));
++	  memcpy (ptr + name, conststart + name,
++		  strend + 1 - (conststart + name));
+ 	}
+       if (buf_read_ule32 (ptr + cuvec) == 0)
+ 	{
+-	  unsigned int count = buf_read_ule32 (end + cuvec);
++	  unsigned int count = buf_read_ule32 (conststart + cuvec);
+ 	  if (count * 4
+ 	      > debug_sections[GDB_INDEX].size - constoff - cuvec - 4)
+-	    goto fail;
++	    {
++	      if (file)
++		error (0, 0, "%s: count (%u) too large in .gdb_index",
++		       file, count);
++	      goto fail;
++	    }
+ 	  buf_write_le32 (ptr + cuvec, count);
+ 	  for (i = 0; i < count; i++)
+ 	    {
+-	      j = buf_read_ule32 (end + cuvec + (i + 1) * 4);
++	      j = buf_read_ule32 (conststart + cuvec + (i + 1) * 4);
+ 	      if (ver >= 7)
+ 		k = j & ((1U << 24) - 1);
+ 	      else
+@@ -13506,6 +13609,9 @@ write_gdb_index (void)
+     obstack_free (&ob2, (void *) tuindices);
+   if (fail)
+     {
++      if (file)
++	error (0, 0, "%s: fail in .gdb_index", file);
++
+       free (debug_sections[GDB_INDEX].new_data);
+       debug_sections[GDB_INDEX].new_data = NULL;
+       debug_sections[GDB_INDEX].new_size = 0;
+@@ -15549,7 +15655,7 @@ dwz (const char *file, const char *outfile, struct file_result *res)
+ 	      report_progress ();
+ 	      fprintf (stderr, "write_gdb_index\n");
+ 	    }
+-	  write_gdb_index ();
++	  write_gdb_index (file);
+ 	  /* These sections are optional and it is unclear
+ 	     how to adjust them.  Just remove them.  */
+ 	  debug_sections[DEBUG_PUBNAMES].new_data = NULL;
+@@ -15808,7 +15914,7 @@ optimize_multifile (unsigned int *die_count)
+ 
+ 	  write_abbrev ();
+ 	  write_info (die_count);
+-	  write_gdb_index ();
++	  write_gdb_index (NULL);
+ 	  if (write_multifile_line ())
+ 	    goto fail;
+ 	}
+-- 
+2.43.5


                 reply	other threads:[~2024-11-06 11:29 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1730892402.ed3a59ce3689b466cfbf16633abb0b1fecb0761f.sam@gentoo \
    --to=sam@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox