platform/upstream/glibc.git
3 years agomisc: syslog: Fix calls to openlog() with LOG_KERN facility (BZ #3604)
Dan Raymond [Tue, 13 Apr 2021 13:26:12 +0000 (10:26 -0300)]
misc: syslog: Fix calls to openlog() with LOG_KERN facility (BZ #3604)

POSIX states for syslog [1]:

  "Values of the priority argument are formed by OR'ing together a
  severity-level value and an optional facility value. If no
  facility value is specified, the current default facility value is
  used."

So the patch fixes an existing violation of the openlog interface contract
where it is ignoring the facility argument when the value is zero

It allows the use LOG_KERN by calling openlog prior syslog usage.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
[1] https://pubs.opengroup.org/onlinepubs/9699919799/functions/syslog.html

3 years agos390: Update ulps
Adhemerval Zanella [Tue, 13 Apr 2021 14:51:07 +0000 (11:51 -0300)]
s390: Update ulps

Required after 43576de04afc6 "Improve the accuracy of tgamma
(BZ #26983)"

3 years agoi386: Update ulps
Adhemerval Zanella [Tue, 13 Apr 2021 14:48:24 +0000 (11:48 -0300)]
i386: Update ulps

Required after 43576de04afc6 "Improve the accuracy of tgamma
(BZ #26983)"

3 years agoImprove documentation for malloc etc. (BZ#27719)
Paul Eggert [Mon, 12 Apr 2021 02:06:00 +0000 (19:06 -0700)]
Improve documentation for malloc etc. (BZ#27719)

Cover key corner cases (e.g., whether errno is set) that are well
settled in glibc, fix some examples to avoid integer overflow, and
update some other dated examples (code needed for K&R C, e.g.).
* manual/charset.texi (Non-reentrant String Conversion):
* manual/filesys.texi (Symbolic Links):
* manual/memory.texi (Allocating Cleared Space):
* manual/socket.texi (Host Names):
* manual/string.texi (Concatenating Strings):
* manual/users.texi (Setting Groups):
Use reallocarray instead of realloc, to avoid integer overflow issues.
* manual/filesys.texi (Scanning Directory Content):
* manual/memory.texi (The GNU Allocator, Hooks for Malloc):
* manual/tunables.texi:
Use code font for 'malloc' instead of roman font.
(Symbolic Links): Don't assume readlink return value fits in 'int'.
* manual/memory.texi (Memory Allocation and C, Basic Allocation)
(Malloc Examples, Alloca Example):
* manual/stdio.texi (Formatted Output Functions):
* manual/string.texi (Concatenating Strings, Collation Functions):
Omit pointer casts that are needed only in ancient K&R C.
* manual/memory.texi (Basic Allocation):
Say that malloc sets errno on failure.
Say "convert" rather than "cast", since casts are no longer needed.
* manual/memory.texi (Basic Allocation):
* manual/string.texi (Concatenating Strings):
In examples, use C99 declarations after statements for brevity.
* manual/memory.texi (Malloc Examples): Add portability notes for
malloc (0), errno setting, and PTRDIFF_MAX.
(Changing Block Size): Say that realloc (p, 0) acts like
(p ? (free (p), NULL) : malloc (0)).
Add xreallocarray example, since other examples can use it.
Add portability notes for realloc (0, 0), realloc (p, 0),
PTRDIFF_MAX, and improve notes for reallocating to the same size.
(Allocating Cleared Space): Reword now-confusing discussion
about replacement, and xref "Replacing malloc".
* manual/stdio.texi (Formatted Output Functions):
Don't assume message size fits in 'int'.
* manual/string.texi (Concatenating Strings):
Fix undefined behavior involving arithmetic on a freed pointer.

3 years agolinux: always update select timeout (BZ #27706)
Adhemerval Zanella [Thu, 8 Apr 2021 10:39:32 +0000 (07:39 -0300)]
linux: always update select timeout (BZ #27706)

The timeout should be updated even on failure for time64 support.

Checked on i686-linux-gnu.

3 years agolinux: Normalize and return timeout on select (BZ #27651)
Adhemerval Zanella [Wed, 31 Mar 2021 16:53:34 +0000 (13:53 -0300)]
linux: Normalize and return timeout on select (BZ #27651)

The commit 2433d39b697, which added time64 support to select, changed
the function to use __NR_pselect6 (or __NR_pelect6_time64) on all
architectures.  However, on architectures where the symbol was
implemented with __NR_select the kernel normalizes the passed timeout
instead of return EINVAL.  For instance, the input timeval
{ 0, 5000000 } is interpreted as { 5, 0 }.

And as indicated by BZ #27651, this semantic seems to be expected
and changing it results in some performance issues (most likely
the program does not check the return code and keeps issuing
select with unormalized tv_usec argument).

To avoid a different semantic depending whether which syscall the
architecture used to issue, select now always normalize the timeout
input.  This is a slight change for some ABIs (for instance aarch64).

Checked on x86_64-linux-gnu and i686-linux-gnu.

3 years agolibsupport: Add support_select_normalizes_timeout
Adhemerval Zanella [Fri, 9 Apr 2021 13:05:13 +0000 (10:05 -0300)]
libsupport: Add support_select_normalizes_timeout

It will be used on a select() test.

3 years agolibsupport: Add support_select_modifies_timeout
Adhemerval Zanella [Fri, 9 Apr 2021 13:02:30 +0000 (10:02 -0300)]
libsupport: Add support_select_modifies_timeout

It will be used on a select() test.

3 years agoFix SXID_ERASE behavior in setuid programs (BZ #27471)
Siddhesh Poyarekar [Tue, 16 Mar 2021 07:07:55 +0000 (12:37 +0530)]
Fix SXID_ERASE behavior in setuid programs (BZ #27471)

When parse_tunables tries to erase a tunable marked as SXID_ERASE for
setuid programs, it ends up setting the envvar string iterator
incorrectly, because of which it may parse the next tunable
incorrectly.  Given that currently the implementation allows malformed
and unrecognized tunables pass through, it may even allow SXID_ERASE
tunables to go through.

This change revamps the SXID_ERASE implementation so that:

- Only valid tunables are written back to the tunestr string, because
  of which children of SXID programs will only inherit a clean list of
  identified tunables that are not SXID_ERASE.

- Unrecognized tunables get scrubbed off from the environment and
  subsequently from the child environment.

- This has the side-effect that a tunable that is not identified by
  the setxid binary, will not be passed on to a non-setxid child even
  if the child could have identified that tunable.  This may break
  applications that expect this behaviour but expecting such tunables
  to cross the SXID boundary is wrong.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoEnhance setuid-tunables test
Siddhesh Poyarekar [Tue, 16 Mar 2021 07:07:54 +0000 (12:37 +0530)]
Enhance setuid-tunables test

Instead of passing GLIBC_TUNABLES via the environment, pass the
environment variable from parent to child.  This allows us to test
multiple variables to ensure better coverage.

The test list currently only includes the case that's already being
tested.  More tests will be added later.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agotst-env-setuid: Use support_capture_subprogram_self_sgid
Siddhesh Poyarekar [Tue, 16 Mar 2021 07:07:53 +0000 (12:37 +0530)]
tst-env-setuid: Use support_capture_subprogram_self_sgid

Use the support_capture_subprogram_self_sgid to spawn an sgid child.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agosupport: Add capability to fork an sgid child
Siddhesh Poyarekar [Fri, 9 Apr 2021 15:25:45 +0000 (20:55 +0530)]
support: Add capability to fork an sgid child

Add a new function support_capture_subprogram_self_sgid that spawns an
sgid child of the running program with its own image and returns the
exit code of the child process.  This functionality is used by at
least three tests in the testsuite at the moment, so it makes sense to
consolidate.

There is also a new function support_subprogram_wait which should
provide simple system() like functionality that does not set up file
actions.  This is useful in cases where only the return code of the
spawned subprocess is interesting.

This patch also ports tst-secure-getenv to this new function.  A
subsequent patch will port other tests.  This also brings an important
change to tst-secure-getenv behaviour.  Now instead of succeeding, the
test fails as UNSUPPORTED if it is unable to spawn a setgid child,
which is how it should have been in the first place.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoarm: Fix an incorrect check in ____longjmp_chk [BZ #27709]
Szabolcs Nagy [Wed, 7 Apr 2021 11:45:53 +0000 (12:45 +0100)]
arm: Fix an incorrect check in ____longjmp_chk [BZ #27709]

An incorrect check in __longjmp_chk could fail on valid code causing

FAIL: debug/tst-longjmp_chk2

The original check was

  altstack_sp + altstack_size - setjmp_sp > altstack_size

i.e. sp at setjmp was outside of the altstack range. Here we know that
longjmp is called from a signal handler on the altstack (SS_ONSTACK),
and that it jumps in the wrong direction (sp decreases), so the check
wants to ensure the jump goes to another stack.

The check is wrong when altstack_sp == setjmp_sp which can happen
when the altstack is a local buffer in the function that calls setjmp,
so the patch allows == too. This fixes bug 27709.

Note that the generic __longjmp_chk check seems to be different.
(it checks if longjmp was on the altstack but does not check setjmp,
so it would not catch incorrect longjmp use within the signal handler).

3 years agoFurther fixes for REALLOC_ZERO_BYTES_FREES comment
Paul Eggert [Mon, 12 Apr 2021 07:33:15 +0000 (00:33 -0700)]
Further fixes for REALLOC_ZERO_BYTES_FREES comment

* malloc/malloc.c (REALLOC_ZERO_BYTES_FREES): Improve comment further.

3 years agohurd: Export _hurd_libc_proc_init
Samuel Thibault [Sun, 11 Apr 2021 21:11:47 +0000 (23:11 +0200)]
hurd: Export _hurd_libc_proc_init

hurd's libdiskfs needs to be able to call _hurd_init + _hurd_libc_proc_init
for bootstrap initialization.

3 years agoFix REALLOC_ZERO_BYTES_FREES comment to match C17
Paul Eggert [Sun, 11 Apr 2021 21:39:20 +0000 (14:39 -0700)]
Fix REALLOC_ZERO_BYTES_FREES comment to match C17

* malloc/malloc.c (REALLOC_ZERO_BYTES_FREES):
Update comment to match current C standard.

3 years agopowerpc: Update libm test ulps
Tulio Magno Quites Machado Filho [Fri, 9 Apr 2021 20:41:22 +0000 (17:41 -0300)]
powerpc: Update libm test ulps

Update after commit 43576de04afc6a0896a3ecc094e1581069a0652a.

3 years agoarm: update libm test ulps
Szabolcs Nagy [Wed, 7 Apr 2021 11:45:42 +0000 (12:45 +0100)]
arm: update libm test ulps

Updated after commits 9acda61d94acc5348c2330f2519a14d1a4a37e73
and 43576de04afc6a0896a3ecc094e1581069a0652a.

3 years agoaarch64: update libm test ulps
Szabolcs Nagy [Thu, 8 Apr 2021 07:22:39 +0000 (08:22 +0100)]
aarch64: update libm test ulps

Update after commit 43576de04afc6a0896a3ecc094e1581069a0652a.

3 years agoImprove the accuracy of tgamma (BZ #26983)
Paul Zimmermann [Fri, 2 Apr 2021 06:21:06 +0000 (08:21 +0200)]
Improve the accuracy of tgamma (BZ #26983)

With this patch, the maximal known error for tgamma is now reduced to 9 ulps
for dbl-64, for all rounding modes. Since exhaustive testing is not possible
for dbl-64, it might be that there are still cases with an error larger than
9 ulps, but all known cases are fixed (intensive tests were done to find cases
with large errors).

Tested on x86_64 and powerpc (and by Adhemerval Zanella on aarch64, arm,
s390x, sparc, and i686).
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agotunables: Fix comparison of tunable values
Siddhesh Poyarekar [Tue, 16 Mar 2021 13:01:02 +0000 (18:31 +0530)]
tunables: Fix comparison of tunable values

The simplification of tunable_set interfaces took care of
signed/unsigned conversions while setting values, but comparison with
bounds ended up being incorrect; comparing TUNABLE_SIZE_T values for
example will fail because SIZE_MAX is seen as -1.

Add comparison helpers that take tunable types into account and use
them to do comparison instead.

3 years agosys: Fixes possible typo in comment: statfs -> statvfs
Hugo Gabriel Eyherabide [Mon, 5 Apr 2021 19:08:19 +0000 (22:08 +0300)]
sys: Fixes possible typo in comment: statfs -> statvfs

3 years agomalloc: Run tst-malloc-stats-cancellation via test-driver.c
Arjun Shankar [Tue, 6 Apr 2021 22:30:11 +0000 (00:30 +0200)]
malloc: Run tst-malloc-stats-cancellation via test-driver.c

This allows the test to time out in case it hangs.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoUpdate hppa libm-test-ulps
John David Anglin [Tue, 6 Apr 2021 18:55:58 +0000 (18:55 +0000)]
Update hppa libm-test-ulps

3 years agom68: Fix build after 9acda61d94ac
Adhemerval Zanella [Tue, 6 Apr 2021 18:10:31 +0000 (15:10 -0300)]
m68: Fix build after 9acda61d94ac

The j0f/j1f/y0f/y1f now uses __inv_pio4.

3 years agoUpdate sv_SE to treate 'W' as a distinct character (Bug 25036)
Sebastian Rasmussen [Thu, 18 Mar 2021 21:21:43 +0000 (17:21 -0400)]
Update sv_SE to treate 'W' as a distinct character (Bug 25036)

The 13th edition of Svenska Akademiens ordlista lists 'W' as a
distinct letter that sorts after 'V'. We adjust the sv_SE locale
(and tests) to match this updated and "reformed" language change.
This harmonizes us with CLDR 1.5.0 (2007) for sv_SE sorting of
the letter 'W'.

No regressions on x86_64, and locale sorting tests all pass.

Co-authored-by: Carlos O'Donell <carlos@redhat.com>
3 years agoelf: Fix data race in _dl_name_match_p [BZ #21349]
Maninder Singh [Wed, 10 Jan 2018 15:17:30 +0000 (15:17 +0000)]
elf: Fix data race in _dl_name_match_p [BZ #21349]

dlopen updates libname_list by writing to lastp->next, but concurrent
reads in _dl_name_match_p were not synchronized when it was called
without holding GL(dl_load_lock), which can happen during lazy symbol
resolution.

This patch fixes the race between _dl_name_match_p reading lastp->next
and add_name_to_object writing to it. This could cause segfault on
targets with weak memory order when lastp->next->name is read, which
was observed on an arm system. Fixes bug 21349.

(Code is from Maninder Singh, comments and description is from Szabolcs
Nagy.)

Co-authored-by: Vaneet Narang <v.narang@samsung.com>
Co-authored-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoaarch64: free tlsdesc data on dlclose [BZ #27403]
Szabolcs Nagy [Thu, 11 Feb 2021 13:38:10 +0000 (13:38 +0000)]
aarch64: free tlsdesc data on dlclose [BZ #27403]

DL_UNMAP_IS_SPECIAL and DL_UNMAP were not defined. The definitions are
now copied from arm, since the same is needed on aarch64. The cleanup
of tlsdesc data is handled by the custom _dl_unmap.

Fixes bug 27403.

3 years agoia64: Update ulps
Adhemerval Zanella [Mon, 5 Apr 2021 13:11:09 +0000 (10:11 -0300)]
ia64: Update ulps

Required after 9acda61d94acc "Fix the inaccuracy of j0f/j1f/y0f/y1f
[BZ #14469, #14470, #14471, #14472]" and db3f7bb558 "math: Remove
slow paths from asin and acos [BZ #15267]".

3 years agoia64: Fix build after 9acda61d94ac
Adhemerval Zanella [Mon, 5 Apr 2021 13:03:12 +0000 (10:03 -0300)]
ia64: Fix build after 9acda61d94ac

The j0f/j1f/y0f/y1f now uses __inv_pio4 and call roundf (which turns
to __roundf on ia64).

3 years agoi386: Update ulps
Adhemerval Zanella [Sun, 4 Apr 2021 14:02:12 +0000 (11:02 -0300)]
i386: Update ulps

Required after 9acda61d94acc "Fix the inaccuracy of j0f/j1f/y0f/y1f
[BZ #14469, #14470, #14471, #14472]".

3 years agoFix the inaccuracy of j0f/j1f/y0f/y1f [BZ #14469, #14470, #14471, #14472]
Paul Zimmermann [Thu, 1 Apr 2021 06:14:10 +0000 (08:14 +0200)]
Fix the inaccuracy of j0f/j1f/y0f/y1f [BZ #14469, #14470, #14471, #14472]

For j0f/j1f/y0f/y1f, the largest error for all binary32
inputs is reduced to at most 9 ulps for all rounding modes.

The new code is enabled only when there is a cancellation at the very end of
the j0f/j1f/y0f/y1f computation, or for very large inputs, thus should not
give any visible slowdown on average.  Two different algorithms are used:

* around the first 64 zeros of j0/j1/y0/y1, approximation polynomials of
  degree 3 are used, computed using the Sollya tool (https://www.sollya.org/)

* for large inputs, an asymptotic formula from [1] is used

[1] Fast and Accurate Bessel Function Computation,
    John Harrison, Proceedings of Arith 19, 2009.

Inputs yielding the new largest errors are added to auto-libm-test-in,
and ulps are regenerated for various targets (thanks Adhemerval Zanella).

Tested on x86_64 with --disable-multi-arch and on powerpc64le-linux-gnu.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agox86-64: Fix ifdef indentation in strlen-evex.S
Sunil K Pandey [Thu, 1 Apr 2021 22:47:04 +0000 (15:47 -0700)]
x86-64: Fix ifdef indentation in strlen-evex.S

Fix some indentations of ifdef in file strlen-evex.S which are off by 1
and confusing to read.

3 years agoUpdate Nios II libm-test-ulps.
Joseph Myers [Thu, 1 Apr 2021 19:41:40 +0000 (19:41 +0000)]
Update Nios II libm-test-ulps.

3 years agosocket: Add CFLAGS-accept.c and CFLAGS-connect.c
Adhemerval Zanella [Thu, 1 Apr 2021 17:43:08 +0000 (14:43 -0300)]
socket: Add CFLAGS-accept.c and CFLAGS-connect.c

The c59f716993 (accept) and 3ddf9bc185 (connect) added on io/Makefile
instead of socket/Makefile.

Checked on arm-linux-gnueabihf (where without the flags both the
tst-cancelx4 and tst-cancelx5 fails).

3 years agoUpdate arm libm-tests-ulps
Adhemerval Zanella [Thu, 1 Apr 2021 17:02:05 +0000 (14:02 -0300)]
Update arm libm-tests-ulps

Required after db3f7bb558 "math: Remove slow paths from asin and
acos [BZ #15267]".

3 years agosupport: Fix hurd build after bfddda2570331d
Adhemerval Zanella [Thu, 1 Apr 2021 16:55:46 +0000 (13:55 -0300)]
support: Fix hurd build after bfddda2570331d

3 years agox86_64: Correct THREAD_SETMEM/THREAD_SETMEM_NC for movq [BZ #27591]
H.J. Lu [Tue, 16 Mar 2021 14:41:46 +0000 (07:41 -0700)]
x86_64: Correct THREAD_SETMEM/THREAD_SETMEM_NC for movq [BZ #27591]

config/i386/constraints.md in GCC has

(define_constraint "e"
  "32-bit signed integer constant, or a symbolic reference known
   to fit that range (for immediate operands in sign-extending x86-64
   instructions)."
  (match_operand 0 "x86_64_immediate_operand"))

Since movq takes a signed 32-bit immediate or a register source operand,
use "er", instead of "nr"/"ir", constraint for 32-bit signed integer
constant or register on movq.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agopowerpc64le: Use ifunc for _Float128 functions also in libc
Andreas Schwab [Wed, 31 Mar 2021 12:17:24 +0000 (14:17 +0200)]
powerpc64le: Use ifunc for _Float128 functions also in libc

This fixes missing definition of math functions in libc in a static link
that are no longer built for libm after commit 4898d9712b ("Avoid adding
duplicated symbols into static libraries").

3 years agoS390: Allow "v" constraint for long double math_opt_barrier and math_force_eval with...
Stefan Liebler [Wed, 31 Mar 2021 14:17:01 +0000 (16:17 +0200)]
S390: Allow "v" constraint for long double math_opt_barrier and math_force_eval with GCC 11.

Starting with GCC 11, long double values can also be processed in vector
registers if build with -march >= z14.  Then GCC defines the
__LONG_DOUBLE_VX__ macro.

FYI: GCC commit "IBM Z: Introduce __LONG_DOUBLE_VX__ macro"
https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=f47df2af313d2ce7f9149149010a142c2237beda

3 years agoio: fix spelling typo in diagnostic
Paul Eggert [Wed, 31 Mar 2021 21:03:25 +0000 (14:03 -0700)]
io: fix spelling typo in diagnostic

3 years agostdio-common/printf-prs.c: Reword comment
Alejandro Colomar \(man-pages\) [Wed, 24 Mar 2021 18:29:16 +0000 (19:29 +0100)]
stdio-common/printf-prs.c: Reword comment

'this' can be understood as the current parameter, but in this case it
is meaning the other one, the one holding the width/precission.

'it' better describes that parameter, differentiating it from the
one corresponding to the current specifier.

Signed-off-by: Alejandro Colomar <alx.manpages@gmail.com>
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agoio: Check at runtime if timestamp supports nanoseconds
Adhemerval Zanella [Mon, 29 Mar 2021 17:40:30 +0000 (14:40 -0300)]
io: Check at runtime if timestamp supports nanoseconds

Now that non-LFS stat function is implemented on to on LFS, it will
use statx when available.  It allows to check for nanosecond timestamp
if the kernel supports __NR_statx.

Checked on s390-linux-gnu with 4.12.14 kernel.

3 years agoFix conform linknamespace tests due to gnu_dev_makedev
Stefan Liebler [Wed, 31 Mar 2021 08:23:16 +0000 (10:23 +0200)]
Fix conform linknamespace tests due to gnu_dev_makedev

If building on s390 / i686 with -Os, various conformance
tests are failing with e.g.
conform/ISO/assert.h/linknamespace.out:
[initial] __assert_fail -> [libc.a(assert.o)] __dcgettext -> [libc.a(dcgettext.o)] __dcigettext -> [libc.a(dcigettext.o)] __getcwd -> [libc.a(getcwd.o)] __fstatat64 -> [libc.a(fstatat64.o)] gnu_dev_makedev

The usage of gnu_dev_makedev was recently introduced by
usage of the makedev makro in commit:
5b980d4809913088729982865188b754939bcd39
linux: Use statx for MIPSn64

This patch is now linking against __gnu_dev_makedev as
also done in commit:
8b4a118222c7ed41bc653943b542915946dff1dd
Fix -Os gnu_dev_* linknamespace, localplt issues (bug 15105, bug 19463).

3 years agomanual: clarify that scanf %n supports type modifiers
Alyssa Ross [Mon, 29 Mar 2021 11:45:04 +0000 (11:45 +0000)]
manual: clarify that scanf %n supports type modifiers

My initial reading of the %n documentation was that it didn't support
type conversions, because it only mentioned int*.

Corresponding man-pages patch:
https://lore.kernel.org/linux-man/20210328215509.31666-1-hi@alyssa.is/

Reviewed-by: Arjun Shankar <arjun@redhat.com>
3 years agoUpdate sparc libm-tests-ulps
Adhemerval Zanella [Tue, 30 Mar 2021 17:02:42 +0000 (14:02 -0300)]
Update sparc libm-tests-ulps

Required after db3f7bb558 "math: Remove slow paths from asin and
acos [BZ #15267]".

3 years agolibio: Update license on test case
Siddhesh Poyarekar [Tue, 30 Mar 2021 13:53:09 +0000 (19:23 +0530)]
libio: Update license on test case

About a decade ago, I accidentally wrote the GPLv3 license text on the
test case when the rest of glibc source is LGPL v2.1 or later.  As
original author of the test (and there are no other legally
significant changes to the test) I propose to update the license text
to be consistent with the project.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
3 years agoAvoid adding duplicated symbols into static libraries
Siddhesh Poyarekar [Tue, 30 Mar 2021 09:28:37 +0000 (14:58 +0530)]
Avoid adding duplicated symbols into static libraries

Some math functions (such as __isnan*) are built into both libm and
libc because they are needed in libc.  The symbol gets exported from
libc.so and not libm.so, because of which dynamic linking works fine;
the symbols are always resolved from libc.so and libm.so uses its
internal copy of the same function if needed.

When linking statically though, the libm variants get used throughout
because the symbols are exported in both archives and libm.a is
searched first.

This patch removes these duplicate objects from the libm.a archive so
that programs always link to libc in both, the static and dynamic
case.  The difference this will cause is that libm uses of these
functions will start using the libc versions in the !SHARED case.
This is harmless at the moment because the objects are identical
except for their names.

Some of these duplicates could be removed from libm.so too, but I
avoided that in the interest of retaining an internal reference if at
all those functions get used within libm in future.

Reviewed-by: Paul Zimmermann <Paul.Zimmermann@inria.fr>
3 years agoMove __isnanf128 to libc.so
Siddhesh Poyarekar [Tue, 30 Mar 2021 09:28:19 +0000 (14:58 +0530)]
Move __isnanf128 to libc.so

All of the isnan functions are in libc.so due to printf_fp, so move
__isnanf128 there too for consistency.

Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@ascii.art.br>
Reviewed-by: Florian Weimer <fweimer@redhat.com>
3 years agofork.h: replace with register-atfork.h
Samuel Thibault [Wed, 24 Mar 2021 20:27:34 +0000 (21:27 +0100)]
fork.h: replace with register-atfork.h

UNREGISTER_ATFORK is now defined for all ports in register-atfork.h, so most
previous includes of fork.h actually only need register-atfork.h now, and
cxa_finalize.c does not need an ifdef UNREGISTER_ATFORK any more.

The nptl-specific fork generation counters can then go to pthreadP.h, and
fork.h be removed.

Checked on x86_64-linux-gnu and i686-gnu.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
3 years agox86-64: Use ZMM16-ZMM31 in AVX512 memmove family functions
H.J. Lu [Sun, 7 Mar 2021 17:45:23 +0000 (09:45 -0800)]
x86-64: Use ZMM16-ZMM31 in AVX512 memmove family functions

Update ifunc-memmove.h to select the function optimized with AVX512
instructions using ZMM16-ZMM31 registers to avoid RTM abort with usable
AVX512VL since VZEROUPPER isn't needed at function exit.

3 years agox86-64: Use ZMM16-ZMM31 in AVX512 memset family functions
H.J. Lu [Sun, 7 Mar 2021 17:44:18 +0000 (09:44 -0800)]
x86-64: Use ZMM16-ZMM31 in AVX512 memset family functions

Update ifunc-memset.h/ifunc-wmemset.h to select the function optimized
with AVX512 instructions using ZMM16-ZMM31 registers to avoid RTM abort
with usable AVX512VL and AVX512BW since VZEROUPPER isn't needed at
function exit.

3 years agox86: Add string/memory function tests in RTM region
H.J. Lu [Tue, 23 Feb 2021 14:33:10 +0000 (06:33 -0800)]
x86: Add string/memory function tests in RTM region

At function exit, AVX optimized string/memory functions have VZEROUPPER
which triggers RTM abort.   When such functions are called inside a
transactionally executing RTM region, RTM abort causes severe performance
degradation.  Add tests to verify that string/memory functions won't
cause RTM abort in RTM region.

3 years agox86-64: Add AVX optimized string/memory functions for RTM
H.J. Lu [Fri, 5 Mar 2021 15:26:42 +0000 (07:26 -0800)]
x86-64: Add AVX optimized string/memory functions for RTM

Since VZEROUPPER triggers RTM abort while VZEROALL won't, select AVX
optimized string/memory functions with

xtest
jz 1f
vzeroall
ret
1:
vzeroupper
ret

at function exit on processors with usable RTM, but without 256-bit EVEX
instructions to avoid VZEROUPPER inside a transactionally executing RTM
region.

3 years agox86-64: Add memcmp family functions with 256-bit EVEX
H.J. Lu [Fri, 5 Mar 2021 15:20:28 +0000 (07:20 -0800)]
x86-64: Add memcmp family functions with 256-bit EVEX

Update ifunc-memcmp.h to select the function optimized with 256-bit EVEX
instructions using YMM16-YMM31 registers to avoid RTM abort with usable
AVX512VL, AVX512BW and MOVBE since VZEROUPPER isn't needed at function
exit.

3 years agox86-64: Add memset family functions with 256-bit EVEX
H.J. Lu [Fri, 5 Mar 2021 15:15:03 +0000 (07:15 -0800)]
x86-64: Add memset family functions with 256-bit EVEX

Update ifunc-memset.h/ifunc-wmemset.h to select the function optimized
with 256-bit EVEX instructions using YMM16-YMM31 registers to avoid RTM
abort with usable AVX512VL and AVX512BW since VZEROUPPER isn't needed at
function exit.

3 years agox86-64: Add memmove family functions with 256-bit EVEX
H.J. Lu [Fri, 5 Mar 2021 14:46:08 +0000 (06:46 -0800)]
x86-64: Add memmove family functions with 256-bit EVEX

Update ifunc-memmove.h to select the function optimized with 256-bit EVEX
instructions using YMM16-YMM31 registers to avoid RTM abort with usable
AVX512VL since VZEROUPPER isn't needed at function exit.

3 years agox86-64: Add strcpy family functions with 256-bit EVEX
H.J. Lu [Fri, 5 Mar 2021 14:36:50 +0000 (06:36 -0800)]
x86-64: Add strcpy family functions with 256-bit EVEX

Update ifunc-strcpy.h to select the function optimized with 256-bit EVEX
instructions using YMM16-YMM31 registers to avoid RTM abort with usable
AVX512VL and AVX512BW since VZEROUPPER isn't needed at function exit.

3 years agox86-64: Add ifunc-avx2.h functions with 256-bit EVEX
H.J. Lu [Fri, 5 Mar 2021 14:24:52 +0000 (06:24 -0800)]
x86-64: Add ifunc-avx2.h functions with 256-bit EVEX

Update ifunc-avx2.h, strchr.c, strcmp.c, strncmp.c and wcsnlen.c to
select the function optimized with 256-bit EVEX instructions using
YMM16-YMM31 registers to avoid RTM abort with usable AVX512VL, AVX512BW
and BMI2 since VZEROUPPER isn't needed at function exit.

For strcmp/strncmp, prefer AVX2 strcmp/strncmp if Prefer_AVX2_STRCMP
is set.

3 years agox86: Set Prefer_No_VZEROUPPER and add Prefer_AVX2_STRCMP
H.J. Lu [Fri, 26 Feb 2021 13:36:59 +0000 (05:36 -0800)]
x86: Set Prefer_No_VZEROUPPER and add Prefer_AVX2_STRCMP

1. Set Prefer_No_VZEROUPPER if RTM is usable to avoid RTM abort triggered
by VZEROUPPER inside a transactionally executing RTM region.
2. Since to compare 2 32-byte strings, 256-bit EVEX strcmp requires 2
loads, 3 VPCMPs and 2 KORDs while AVX2 strcmp requires 1 load, 2 VPCMPEQs,
1 VPMINU and 1 VPMOVMSKB, AVX2 strcmp is faster than EVEX strcmp.  Add
Prefer_AVX2_STRCMP to prefer AVX2 strcmp family functions.

3 years agoadd workload traces for missing functions (double format)
Paul Zimmermann [Fri, 19 Mar 2021 09:09:20 +0000 (10:09 +0100)]
add workload traces for missing functions (double format)

This patch adds workload traces for all double format functions where such
files are missing.  For each function, a set of 1000 random values is
generated at random using SageMath, such that the output values are
meaningful (for example avoiding too large inputs for exp10 where the
output would be +Inf).  More details about the generated values are
given at the beginning of each file.
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
3 years agolinux: Add y2106 support on utimensat tests
Adhemerval Zanella [Fri, 19 Mar 2021 17:16:09 +0000 (14:16 -0300)]
linux: Add y2106 support on utimensat tests

The tests are refactored to use a common skeleton that handles whether
the underlying filesystem supports 64 bit time, skips 64 bit time
tests when the TU only supports 32 bit, and also skip 64 bit time
tests larger than 32 unsigned int (y2106) if the system does not
support it (MIPSn64 on kernels without statx support).

Checked on x86_64-linux-gnu and i686-linux-gnu.  I also checked
on a mips64el-linux-gnu with 4.1.4 and 5.10.0-4-5kc-malta kernel
to verify if the y2106 are indeed skipped.

3 years agosupport: Add support_path_support_time64_value
Adhemerval Zanella [Fri, 19 Mar 2021 16:44:20 +0000 (13:44 -0300)]
support: Add support_path_support_time64_value

It allows to check for support on arbitrary timestamp values.

3 years agolinux: Use statx for MIPSn64
Adhemerval Zanella [Fri, 19 Mar 2021 12:51:29 +0000 (09:51 -0300)]
linux: Use statx for MIPSn64

MIPSn64 kernel ABI for legacy stat uses unsigned 32 bit for second
timestamp, which limits the maximum value to y2106.  This patch
make mips64 use statx as for 32-bit architectures.

Thie __cp_stat64_t64_statx is open coded, its usage is solely on
fstatat64 and it avoid the need to redefine the name for mips64
(which will call __cp_stat64_statx since its does not use
__stat64_t64 internally).

3 years agolinux: Disable fstatat64 fallback if __ASSUME_STATX is defined
Adhemerval Zanella [Thu, 18 Mar 2021 19:30:23 +0000 (22:30 +0300)]
linux: Disable fstatat64 fallback if __ASSUME_STATX is defined

If the minimum kernel supports statx there is no need to call the
fallback stat legacy syscalls.

The statx is also called on compat xstat syscall, but different
than the fstatat it calls no fallback and it is assumed to be
always present.

Checked on powerpc-linux-gnu (with and without --enable-kernel=4.11)
and on powerpc64-linux-gnu.

3 years agolinux: Implement fstatat with __fstatat64_time64
Adhemerval Zanella [Thu, 18 Mar 2021 17:30:13 +0000 (20:30 +0300)]
linux: Implement fstatat with __fstatat64_time64

It makes fstatat use __NR_statx, which fix the s390 issue with
missing nanoxsecond support on compat stat syscalls (at least
on recent kernels) and limits the statx call to only one function
(which simplifies the __ASSUME_STATX support).

Checked on i686-linux-gnu and on powerpc-linux-gnu.

3 years agox86: Properly disable XSAVE related features [BZ #27605]
H.J. Lu [Fri, 19 Mar 2021 13:15:37 +0000 (06:15 -0700)]
x86: Properly disable XSAVE related features [BZ #27605]

1. Support GLIBC_TUNABLES=glibc.cpu.hwcaps=-XSAVE.
2. Disable all features which depend on XSAVE:
   a. If OSXSAVE is disabled by glibc tunables.  Or
   b. If both XSAVE and XSAVEC aren't usable.

3 years agotest-strnlen.c: Check that strnlen won't go beyond the maximum length
H.J. Lu [Sat, 27 Mar 2021 16:06:39 +0000 (09:06 -0700)]
test-strnlen.c: Check that strnlen won't go beyond the maximum length

Place strings ending at page boundary without the null byte.  If an
implementation goes beyond EXP_LEN, it will trigger the segfault.

3 years agotest-strnlen.c: Initialize wchar_t string with wmemset [BZ #27655]
H.J. Lu [Sat, 27 Mar 2021 16:15:00 +0000 (09:15 -0700)]
test-strnlen.c: Initialize wchar_t string with wmemset [BZ #27655]

Use wmemset to initialize wchar_t string.

3 years agonptl: Remove unused rules
Adhemerval Zanella [Thu, 18 Mar 2021 17:53:22 +0000 (14:53 -0300)]
nptl: Remove unused rules

The wrapper are not exported by libpthread.

3 years agonptl: Remove __libc_allocate_rtsig, __libc_current_sigrtmax, and __libc_current_sigrtmin
Adhemerval Zanella [Mon, 15 Mar 2021 20:22:15 +0000 (17:22 -0300)]
nptl: Remove __libc_allocate_rtsig, __libc_current_sigrtmax, and __libc_current_sigrtmin

The libc version is identical and built with same flags.

Checked on x86_64-linux-gnu.

3 years agonptl: Move sigaction to libc
Adhemerval Zanella [Mon, 15 Mar 2021 18:34:42 +0000 (15:34 -0300)]
nptl: Move sigaction to libc

The libc version is identical and built with same flags.

Checked on x86_64-linux-gnu.

3 years agonptl: Remove pthread raise implementation
Adhemerval Zanella [Thu, 3 Dec 2020 19:45:53 +0000 (16:45 -0300)]
nptl: Remove pthread raise implementation

The Linux version already target the current thread by using tgkill
along with getpid and gettid.

For arm, libpthread does not do a intra PLT since it will call the
raise from libc.

Checked on x86_64-linux-gnu.

3 years agonptl: Move pthread_kill to libc
Adhemerval Zanella [Thu, 3 Dec 2020 14:43:25 +0000 (11:43 -0300)]
nptl: Move pthread_kill to libc

A new 2.34 version is also provided.

Checked on x86_64-linux-gnu.

3 years agonptl: Remove sigsuspend from pthread-compat-wrappers
Adhemerval Zanella [Thu, 18 Mar 2021 17:48:58 +0000 (14:48 -0300)]
nptl: Remove sigsuspend from pthread-compat-wrappers

The symbol is not exported by libpthread.

3 years agonptl: Remove msgrcv from pthread-compat-wrappers
Adhemerval Zanella [Thu, 18 Mar 2021 17:47:47 +0000 (14:47 -0300)]
nptl: Remove msgrcv from pthread-compat-wrappers

The symbol is not exported by libpthread.

3 years agonptl: Remove msgsnd from pthread-compat-wrappers
Adhemerval Zanella [Thu, 18 Mar 2021 17:46:45 +0000 (14:46 -0300)]
nptl: Remove msgsnd from pthread-compat-wrappers

The symbol is not exported by libpthread.

3 years agonptl: Remove pwrite from libpthread
Adhemerval Zanella [Sat, 13 Mar 2021 22:47:44 +0000 (19:47 -0300)]
nptl: Remove pwrite from libpthread

The libc version is identical and built with same flags, it is also
uses as the default version.

Checked on x86_64-linux-gnu.

3 years agonptl: Remove pread from libpthread
Adhemerval Zanella [Sat, 13 Mar 2021 21:12:55 +0000 (18:12 -0300)]
nptl: Remove pread from libpthread

The libc version is identical and built with same flags, it is also
uses as the default version.

Checked on x86_64-linux-gnu.

3 years agonptl: Remove open from libpthread
Adhemerval Zanella [Fri, 12 Mar 2021 23:54:13 +0000 (20:54 -0300)]
nptl: Remove open from libpthread

The libc version is identical and built with same flags.  The libc
version is set as the default version.

Checked on x86_64-linux-gnu.

3 years agonptl: Remove lseek from libpthread
Adhemerval Zanella [Fri, 12 Mar 2021 20:08:00 +0000 (17:08 -0300)]
nptl: Remove lseek from libpthread

The libc version is identical and built with same flags.  The libc
version is set as the default version.

The libpthread compat symbol requires to mask it when building the
loader object otherwise ld might complain about a missing
versioned symbol (as for alpha).

Checked on x86_64-linux-gnu.

3 years agonptl: Remove send from libpthread
Adhemerval Zanella [Fri, 12 Mar 2021 19:42:39 +0000 (16:42 -0300)]
nptl: Remove send from libpthread

The libc version is identical and built with same flags.  Both aarch64
and nios2 also requires to export __send and tt was done previously with
the HAVE_INTERNAL_SEND_SYMBOL (which forced the symbol creation).

All __send callers are internal to libc and the original issue that
required the symbol export was due a missing libc_hidden_def.  So
a compat symbol is added for __send and the libc_hidden_def is
defined regardless.

Checked on x86_64-linux-gnu and i686-linux-gnu.

3 years agoAdd OTHER_SHLIB_COMPAT
Adhemerval Zanella [Fri, 19 Mar 2021 17:21:05 +0000 (17:21 +0000)]
Add OTHER_SHLIB_COMPAT

It is similar to SHLIB_COMPAT, but allows to check versions from
other libraries.  It is used to move compat symbol from other libraries
to libc.

3 years agomisc: Fix tst-select timeout handling (BZ#27648)
Adhemerval Zanella [Thu, 25 Mar 2021 19:57:45 +0000 (16:57 -0300)]
misc: Fix tst-select timeout handling (BZ#27648)

Instead of polling the stderr, create two pipes and fork to check
if child timeout as expected similar to tst-pselect.c.  Also lower
the timeout value.

Checked on x86_64-linux-gnu.

3 years agomalloc: Ensure mtag code path in checked_request2size is cold
Szabolcs Nagy [Mon, 15 Mar 2021 11:44:32 +0000 (11:44 +0000)]
malloc: Ensure mtag code path in checked_request2size is cold

This is a workaround (hack) for a gcc optimization issue (PR 99551).
Without this the generated code may evaluate the expression in the
cold path which causes performance regression for small allocations
in the memory tagging disabled (common) case.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agomalloc: Remove unnecessary tagging around _mid_memalign
Szabolcs Nagy [Fri, 12 Mar 2021 14:30:10 +0000 (14:30 +0000)]
malloc: Remove unnecessary tagging around _mid_memalign

The internal _mid_memalign already returns newly tagged memory.
(__libc_memalign and posix_memalign already relied on this, this
patch fixes the other call sites.)

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agomalloc: Rename chunk2rawmem
Szabolcs Nagy [Thu, 11 Mar 2021 14:49:45 +0000 (14:49 +0000)]
malloc: Rename chunk2rawmem

The previous patch ensured that all chunk to mem computations use
chunk2rawmem, so now we can rename it to chunk2mem, and in the few
cases where the tag of mem is relevant chunk2mem_tag can be used.

Replaced tag_at (chunk2rawmem (x)) with chunk2mem_tag (x).
Renamed chunk2rawmem to chunk2mem.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agomalloc: Use chunk2rawmem throughout
Szabolcs Nagy [Tue, 9 Mar 2021 14:04:49 +0000 (14:04 +0000)]
malloc: Use chunk2rawmem throughout

The difference between chunk2mem and chunk2rawmem is that the latter
does not get the memory tag for the returned pointer.  It turns out
chunk2rawmem almost always works:

The input of chunk2mem is a chunk pointer that is untagged so it can
access the chunk header. All memory that is not user allocated heap
memory is untagged, which in the current implementation means that it
has the 0 tag, but this patch does not rely on the tag value. The
patch relies on that chunk operations are either done on untagged
chunks or without doing memory access to the user owned part.

Internal interface contracts:

sysmalloc: Returns untagged memory.
_int_malloc: Returns untagged memory.
_int_free: Takes untagged memory.
_int_memalign: Returns untagged memory.
_int_realloc: Takes and returns tagged memory.

So only _int_realloc and functions outside this list need care.
Alignment checks do not need the right tag and tcache works with
untagged memory.

tag_at was kept in realloc after an mremap, which is not strictly
necessary, since the pointer is only used to retag the memory, but this
way the tag is guaranteed to be different from the old tag.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agomalloc: Use different tag after mremap
Szabolcs Nagy [Fri, 12 Mar 2021 09:46:15 +0000 (09:46 +0000)]
malloc: Use different tag after mremap

The comment explained why different tag is used after mremap, but
for that correctly tagged pointer should be passed to tag_new_usable.
Use chunk2mem to get the tag.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agomalloc: Use memsize instead of CHUNK_AVAILABLE_SIZE
Szabolcs Nagy [Mon, 8 Mar 2021 12:59:05 +0000 (12:59 +0000)]
malloc: Use memsize instead of CHUNK_AVAILABLE_SIZE

This is a pure refactoring change that does not affect behaviour.

The CHUNK_AVAILABLE_SIZE name was unclear, the memsize name tries to
follow the existing convention of mem denoting the allocation that is
handed out to the user, while chunk is its internally used container.

The user owned memory for a given chunk starts at chunk2mem(p) and
the size is memsize(p).  It is not valid to use on dumped heap chunks.

Moved the definition next to other chunk and mem related macros.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agoaarch64: Optimize __libc_mtag_tag_zero_region
Szabolcs Nagy [Tue, 9 Feb 2021 17:59:11 +0000 (17:59 +0000)]
aarch64: Optimize __libc_mtag_tag_zero_region

This is a target hook for memory tagging, the original was a naive
implementation. Uses the same algorithm as __libc_mtag_tag_region,
but with instructions that also zero the memory.  This was not
benchmarked on real cpu, but expected to be faster than the naive
implementation.

3 years agoaarch64: Optimize __libc_mtag_tag_region
Szabolcs Nagy [Tue, 9 Feb 2021 17:56:02 +0000 (17:56 +0000)]
aarch64: Optimize __libc_mtag_tag_region

This is a target hook for memory tagging, the original was a naive
implementation. The optimized version relies on "dc gva" to tag 64
bytes at a time for large allocations and optimizes small cases without
adding too many branches. This was not benchmarked on real cpu, but
expected to be faster than the naive implementation.

3 years agoaarch64: inline __libc_mtag_new_tag
Szabolcs Nagy [Thu, 4 Feb 2021 17:05:28 +0000 (17:05 +0000)]
aarch64: inline __libc_mtag_new_tag

This is a common operation when heap tagging is enabled, so inline the
instructions instead of using an extern call.

3 years agoaarch64: inline __libc_mtag_address_get_tag
Szabolcs Nagy [Thu, 4 Feb 2021 10:04:07 +0000 (10:04 +0000)]
aarch64: inline __libc_mtag_address_get_tag

This is a common operation when heap tagging is enabled, so inline the
instruction instead of using an extern call.

The .inst directive is used instead of the name of the instruction (or
acle intrinsics) because malloc.c is not compiled for armv8.5-a+memtag
architecture, runtime cpu support detection is used.

Prototypes are removed from the comments as they were not always
correct.

3 years agomalloc: Use mtag_enabled instead of USE_MTAG
Szabolcs Nagy [Wed, 17 Feb 2021 10:15:18 +0000 (10:15 +0000)]
malloc: Use mtag_enabled instead of USE_MTAG

Use the runtime check where possible: it should not cause slow down in
the !USE_MTAG case since then mtag_enabled is constant false, but it
allows compiling the tagging logic so it's less likely to break or
diverge when developers only test the !USE_MTAG case.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agomalloc: Use branches instead of mtag_granule_mask
Szabolcs Nagy [Mon, 8 Feb 2021 12:39:01 +0000 (12:39 +0000)]
malloc: Use branches instead of mtag_granule_mask

The branches may be better optimized since mtag_enabled is widely used.

Granule size larger than a chunk header is not supported since then we
cannot have both the chunk header and user area granule aligned.  To
fix that for targets with large granule, the chunk layout has to change.

So code that attempted to handle the granule mask generally was changed.
This simplified CHUNK_AVAILABLE_SIZE and the logic in malloc_usable_size.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agomalloc: Change calloc when tagging is disabled
Szabolcs Nagy [Tue, 16 Feb 2021 17:02:44 +0000 (17:02 +0000)]
malloc: Change calloc when tagging is disabled

When glibc is built with memory tagging support (USE_MTAG) but it is not
enabled at runtime (mtag_enabled) then unconditional memset was used
even though that can be often avoided.

This is for performance when tagging is supported but not enabled.
The extra check should have no overhead: tag_new_zero_region already
had a runtime check which the compiler can now optimize away.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agomalloc: Only support zeroing and not arbitrary memset with mtag
Szabolcs Nagy [Fri, 29 Jan 2021 17:07:28 +0000 (17:07 +0000)]
malloc: Only support zeroing and not arbitrary memset with mtag

The memset api is suboptimal and does not provide much benefit. Memory
tagging only needs a zeroing memset (and only for memory that's sized
and aligned to multiples of the tag granule), so change the internal
api and the target hooks accordingly.  This is to simplify the
implementation of the target hook.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agomalloc: Use global flag instead of function pointer dispatch for mtag
Szabolcs Nagy [Wed, 27 Jan 2021 15:45:43 +0000 (15:45 +0000)]
malloc: Use global flag instead of function pointer dispatch for mtag

A flag check can be faster than function pointers because of how
branch prediction and speculation works and it can also remove a layer
of indirection when there is a mismatch between the malloc internal
tag_* api and __libc_mtag_* target hooks.

Memory tagging wrapper functions are moved to malloc.c from arena.c and
the logic now checks mmap_enabled.  The definition of tag_new_usable is
moved after chunk related definitions.

This refactoring also allows using mtag_enabled checks instead of
USE_MTAG ifdefs when memory tagging support only changes code logic
when memory tagging is enabled at runtime. Note: an "if (false)" code
block is optimized away even at -O0 by gcc.

Reviewed-by: DJ Delorie <dj@redhat.com>
3 years agomalloc: Refactor TAG_ macros to avoid indirection
Szabolcs Nagy [Tue, 16 Feb 2021 14:12:25 +0000 (14:12 +0000)]
malloc: Refactor TAG_ macros to avoid indirection

This does not change behaviour, just removes one layer of indirection
in the internal memory tagging logic.

Use tag_ and mtag_ prefixes instead of __tag_ and __mtag_ since these
are all symbols with internal linkage, private to malloc.c, so there
is no user namespace pollution issue.

Reviewed-by: DJ Delorie <dj@redhat.com>