1. 29 10月, 2019 3 次提交
    • R
      prepare struct sched_param for change in time_t definition · 2d69fcf5
      Rich Felker 提交于
      the time_t members in struct sched_param are just reserved space to
      preserve size and alignment. when time_t changes to 64-bit on 32-bit
      archs, this structure should not change.
      
      make definition conditional on _REDIR_TIME64 to match the size of the
      old time_t, which can be assumed to be long if _REDIR_TIME64 is
      defined.
      2d69fcf5
    • R
      add time64 symbol name redirects to public headers, under arch control · 1febd21d
      Rich Felker 提交于
      a _REDIR_TIME64 macro is introduced, which the arch's alltypes.h is
      expected to define, to control redirection of symbol names for
      interfaces that involve time_t and derived types. this ensures that
      object files will only be linked to libc interfaces matching the ABI
      whose headers they were compiled against.
      
      along with time32 compat shims, which will be introduced separately,
      the redirection also makes it possible for a single libc (static or
      shared) to be used with object files produced with either the old
      (32-bit time_t) headers or the new ones after 64-bit time_t switchover
      takes place. mixing of such object files (or shared libraries) in the
      same program will also be possible, but must be done with care; ABI
      between libc and a consumer of the libc interfaces is guaranteed to
      match by the the symbol name redirection, but pairwise ABI between
      consumers of libc that define interfaces between each other in terms
      of time_t is not guaranteed to match.
      
      this change adds a dependency on an additional "GNU C" feature to the
      public headers for existing 32-bit archs, which is generally
      undesirable; however, the feature is one which glibc has depended on
      for a long time, and thus which any viable alternative compiler is
      going to need to provide. 64-bit archs are not affected, nor will
      future 32-bit archs be, regardless of whether they are "new" on the
      kernel side (e.g. riscv32) or just newly-added (e.g. a new sparc or
      xtensa port). the same applies to newly-added ABIs for existing
      machine-level archs.
      1febd21d
    • R
      add missing m68k user.h/procfs.h regset types · f7f12e4c
      Rich Felker 提交于
      f7f12e4c
  2. 26 10月, 2019 4 次提交
    • R
      update case mappings to unicode 12.1.0 · 06d4075a
      Rich Felker 提交于
      06d4075a
    • U
      update ctype data to unicode 12.1.0 · e95538fa
      u_quark 提交于
      e95538fa
    • R
      overhaul wide character case mapping implementation · a11a6246
      Rich Felker 提交于
      the existing implementation of case mappings was very small (typically
      around 1.5k), but unmaintainable, requiring manual addition of new
      case mappings with each new edition of Unicode. often, it turned out
      that newly-added case mappings were not easily representable in the
      existing tightly-constrained table structures, requiring new hacks to
      be invented and delaying support for new characters.
      
      the new implementation added here follows the pattern used for
      character class membership, with a two-level table allowing Unicode
      blocks for which no data is needed to be elided. however, rather than
      single-bit data, each character maps to a one of up to 6 case-mapping
      rules available to its block, where 6 is floor(cbrt(256)) and allow 3
      characters to be represented per byte (vs 8 with bit tables). blocks
      that would need more than 6 rules designate one as an exception and
      let lookup pass into a binary search of exceptional cases for the
      block.
      
      the number 6 was chosen empirically; many blocks would be ok with 4
      rules (uncased, lower, upper, possible exceptions), some even just
      with 2, but the latter are rare and fitting 4 characters per byte
      rather than 3 does not save significant space. moreover, somewhat
      surprisingly, there are sufficiently many blocks where even 4 rules
      don't suffice without a lot of exceptions (blocks where some case
      pairs are laced, others offset) that originally I was looking at
      supporting variable-width tables, with 1-, 2-, or 3-bit entries,
      thereby allowing blocks with 8 rules. as implemented in my
      experiments, that version was significantly larger and involved more
      memory accesses/cache lines.
      
      improvements in size at the expense of some performance might be
      possible by utilizing iswalpha data or merging the table of case
      mapping identity with alphabetic identity. these were explored
      somewhat when the code was first written, and might be worth
      revisiting in the future.
      a11a6246
    • R
      add missing case mapping between U+03F3 and U+037F · e8aba58a
      Rich Felker 提交于
      somehow this seems to have been overlooked. add it now so that
      subsequent overhaul of case mapping implementation will not introduce
      a functional change at the same time.
      e8aba58a
  3. 24 10月, 2019 1 次提交
  4. 20 10月, 2019 6 次提交
    • R
      adjust struct timespec definition to be time64-ready · 9b2921be
      Rich Felker 提交于
      for time64 support on 32-bit archs, the kernel interfaces use a
      timespec layout padded to match the representation of a pair of 64-bit
      values, which requires endian-specific padding.
      
      use of an ordinary, non-bitfield, named member for the padding is
      undesirable because, on big endian archs, it would alter the
      interpretation of traditional (non-designated) initializers of the
      form {s,ns}, initializing the padding instead of the tv_nsec member.
      unnamed bitfield members solve this problem by not taking part in
      initialization, and were the expected solution when the kernel
      interfaces were designed. however, they also have further advantages
      which we take advantage of here:
      
      positioning of the padding could be controlled by having a
      preprocessor conditional with separate definitions of struct timespec
      for little and big endian, but whether padding should appear at all is
      a function of whether time_t is larger than long. this condition is
      not something the preprocessor can determine unless we were to define
      a new macro specifically for that purpose.
      
      by using unnamed bitfield members instead of ordinary named members,
      we can arrange for the size of the padding to collapse to zero when it
      should not be present, just by using sizeof(time_t) and sizeof(long)
      in the bitfield width expression, which can be any integer constant
      expression.
      9b2921be
    • R
      clock_adjtime: generalize time64 not to assume old struct layout match · 928674dc
      Rich Felker 提交于
      commit 2b4fd6f7 added time64 for this
      function, but did so with a hidden assumption that the new time64
      version of struct timex will be layout-compatible with the old one.
      however, there is little benefit to doing it that way, and the cost is
      permanent special-casing of 32-bit archs with 64-bit time_t in the
      public interface definitions.
      
      instead, do a full translation of the structure going in and out. this
      commit is actually a revision to an earlier uncommited version of the
      code.
      928674dc
    • R
      wait4, getrusage: add time64/x32 variant · 5850546e
      Rich Felker 提交于
      presently the kernel does not actually define time64 versions of these
      syscalls, and they're not really needed except to represent extreme
      cpu time usage. however, x32's versions of the syscalls already behave
      as time64 ones, meaning the functions were broken on x32 if the caller
      used any part of the rusage result other than ru_utime and ru_stime.
      commit 7e817114 made it possible to
      fix this by treating x32's syscalls as time64 versions.
      
      in the non-time64-syscall case, make the syscall with the rusage
      destination pointer adjusted so that all members but the timevals line
      up between the libc and kernel structures. on 64-bit archs, or present
      32-bit archs with 32-bit time_t, the timevals will line up too and no
      further work is needed. for future 32-bit archs with 64-bit time_t,
      the timevals are copied into place, contingent on time_t being larger
      than long.
      5850546e
    • R
      internally, define time64 rusage syscalls on x32 as the existing ones · 7e817114
      Rich Felker 提交于
      this is analogous to commit 40aa18d5.
      so far, there are not any actual time64 versions of the rusage
      syscalls (getrusage and wait4) and might never be. however, the
      existing x32 ones behave the way time64 versions would if they
      existed: using 64-bit slots in place of all longs.
      
      presently, wait4 and getrusage are broken on x32, storing the timevals
      correctly but messing up everything else due to the long/kernel-long
      mismatch. this would be a huge buffer overflow if not for the 16
      reserved slots we left long ago, which suffice to prevent 14
      double-sized longs from overflowing into unrelated memory. this commit
      will make it possible to fix them.
      7e817114
    • R
      use struct pt_regs * rather than void * for powerpc[64] sigcontext regs · c2518a8e
      Rich Felker 提交于
      this is to match the kernel and glibc interfaces. here, struct pt_regs
      is an incomplete type, but that's harmless, and if it's completed by
      inclusion of another header then members of the struct pointed to by
      the regs member can be accessed directly without going through a cast
      or intermediate pointer object.
      c2518a8e
    • R
      fix fpregset_t type on powerpc64 · c9f48cde
      Rich Felker 提交于
      the userspace ucontext API has this as an array rather than a
      structure.
      
      commit 3c59a868 fixed the
      corresponding mistake for vrregset_t, namely that the original
      powerpc64 port used a mix of types from 32-bit powerpc and powerpc64
      rather than matching the 64-bit types.
      c9f48cde
  5. 19 10月, 2019 2 次提交
    • R
      fix return value of ungetc when argument is outside unsigned char range · f6ecd0c2
      Rich Felker 提交于
      aside from the special value EOF, ungetc is specified to accept and
      convert values outside the range of unsigned char. conversion takes
      place automatically as part of assignment when storing into the
      buffer, but the return value is also required to be the resulting
      converted value, and this requirement was not satisfied.
      
      simplified from patch by Wang Jianjian.
      f6ecd0c2
    • R
      fix incorrect use of fabs on long double operand in floatscan.c · bff78954
      Rich Felker 提交于
      based on patch by Dan Gohman, who caught this via compiler warnings.
      analysis by Szabolcs Nagy determined that it's a bug, whereby errno
      can be set incorrectly for values where the coercion from long double
      to double causes rounding. it seems likely that floating point status
      flags may be set incorrectly as a result too.
      
      at the same time, clean up use of preprocessor concatenation involving
      LDBL_MANT_DIG, which spuriously depends on it being a single unadorned
      decimal integer literal, and instead use the equivalent formulation
      2/LDBL_EPSILON. an equivalent change on the printf side was made in
      commit bff6095d.
      bff78954
  6. 18 10月, 2019 8 次提交
    • R
      move pthread types out of per-arch alltypes.h · 2d3083e7
      Rich Felker 提交于
      policy has long been that these definitions are purely a function of
      whether long/pointer is 32- or 64-bit, and that they are not allowed
      to vary per-arch. move the definition to the shared alltypes.h.in
      fragment, using integer constant expressions in terms of sizeof to
      vary the array dimensions appropriately. I'm not sure whether this is
      more or less ugly than using preprocessor conditionals and two sets of
      definitions here, but either way is a lot less ugly than repeating the
      same thing for every arch.
      2d3083e7
    • R
      define LONG_MAX via arch alltypes.h, strip down bits/limits.h · 7cc79d10
      Rich Felker 提交于
      LLONG_MAX is uniform for all archs we support and plenty of header and
      code level logic assumes it is, so it does not make sense for limits.h
      bits mechanism to pretend it's variable.
      
      LONG_BIT can be defined in terms of LONG_MAX; there's no reason to put
      it in bits.
      
      by moving LONG_MAX definition to __LONG_MAX in alltypes.h and moving
      LLONG_MAX out of bits, there are now no plain-C limits that are
      defined in the bits header, so the bits header only needs to be
      included in the POSIX or extended profiles. this allows the feature
      test macro logic to be removed from the bits header, facilitating a
      long-term goal of getting such logic out of bits.
      
      having __LONG_MAX in alltypes.h will allow further generalization of
      headers.
      
      archs without a constant PAGESIZE no longer need bits/limits.h at all.
      7cc79d10
    • R
      make endian.h expose unprefixed macros, functions in standard profile · 316730cd
      Rich Felker 提交于
      the resolution of Austin Group issue #162 adds endian.h as a standard
      header for future versions of the standard, making it no longer
      acceptable for some of the functionality to be hidden behind
      _BSD_SOURCE or _GNU_SOURCE. the definitions of the [lb]etoh{16,32,64}
      function-like macros are kept conditional since they are alternate
      names which the standard did not adopt.
      316730cd
    • R
      remove use of endian.h from arch reloc.h headers, clean up · 4d3a162d
      Rich Felker 提交于
      building on commit 97d35a55,
      __BYTE_ORDER is now available wherever alltypes.h is included. since
      reloc.h is only used from src/internal/dynlink.h, it can be assumed
      that __BYTE_ORDER is exposed. reloc.h is not permitted to be included
      in other contexts, and generally, like most arch headers, lacks
      inclusion guards that would allow such usage. the mips64 version
      mistakenly included such guards; they are removed for consistency.
      4d3a162d
    • R
      remove indirect use of endian.h from public headers · 71d23fbe
      Rich Felker 提交于
      building on commit 97d35a55,
      __BYTE_ORDER is now available wherever alltypes.h is included.
      endian.h should not be used since, in the future, it will expose
      identifiers that are not in the reserved namespace for the headers
      which were previously using it.
      71d23fbe
    • R
      move __BYTE_ORDER definition to alltypes.h · 97d35a55
      Rich Felker 提交于
      this change is motivated by the intersection of several factors.
      presently, despite being a nonstandard header, endian.h is exposing
      the unprefixed byte order macros and functions only if _BSD_SOURCE or
      _GNU_SOURCE is defined. this is to accommodate use of endian.h from
      other headers, including bits headers, which need to define structure
      layout in terms of endianness. with time64 switch-over, even more
      headers will need to do this.
      
      at the same time, the resolution of Austin Group issue 162 makes
      endian.h a standard header for POSIX-future, requiring that it expose
      the unprefixed macros and the functions even in standards-conforming
      profiles. changes to meet this new requirement would break existing
      internal usage of endian.h by causing it to violate namespace where
      it's used.
      
      instead, have the arch's alltypes.h define __BYTE_ORDER, either as a
      fixed constant or depending on the right arch-specific predefined
      macros for determining endianness. explicit literals 1234 and 4321 are
      used instead of __LITTLE_ENDIAN and __BIG_ENDIAN so that there's no
      danger of getting the wrong result if a macro is undefined and
      implicitly evaluates to 0 at the preprocessor level.
      
      the powerpc (32-bit) bits/endian.h being removed had logic for varying
      endianness, but our powerpc arch has never supported that and has
      always been big-endian-only. this logic is not carried over to the new
      __BYTE_ORDER definition in alltypes.h.
      97d35a55
    • R
      remove per-arch definitions for va_list · 00ec11d1
      Rich Felker 提交于
      now that commit f7f10797 removed the
      legacy i386 conditional definition, va_list is in no way
      arch-specific, and has no reason to be in the future. move it to the
      shared part of alltypes.h.in
      00ec11d1
    • R
      remove i386 support for legacy struct __va_list · f7f10797
      Rich Felker 提交于
      commit ffaaa6d2 removed the
      corresponding stdarg.h support for compilers without va_list builtins,
      but failed to remove the alternate type definition, leaving incorrect
      va_list definitions in place with compilers that don't define __GNUC__
      with a value >= 3.
      f7f10797
  7. 14 10月, 2019 5 次提交
  8. 07 10月, 2019 1 次提交
    • S
      add Arm to the copyright file · db3cc9a3
      Szabolcs Nagy 提交于
      Several math functions are now from the ARM optimized-routines repo
      licensed under standard MIT terms and copyrighted by Arm Limited,
      so mention this in the COPYRIGHT too.
      db3cc9a3
  9. 02 10月, 2019 1 次提交
    • R
      reintroduce riscv64 struct sigcontext · a0993f8f
      Rich Felker 提交于
      commit ab3eb89a removed it as part of
      correcting the mcontext_t definition, but there is still code using
      struct sigcontext and expecting the member names present in it, most
      notably libgcc_eh. almost all such usage is incorrect, but bring back
      struct sigcontext at least for now so as not to introduce regressions.
      a0993f8f
  10. 30 9月, 2019 3 次提交
    • R
      fix riscv64 elf_fpregset_t type and member names mismatch · 2c2477da
      Rich Felker 提交于
      in order for sys/procfs.h (provided by sys/user.h) to be useful, it
      needs to match the API its consumers (gdb, etc.) expect, including the
      member names established by glibc.
      
      this partly reverts commit 29e8737f,
      which partly reverted d493206d,
      eliminating struct user_fpregs_struct which seems to have had no
      precedent and using union __riscv_mc_fp_state for elf_fpregset_t. this
      requires indirect inclusion of signal.h to make union
      __riscv_mc_fp_state visible, but being that these are nonstandard
      "junk" headers with no official restrictions on what they can pull in,
      that's no big deal.
      
      split off and expanded from patch by Khem Raj.
      2c2477da
    • R
      fix riscv64 signal.h namespace violations and ucontext API mismatches · ab3eb89a
      Rich Felker 提交于
      the top-level mcontext_t member names were namespace-violating in
      standards profiles before, and nested-level member names (some of them
      single-letter) were egregiously bad namespace impositions even in
      non-strict profiles. moreover, they mismatched those used in the
      public API first defined in glibc, breaking any code making use of
      them.
      
      unlike most archs, the public API used in glibc for riscv mcontext_t
      members was designed to be namespace-safe, so we can and should expose
      the members regardless of feature test macros. only the typedefs for
      greg_t, gregset_t, and fpregset_t need to be protected behind FTMs.
      
      the struct tags for mcontext_t and ucontext_t are also changed. for
      mcontext_t this is necessary to make the common definition across
      profiles namespace-safe. for ucontext_t, it's just a matter of
      matching the tag from the glibc-defined API.
      
      these changes are split off and expanded from a patch by Khem Raj.
      ab3eb89a
    • S
      remove remaining traces of __tls_get_new · 33bc7f05
      Szabolcs Nagy 提交于
      Some declarations of __tls_get_new were left in the code, even
      though the definition got removed in
      
        commit 9d44b646
        install dynamic tls synchronously at dlopen, streamline access
      
      this can make the build fail with
      
        ld: lib/libc.so: hidden symbol `__tls_get_new' isn't defined
      
      when libc.so is linked without --gc-sections, because a .hidden
      declaration in asm code creates a reference even if the symbol
      is not actually used.
      33bc7f05
  11. 27 9月, 2019 5 次提交
    • S
      math: optimize lrint on 32bit targets · ca577951
      Szabolcs Nagy 提交于
      lrint in (LONG_MAX, 1/DBL_EPSILON) and in (-1/DBL_EPSILON, LONG_MIN)
      is not trivial: rounding to int may be inexact, but the conversion to
      int may overflow and then the inexact flag must not be raised. (the
      overflow threshold is rounding mode dependent).
      
      this matters on 32bit targets (without single instruction lrint or
      rint), so the common case (when there is no overflow) is optimized by
      inlining the lrint logic, otherwise the old code is kept as a fallback.
      
      on my laptop an i486 lrint call is asm:10ns, old c:30ns, new c:21ns
      on a smaller arm core: old c:71ns, new c:34ns
      on a bigger arm core: old c:27ns, new c:19ns
      ca577951
    • R
      clean up mips (32-bit, o32) syscall asm constraints · 604f8d3d
      Rich Felker 提交于
      analogous to commit ddc7c4f9 for
      mips64 and n32, remove the hack to load the syscall number into $2 via
      asm, and use a constraint to let the compiler load it instead.
      
      now, only $4, $5, and $6 are potential input-only registers. $2 is
      always input and output, and $7 is both when it's an argument,
      otherwise output-only. previously, $7 was treated as an input (with a
      "1" constraint matching its output position) even when it was not an
      input, which was arguably undefined behavior (asm input from
      indeterminate value). this is corrected.
      
      as before, $8, $9, and $10 are conditionally input-output registers
      for 5-, 6-, and 7-argument syscalls. their role in input is carrying
      in the values that will be stored on the stack for arguments 5-7.
      their role in output is carrying back whatever the kernel has
      clobbered them with, so that the compiler cannot assume they still
      contain the input values.
      604f8d3d
    • R
      document mips r6 in INSTALL file · 12fecbb4
      Rich Felker 提交于
      12fecbb4
    • R
      fix mips setjmp/longjmp fpu state on r6, related issues · 370679ba
      Rich Felker 提交于
      mips32 has two fpu register file variants: FR=0 with 32 32-bit
      registers, where pairs of neighboring even/odd registers are used to
      represent doubles, and FR=1 with 32 64-bit registers, each of which
      can store a single or double.
      
      up through r5 (our "mips" arch), the supported ABI uses FR=0, but
      modern compilers generate "fpxx" model code that can safely operate
      with either model. r6, which is an incompatible but similar ISA, drops
      FR=0 and only provides the FR=1 model. as such, setjmp and longjmp,
      which depended on being able to save and restore call-saved doubles by
      storing and loading their 32-bit halves, were completely broken in the
      presence of floating point code on mips r6.
      
      to fix this, use the s.d and l.d mnemonics to store and load fpu
      registers. these expand to the existing swc1 and lwc1 instructions for
      pairs of 32-bit fpu registers on mips1, but on mips2 and later they
      translate directly to the 64-bit sdc1 and ldc1.
      
      with FR=0, sdc1 and ldc1 behave just like the pairs of swc1 and lwc1
      instructions they replace, storing or loading the even/odd pair of fpu
      registers that can be treated as separate single-precision floats or
      as a unit representing a double. but with FR=1, they store/load
      individual 64-bit registers. this yields the ABI-correct behavior on
      mips r6, and should make linking of pre-r6 (plain "mips") code with
      "fp64" model code workable, although this is and will likely remain
      unsupported usage.
      
      in addition to the mips r6 problem this change fixes, reportedly
      clang's internal assembler refuses to assemble swc1 and lwc1
      instructions for odd register indices when building for "fpxx" model
      (the default). this caused setjmp and longjmp not to build. by using
      the s.d and l.d forms, this problem is avoided too.
      
      as a bonus, code size is reduced everywhere but mips1.
      370679ba
    • R
      fix mips r6 syscall clobber lists not to include hi/lo registers · 9f6dd785
      Rich Felker 提交于
      mips r6 (an incompatible isa from traditional mips) removes the hi and
      lo registers used for mul/div results. older gcc versions accepted
      them in the clobber list for asm, but their presence is incorrect and
      breaks on later versions.
      
      in the process of fixing this, the clobber list for 32-bit mips
      syscalls has been deduplicated via a macro like on mips64 and n32.
      9f6dd785
  12. 26 9月, 2019 1 次提交
    • S
      arm: fix setjmp and longjmp asm for armv8-a · b678f7b4
      Szabolcs Nagy 提交于
      armv8 removed the coprocessor instructions other than cp14, so
      on an armv8 system the related hwcaps should never be set.
      
      new llvm complains about the use of coprocessor instructions in
      armv8-a mode (even though they are never executed at runtime),
      so ifdef them out when musl is built for armv8.
      b678f7b4