public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Javier Pello <devel@otheo.eu>
To: libc-alpha@sourceware.org
Subject: [PATCH 4/4] elf: Simplify hwcaps power set string construction
Date: Mon, 5 Sep 2022 20:13:38 +0200	[thread overview]
Message-ID: <20220905201338.af2afde778758951b9f4e787@otheo.eu> (raw)
In-Reply-To: <20220905200652.d69204581d15c64647da5cd2@otheo.eu>

The power set strings in _dl_important_hwcaps were being computed
in two passes, one to generate the strings and another one to store
the pointers in the result array. Do it in a single pass instead,
as this is simpler.

Signed-off-by: Javier Pello <devel@otheo.eu>
---
 elf/dl-hwcaps.c | 58 ++++++++++++++++++-------------------------------
 1 file changed, 21 insertions(+), 37 deletions(-)

diff --git a/elf/dl-hwcaps.c b/elf/dl-hwcaps.c
index b248f74b..93a9c56d 100644
--- a/elf/dl-hwcaps.c
+++ b/elf/dl-hwcaps.c
@@ -176,7 +176,6 @@ _dl_important_hwcaps (const char *glibc_hwcaps_prepend,
   size_t cnt = GLRO (dl_platform) != NULL;
   size_t n, m;
   struct r_strlenpair *result;
-  struct r_strlenpair *rp;
   char *cp;
 
   /* glibc-hwcaps subdirectories.  These are exempted from the power
@@ -304,63 +303,48 @@ _dl_important_hwcaps (const char *glibc_hwcaps_prepend,
 	      #3: 0, 3			1001
      This allows the representation of all possible combinations of
      capability names in the string.  First generate the strings.  */
-  result[1].str = result[0].str = cp;
+  struct r_strlenpair *rp = result;
+  n = 1 << (cnt - 1);
+  struct r_strlenpair *rq = rp + n;
 #define add(idx) \
       cp = __mempcpy (__mempcpy (cp, temp[idx].str, temp[idx].len), "/", 1);
-  n = 1 << (cnt - 1);
   do
     {
       n -= 2;
 
+      /* Strings in the first half include the first component. */
+      rp[1].str = rp[0].str = cp;
+
       /* We always add the last string.  */
       add (cnt - 1);
 
+      /* Strings in the second half start after the first component. */
+      rq[1].str = rq[0].str = cp;
+
       /* Add the strings which have the bit set in N.  */
       for (m = cnt - 2; m > 0; --m)
 	if ((n & (1 << m)) != 0)
 	  add (m);
 
+      /* Odd-numbered strings end before before the last component. */
+      rp[1].len = cp - rp[1].str;
+      rq[1].len = cp - rq[1].str;
+
       /* Always add the first string.  */
       add (0);
-    }
-  while (n != 0);
-#undef add
 
-  /* Now we are ready to install the string pointers and length.  */
-  for (n = 0; n < (1UL << cnt); ++n)
-    result[n].len = 0;
-  n = cnt;
-  do
-    {
-      size_t mask = 1 << --n;
+      /* Even-numbered strings include the last component. */
+      rp[0].len = cp - rp[0].str;
+      rq[0].len = cp - rq[0].str;
 
-      rp = result;
-      for (m = 1 << cnt; m > 0; ++rp)
-	if ((--m & mask) != 0)
-	  rp->len += temp[n].len + 1;
+      rp += 2;
+      rq += 2;
     }
   while (n != 0);
+#undef add
 
-  /* The first half of the strings all include the first string.  */
-  n = (1 << cnt) - 2;
-  rp = &result[2];
-  while (n != (1UL << (cnt - 1)))
-    {
-      if ((--n & 1) != 0)
-	rp[0].str = rp[-2].str + rp[-2].len;
-      else
-	rp[0].str = rp[-1].str;
-      ++rp;
-    }
-
-  /* The second half starts right after the first part of the string of
-     the corresponding entry in the first half.  */
-  do
-    {
-      rp[0].str = rp[-(1 << (cnt - 1))].str + temp[cnt - 1].len + 1;
-      ++rp;
-    }
-  while (--n != 0);
+  /* Assert that we got memory allocation right. */
+  assert (cp == (char *) (overall_result + *sz) + total);
 
   /* The maximum string length.  */
   if (result[0].len > hwcaps_counts.maximum_length)
-- 
2.36.0

  parent reply	other threads:[~2022-09-05 18:14 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-05 18:06 [PATCH 0/4] elf: Fix hwcaps string size overestimation Javier Pello
2022-09-05 18:09 ` [PATCH 1/4] " Javier Pello
2022-09-08 10:15   ` Florian Weimer
2022-09-05 18:10 ` [PATCH 2/4] elf: Simplify hwcaps masked value bit counting Javier Pello
2022-09-05 18:12 ` [PATCH 3/4] elf: Remove unneeded conditional in _dl_important_hwcaps Javier Pello
2022-09-05 18:13 ` Javier Pello [this message]
2022-09-06  7:35 ` [PATCH 0/4] elf: Fix hwcaps string size overestimation Florian Weimer
2022-09-06 18:12   ` Javier Pello
2022-09-08 11:23     ` Florian Weimer
2022-09-14 18:07       ` [PATCH 0/6] Remove legacy hwcaps support Javier Pello
2022-09-14 18:08         ` [PATCH 1/6] elf: Remove legacy hwcaps support from the dynamic loader Javier Pello
2022-09-14 18:10         ` [PATCH 2/6] elf: Remove legacy hwcaps support from ldconfig Javier Pello
2022-09-14 18:10         ` [PATCH 3/6] elf: Remove hwcap parameter from add_to_cache signature Javier Pello
2022-09-14 18:12         ` [PATCH 4/6] elf: Remove hwcap and bits_hwcap fields from struct cache_entry Javier Pello
2022-09-14 18:13         ` [PATCH 5/6] elf: Remove _dl_string_hwcap Javier Pello
2022-09-14 18:15         ` [PATCH 6/6] elf: Simplify output of hwcap subdirectories in ld.so help Javier Pello
2022-09-15  8:42           ` Carlos O'Donell
2022-09-15 19:12             ` Javier Pello
2022-09-14 21:23         ` [PATCH 0/6] Remove legacy hwcaps support Joseph Myers
2022-09-17 14:17         ` [PATCH v2 " Javier Pello
2022-09-17 14:18           ` [PATCH v2 1/6] elf: Remove legacy hwcaps support from the dynamic loader Javier Pello
2022-09-22 11:46             ` Florian Weimer
2022-09-17 14:19           ` [PATCH v2 2/6] elf: Remove legacy hwcaps support from ldconfig Javier Pello
2022-09-22 12:14             ` Florian Weimer
2022-09-17 14:20           ` [PATCH v2 3/6] elf: Remove hwcap parameter from add_to_cache signature Javier Pello
2022-09-22 16:02             ` Florian Weimer
2022-09-17 14:22           ` [PATCH v2 4/6] elf: Remove hwcap and bits_hwcap fields from struct cache_entry Javier Pello
2022-09-22 16:03             ` Florian Weimer
2022-09-17 14:23           ` [PATCH v2 5/6] elf: Remove _dl_string_hwcap Javier Pello
2022-09-17 14:24           ` [PATCH v2 6/6] elf: Simplify output of hwcap subdirectories in ld.so help Javier Pello
2022-09-21 16:26           ` [PATCH v2 0/6] Remove legacy hwcaps support Joseph Myers
2022-09-27 18:03           ` [PATCH v3 0/8] " Javier Pello
2022-09-27 18:05             ` [PATCH v3 1/8] x86_64: Remove platform directory library loading test Javier Pello
2022-10-03 14:56               ` Adhemerval Zanella Netto
2022-10-04 17:53                 ` Javier Pello
2022-10-04 17:59                   ` Adhemerval Zanella Netto
2022-09-27 18:05             ` [PATCH v3 2/8] elf: Remove legacy hwcaps support from the dynamic loader Javier Pello
2022-09-27 18:06             ` [PATCH v3 3/8] elf: Remove legacy hwcaps support from ldconfig Javier Pello
2022-10-03 15:31               ` Adhemerval Zanella Netto
2022-09-27 18:07             ` [PATCH v3 4/8] elf: Remove hwcap parameter from add_to_cache signature Javier Pello
2022-09-27 18:08             ` [PATCH v3 5/8] elf: Remove hwcap and bits_hwcap fields from struct cache_entry Javier Pello
2022-09-27 18:08             ` [PATCH v3 6/8] Add NEWS entry for legacy hwcaps removal Javier Pello
2022-10-03 15:44               ` Adhemerval Zanella Netto
2022-10-03 19:29                 ` Andreas Schwab
2022-10-03 19:49                   ` Adhemerval Zanella Netto
2022-10-03 19:59                     ` Florian Weimer
2022-10-04 18:00                       ` Adhemerval Zanella Netto
2022-10-05 18:12                         ` Javier Pello
2022-10-06 11:03                           ` Adhemerval Zanella Netto
2022-09-27 18:09             ` [PATCH v3 7/8] elf: Remove _dl_string_hwcap Javier Pello
2022-10-03 16:52               ` Adhemerval Zanella Netto
2022-09-27 18:10             ` [PATCH v3 8/8] elf: Simplify output of hwcap subdirectories in ld.so help Javier Pello
2022-10-03 17:02               ` Adhemerval Zanella Netto

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=20220905201338.af2afde778758951b9f4e787@otheo.eu \
    --to=devel@otheo.eu \
    --cc=libc-alpha@sourceware.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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).