From: "Paul A. Clarke" <pc@us.ibm.com>
To: Florian Weimer <fweimer@redhat.com>
Cc: libc-alpha@sourceware.org
Subject: Re: [PATCH 16/28] elf: Add glibc-hwcaps support for LD_LIBRARY_PATH
Date: Thu, 8 Oct 2020 18:16:11 -0500 [thread overview]
Message-ID: <20201008231611.GA44221@li-24c3614c-2adc-11b2-a85c-85f334518bdb.ibm.com> (raw)
In-Reply-To: <47cb6998ed91f70f122de115b2e03ea5e82e5884.1601569371.git.fweimer@redhat.com>
just a couple of nits found while browsing...
On Thu, Oct 01, 2020 at 06:33:16PM +0200, Florian Weimer via Libc-alpha wrote:
> diff --git a/elf/dl-hwcaps.c b/elf/dl-hwcaps.c
> index 44dbac099f..4de94759a2 100644
> --- a/elf/dl-hwcaps.c
> +++ b/elf/dl-hwcaps.c
> @@ -26,20 +26,97 @@
> #include <dl-procinfo.h>
> #include <dl-hwcaps.h>
>
> +/* This is the result of counting the substrings in a colon-separated
> + hwcaps string. */
> +struct count_hwcaps
> +{
> + /* Number of substrings. */
> + size_t count;
> +
> + /* Sum of the individual substring lengths (without separates or
separators?
> + null terminators). */
> + size_t total_length;
> +
> + /* Maximum length of an individual substring. */
> + size_t maximum_length;
> +};
> +
> +/* Update *COUNTS according to the contents of HWCAPS. Skip over
> + entries whose bit is not set in MASK. */
> +static void
> +count_hwcaps (struct count_hwcaps *counts, const char *hwcaps,
> + int32_t bitmask, const char *mask)
> +{
> + struct dl_hwcaps_split_masked sp;
> + _dl_hwcaps_split_masked_init (&sp, hwcaps, bitmask, mask);
> + while (_dl_hwcaps_split_masked (&sp))
> + {
> + ++counts->count;
> + counts->total_length += sp.split.length;
> + if (sp.split.length > counts->maximum_length)
> + counts->maximum_length = sp.split.length;
> + }
> +}
> +
> +/* State for copy_hwcaps. Must be initialized to point to
> + the storage areas for the array and the strings themselves. */
> +struct copy_hwcaps
> +{
> + struct r_strlenpair *next_pair;
> + char *next_string;
> +};
> +
> +/* Copy HWCAPS into the string pairs and strings, advancing *TARGET.
> + Skip over entries whose bit is not set in MASK. */
> +static void
> +copy_hwcaps (struct copy_hwcaps *target, const char *hwcaps,
> + int32_t bitmask, const char *mask)
> +{
> + struct dl_hwcaps_split_masked sp;
> + _dl_hwcaps_split_masked_init (&sp, hwcaps, bitmask, mask);
> + while (_dl_hwcaps_split_masked (&sp))
> + {
> + target->next_pair->str = target->next_string;
> + char *slash = __mempcpy (__mempcpy (target->next_string,
> + GLIBC_HWCAPS_PREFIX,
> + strlen (GLIBC_HWCAPS_PREFIX)),
> + sp.split.segment, sp.split.length);
> + *slash = '/';
> + target->next_pair->len
> + = strlen (GLIBC_HWCAPS_PREFIX) + sp.split.length + 1;
> + ++target->next_pair;
> + target->next_string = slash + 1;
> + }
> +}
> +
> /* Return an array of useful/necessary hardware capability names. */
> const struct r_strlenpair *
> -_dl_important_hwcaps (size_t *sz, size_t *max_capstrlen)
> +_dl_important_hwcaps (const char *glibc_hwcaps_prepend,
> + const char *glibc_hwcaps_mask,
> + size_t *sz, size_t *max_capstrlen)
> {
> uint64_t hwcap_mask = GET_HWCAP_MASK();
> /* Determine how many important bits are set. */
> uint64_t masked = GLRO(dl_hwcap) & hwcap_mask;
> size_t cnt = GLRO (dl_platform) != NULL;
> size_t n, m;
> - size_t total;
> struct r_strlenpair *result;
> struct r_strlenpair *rp;
> char *cp;
>
> + /* glibc-hwcaps subdirectories. These are exempted from the power
> + set construction below below. */
remove one "below" :-)
> + int32_t hwcaps_subdirs_active = _dl_hwcaps_subdirs_active ();
> + struct count_hwcaps hwcaps_counts = { 0, };
> + count_hwcaps (&hwcaps_counts, glibc_hwcaps_prepend, -1, NULL);
> + count_hwcaps (&hwcaps_counts, _dl_hwcaps_subdirs, hwcaps_subdirs_active,
> + glibc_hwcaps_mask);
> +
> + /* Each hwcaps subdirectory has a GLIBC_HWCAPS_PREFIX string prefix
> + and a "/" suffix once stored in the result. */
> + size_t total = (hwcaps_counts.count * (strlen (GLIBC_HWCAPS_PREFIX) + 1)
> + + hwcaps_counts.total_length);
> +
> /* Count the number of bits set in the masked value. */
> for (n = 0; (~((1ULL << n) - 1) & masked) != 0; ++n)
> if ((masked & (1ULL << n)) != 0)
> diff --git a/elf/dl-hwcaps.h b/elf/dl-hwcaps.h
> index b66da59b89..a6453f15f3 100644
> --- a/elf/dl-hwcaps.h
> +++ b/elf/dl-hwcaps.h
> @@ -28,3 +33,81 @@
> # define GET_HWCAP_MASK() (0)
> # endif
> #endif
> +
> +#define GLIBC_HWCAPS_SUBDIRECTORY "glibc-hwcaps"
> +#define GLIBC_HWCAPS_PREFIX GLIBC_HWCAPS_SUBDIRECTORY "/"
> +
> +/* Used by _dl_hwcaps_split below, to split strings at ':'
> + separators. */
> +struct dl_hwcaps_split
> +{
> + const char *segment; /* Start of the current segment. */
> + size_t length; /* Number of bytes until ':' or NUL. */
> +};
> +
> +/* Prepare *S to parse SUBJECT, for future _dl_hwcaps_split calls. If
> + SUBJECT is NULL, it is treated as the empty string. */
> +static inline void
> +_dl_hwcaps_split_init (struct dl_hwcaps_split *s, const char *subject)
> +{
> + s->segment = subject;
> + /* The initial call to _dl_hwcaps_split will not skip anything. */
> + s->length = 0;
> +}
> +
> +/* Extract the next non-empty string segment, up to ':' or the null
> + terminator. Return true if one more segment was found, or false if
> + the end of the string was reached. On success, S->segment is the
> + start of the segment found, and S->length is its length.
> + (Typically, S->segment[S->length] is not null.) */
> +_Bool _dl_hwcaps_split (struct dl_hwcaps_split *s) attribute_hidden;
> +
> +/* Similar to dl_hwcaps_split, but with bit-based and name-based
> + masking. */
> +struct dl_hwcaps_split_masked
> +{
> + struct dl_hwcaps_split split;
> +
> + /* For used by the iterator implementation. */
> + const char *mask;
> + int32_t bitmask;
> +};
> +
> +/* Prepare *S for iteration with _dl_hwcaps_split_masked. Only HWCAP
> + names in SUBJECT whose bit is set in BITMASK and whose ane is in
s/ane/name/ ?
> + MASK will be returned. SUBJECT must not contain empty HWCAP names.
> + If MASK is NULL, no name-based masking is applied. Likewise for
> + BITMASK if BITMASK is -1 (infinite number of bits). */
> +static inline void
> +_dl_hwcaps_split_masked_init (struct dl_hwcaps_split_masked *s,
> + const char *subject,
> + int32_t bitmask, const char *mask)
> +{
> + _dl_hwcaps_split_init (&s->split, subject);
> + s->bitmask = bitmask;
> + s->mask = mask;
> +}
> +
> +/* Like _dl_hwcaps_split, but apply masking. */
> +_Bool _dl_hwcaps_split_masked (struct dl_hwcaps_split_masked *s)
> + attribute_hidden;
> +
> +/* Returns true if the colon-separated HWCAP list HWCAPS contains the
> + capability NAME (with length NAME_LENGTH). If HWCAPS is NULL, the
> + function returns true. */
> +_Bool _dl_hwcaps_contains (const char *hwcaps, const char *name,
> + size_t name_length) attribute_hidden;
> +
> +/* Colon-separated string of glibc-hwcaps subdirectories, without the
> + "glibc-hwcaps/" prefix. The most preferred subdirectory needs to
> + be listed first. */
> +extern const char _dl_hwcaps_subdirs[] attribute_hidden;
> +
> +/* Returns a bitmap of active subdirectories in _dl_hwcaps_subdirs.
> + Bit 0 (the LSB) corresponds to the first substring in
> + _dl_hwcaps_subdirs, bit 1 to the second substring, and so on.
> + There is no direct correspondence between HWCAP bitmasks and this
> + bitmask. */
> +int32_t _dl_hwcaps_subdirs_active (void) attribute_hidden;
> +
> +#endif /* _DL_HWCAPS_H */
PC
next prev parent reply other threads:[~2020-10-08 23:16 UTC|newest]
Thread overview: 103+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-01 16:31 [PATCH 00/28] glibc-hwcaps support Florian Weimer
2020-10-01 16:31 ` [PATCH 01/28] elf: Do not search HWCAP subdirectories in statically linked binaries Florian Weimer
2020-10-01 18:22 ` Adhemerval Zanella
2020-10-01 18:24 ` Carlos O'Donell
2020-10-01 18:29 ` Adhemerval Zanella
2020-10-01 20:24 ` Carlos O'Donell
2020-10-01 16:31 ` [PATCH 02/28] elf: Implement __rtld_malloc_is_full Florian Weimer
2020-10-01 18:23 ` Adhemerval Zanella
2020-10-08 9:44 ` Florian Weimer
2020-10-01 16:31 ` [PATCH 03/28] elf: Implement _dl_write Florian Weimer
2020-10-05 19:46 ` Adhemerval Zanella
2020-10-01 16:31 ` [PATCH 04/28] elf: Extract command-line/environment variables state from rtld.c Florian Weimer
2020-10-06 20:45 ` Adhemerval Zanella
2020-10-08 11:32 ` Florian Weimer
2020-10-01 16:32 ` [PATCH 05/28] elf: Move ld.so error/help output to _dl_usage Florian Weimer
2020-10-06 21:06 ` Adhemerval Zanella
2020-10-08 12:19 ` Florian Weimer
2020-10-01 16:32 ` [PATCH 06/28] elf: Record whether paths come from LD_LIBRARY_PATH or --library-path Florian Weimer
2020-10-07 16:39 ` Adhemerval Zanella
2020-10-07 16:49 ` Florian Weimer
2020-10-01 16:32 ` [PATCH 07/28] elf: Implement ld.so --help Florian Weimer
2020-10-07 17:16 ` Adhemerval Zanella
2020-10-08 13:13 ` Florian Weimer
2020-10-01 16:32 ` [PATCH 08/28] elf: Implement ld.so --version Florian Weimer
2020-10-07 18:36 ` Adhemerval Zanella
2020-10-07 18:38 ` Adhemerval Zanella
2020-10-08 13:37 ` Florian Weimer
2020-10-01 16:32 ` [PATCH 09/28] scripts/update-copyrights: Update csu/version.c, elf/dl-usage.c Florian Weimer
2020-10-07 18:41 ` Adhemerval Zanella
2020-10-01 16:32 ` [PATCH 10/28] elf: Use the term "program interpreter" in the ld.so help message Florian Weimer
2020-10-07 21:08 ` Adhemerval Zanella
2020-10-08 14:08 ` Florian Weimer
2020-10-01 16:32 ` [PATCH 11/28] elf: Print the full name of the dynamic loader " Florian Weimer
2020-10-08 12:38 ` Adhemerval Zanella
2020-10-01 16:32 ` [PATCH 12/28] elf: Make __rtld_env_path_list and __rtld_search_dirs global variables Florian Weimer
2020-10-08 13:27 ` Adhemerval Zanella
2020-10-01 16:32 ` [PATCH 13/28] elf: Add library search path information to ld.so --help Florian Weimer
2020-10-08 16:22 ` Adhemerval Zanella
2020-10-01 16:33 ` [PATCH 14/28] elf: Enhance ld.so --help to print HWCAP subdirectories Florian Weimer
2020-10-08 16:27 ` Adhemerval Zanella
2020-10-09 8:18 ` Florian Weimer
2020-10-09 13:49 ` Matheus Castanho
2020-10-09 17:08 ` Florian Weimer
2020-10-09 17:12 ` Florian Weimer
2020-10-09 18:54 ` Matheus Castanho
2020-10-12 9:47 ` Florian Weimer
2020-10-01 16:33 ` [PATCH 15/28] elf: Do not pass GLRO(dl_platform), GLRO(dl_platformlen) to _dl_important_hwcaps Florian Weimer
2020-10-08 18:04 ` Adhemerval Zanella
2020-10-01 16:33 ` [PATCH 16/28] elf: Add glibc-hwcaps support for LD_LIBRARY_PATH Florian Weimer
2020-10-08 10:13 ` Szabolcs Nagy
2020-10-09 9:08 ` Florian Weimer
2020-10-09 10:50 ` Szabolcs Nagy
2020-10-09 10:55 ` Florian Weimer
2020-10-09 11:03 ` Szabolcs Nagy
2020-10-08 23:16 ` Paul A. Clarke [this message]
2020-10-09 8:56 ` Florian Weimer
2020-10-09 13:19 ` Adhemerval Zanella
2020-10-12 11:54 ` Florian Weimer
2020-10-01 16:33 ` [PATCH 17/28] x86_64: Add glibc-hwcaps support Florian Weimer
2020-10-01 16:33 ` [PATCH 18/28] powerpc64le: " Florian Weimer
2020-10-01 18:56 ` Paul A. Clarke
2020-10-05 9:47 ` Florian Weimer
2020-10-05 19:15 ` Paul A. Clarke
2020-10-06 12:20 ` Florian Weimer
2020-10-06 17:45 ` Paul A. Clarke
2020-10-09 9:06 ` Florian Weimer
2020-10-01 16:33 ` [PATCH 19/28] s390x: Add " Florian Weimer
2020-10-01 16:33 ` [PATCH 20/28] aarch64: " Florian Weimer
2020-10-14 13:46 ` Adhemerval Zanella
2020-10-14 14:08 ` Florian Weimer
2020-10-14 14:15 ` Adhemerval Zanella
2020-10-14 14:37 ` Szabolcs Nagy
2020-10-14 14:43 ` Adhemerval Zanella
2020-10-14 15:13 ` Florian Weimer
2020-10-14 14:44 ` Florian Weimer
2020-10-14 15:09 ` Szabolcs Nagy
2020-10-01 16:33 ` [PATCH 21/28] elf: Add endianness markup to ld.so.cache Florian Weimer
2020-10-14 14:07 ` Adhemerval Zanella
2020-10-01 16:33 ` [PATCH 22/28] elf: Add extension mechanism " Florian Weimer
2020-10-15 17:52 ` Adhemerval Zanella
2020-10-30 12:22 ` Florian Weimer
2020-11-03 12:45 ` Adhemerval Zanella
2020-11-03 15:30 ` Florian Weimer
2020-10-01 16:34 ` [PATCH 23/28] elf: Unify old and new format cache handling code in ld.so Florian Weimer
2020-10-16 14:37 ` Adhemerval Zanella
2020-10-30 13:22 ` Florian Weimer
2020-11-03 13:02 ` Adhemerval Zanella
2020-10-01 16:34 ` [PATCH 24/28] elf: Implement a string table for ldconfig, with tail merging Florian Weimer
2020-10-20 14:25 ` Adhemerval Zanella
2020-10-30 17:08 ` Florian Weimer
2020-11-03 13:05 ` Adhemerval Zanella
2020-11-03 15:29 ` Florian Weimer
2020-10-01 16:34 ` [PATCH 25/28] elf: Implement tail merging of strings in ldconfig Florian Weimer
2020-10-22 21:08 ` Adhemerval Zanella
2020-10-30 17:36 ` Florian Weimer
2020-10-01 16:34 ` [PATCH 26/28] elf: In ldconfig, extract the new_sub_entry function from search_dir Florian Weimer
2020-10-27 13:15 ` Adhemerval Zanella
2020-10-01 16:34 ` [PATCH 27/28] elf: Process glibc-hwcaps subdirectories in ldconfig Florian Weimer
2020-10-27 17:28 ` Adhemerval Zanella
2020-11-04 11:57 ` Florian Weimer
2020-10-01 16:34 ` [PATCH 28/28] elf: Add glibc-hwcaps subdirectory support to ld.so cache processing Florian Weimer
2020-10-01 16:50 ` [PATCH 00/28] glibc-hwcaps support H.J. Lu
2020-10-01 16:54 ` Florian Weimer
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=20201008231611.GA44221@li-24c3614c-2adc-11b2-a85c-85f334518bdb.ibm.com \
--to=pc@us.ibm.com \
--cc=fweimer@redhat.com \
--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).