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
next prev 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).