- 07 6月, 2013 1 次提交
-
-
由 Rich Felker 提交于
defining tm_gmtoff and tm_zone as macros was breaking some application code that used these names for its own purposes.
-
- 06 6月, 2013 3 次提交
-
-
由 Rich Felker 提交于
-
由 Rich Felker 提交于
this commit only covers the byte-based scanf-family functions. the wide functions still lack support for the 'm' modifier.
-
由 Rich Felker 提交于
this brings the wide version of the code into alignment with the byte-based version, in preparation for adding support for the m (malloc) modifier.
-
- 05 6月, 2013 2 次提交
-
-
由 Rich Felker 提交于
-
由 Rich Felker 提交于
the concept here is that %s and %c are essentially special-cases of %[, with some minimal additional special-casing. aside from simplifying the code and reducing the number of complex code-paths that would need changing to make optimizations later, the main purpose of this change is to simplify addition of the 'm' modifier which causes scanf to allocate storage for the string being read.
-
- 04 6月, 2013 2 次提交
-
-
由 Rich Felker 提交于
failure to do so was causing crashes on x86_64 when ctors used SSE, which was first observed when ctors called variadic functions due to the SSE prologue code inserted into every variadic function.
-
由 Rich Felker 提交于
-
- 27 5月, 2013 2 次提交
-
-
由 Rich Felker 提交于
-
由 Szabolcs Nagy 提交于
-
- 26 5月, 2013 2 次提交
-
-
由 Szabolcs Nagy 提交于
-
由 Szabolcs Nagy 提交于
following glibc use the lowest rank 64bit integer type for ino_t etc. this is eg. useful for printf format compatibility
-
- 24 5月, 2013 2 次提交
-
-
由 Rich Felker 提交于
previously we were using an unsigned type on 32-bit systems so that subtraction would be well-defined when it wrapped, but since wrapping is non-conforming anyway (when clock() overflows, it has to return -1) the only use of unsigned would be to buy a little bit more time before overflow. this does not seem worth having the type vary per-arch (which leads to more arch-specific bugs) or disagree with the ABI musl (mostly) follows.
-
由 Rich Felker 提交于
per Austin Group interpretation for issue #686, which cites the requirements of ISO C, clock() cannot wrap. if the result is not representable, it must return (clock_t)-1. in addition, the old code was performing wrapping via signed overflow and thus invoking undefined behavior. since it seems impossible to accurately check for overflow with the old times()-based fallback code, I have simply dropped the fallback code for now, thus always returning -1 on ancient systems. if there's a demand for making it work and somebody comes up with a way, it could be reinstated, but the clock() function is essentially useless on 32-bit system anyway (it overflows in less than an hour). it should be noted that I used LONG_MAX rather than ULONG_MAX, despite 32-bit archs using an unsigned type for clock_t. this discrepency with the glibc/LSB type definitions will be fixed now; since wrapping of clock_t is no longer supported, there's no use in it being unsigned.
-
- 19 5月, 2013 3 次提交
-
-
由 Szabolcs Nagy 提交于
The underflow exception is not raised correctly in some cornercases (see previous fma commit), added comments with examples for fmaf, fmal and non-x86 fma. In fmaf store the result before returning so it has the correct precision when FLT_EVAL_METHOD!=0
-
由 Szabolcs Nagy 提交于
1) in downward rounding fma(1,1,-1) should be -0 but it was 0 with gcc, the code was correct but gcc does not support FENV_ACCESS ON so it used common subexpression elimination where it shouldn't have. now volatile memory access is used as a barrier after fesetround. 2) in directed rounding modes there is no double rounding issue so the complicated adjustments done for nearest rounding mode are not needed. the only exception to this rule is raising the underflow flag: assume "small" is an exactly representible subnormal value in double precision and "verysmall" is a much smaller value so that (long double)(small plus verysmall) == small then (double)(small plus verysmall) raises underflow because the result is an inexact subnormal, but (double)(long double)(small plus verysmall) does not because small is not a subnormal in long double precision and it is exact in double precision. now this problem is fixed by checking inexact using fenv when the result is subnormal
-
由 Rich Felker 提交于
-
- 18 5月, 2013 5 次提交
-
-
由 Szabolcs Nagy 提交于
* use unsigned arithmetics * use unsigned to store arg reduction quotient (so n&3 is understood) * remove z=0.0 variables, use literal 0 * raise underflow and inexact exceptions properly when x is small * fix spurious underflow in tanl
-
由 Rich Felker 提交于
patch by Strake. previously is was not feasible to duplicate this functionality of the functions these were modeled on, since argv[0] was not saved at program startup, but now that it's available it's easy to use.
-
由 Szabolcs Nagy 提交于
* use unsigned arithmetics on the representation * store arg reduction quotient in unsigned (so n%2 would work like n&1) * use different convention to pass the arg reduction bit to __tan (this argument used to be 1 for even and -1 for odd reduction which meant obscure bithacks, the new n&1 is cleaner) * raise inexact and underflow flags correctly for small x (tanl(x) may still raise spurious underflow for small but normal x) (this exception raising code increases codesize a bit, similar fixes are needed in many other places, it may worth investigating at some point if the inexact and underflow flags are worth raising correctly as this is not strictly required by the standard) * tanf manual reduction optimization is kept for now * tanl code path is cleaned up to follow similar logic to tan and tanf
-
由 Rich Felker 提交于
there was some question as to how many decimal places to use, since one decimal place is always sufficient to identify the smallest denormal uniquely. for now, I'm following the example in the C standard which is consistent with the other min/max macros we already had in place.
-
由 Rich Felker 提交于
somehow I missed this when removing the corresponding __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS nonsense from stdint.h. these were all attempts by the C committee to guess what the C++ committee would want, and the guesses turned out to be wrong.
-
- 17 5月, 2013 1 次提交
-
-
由 Rich Felker 提交于
support for these was recently added to sysmacros.h. note that the syscall argument is a long, despite dev_t being 64-bit, so on 32-bit archs the high bits will be lost. it appears the high bits are just glibc silliness and not part of the kernel api, anyway, but it's nice that we have them there for future expansion if needed.
-
- 16 5月, 2013 2 次提交
-
-
由 Szabolcs Nagy 提交于
When FLT_EVAL_METHOD!=0 (only i386 with x87 fp) the excess precision of an expression must be removed in an assignment. (gcc needs -fexcess-precision=standard or -std=c99 for this) This is done by extra load/store instructions which adds code bloat when lot of temporaries are used and it makes the result less precise in many cases. Using double_t and float_t avoids these issues on i386 and it makes no difference on other archs. For now only a few functions are modified where the excess precision is clearly beneficial (mostly polynomial evaluations with temporaries). object size differences on i386, gcc-4.8: old new __cosdf.o 123 95 __cos.o 199 169 __sindf.o 131 95 __sin.o 225 203 __tandf.o 207 151 __tan.o 605 499 erff.o 1470 1416 erf.o 1703 1649 j0f.o 1779 1745 j0.o 2308 2274 j1f.o 1602 1568 j1.o 2286 2252 tgamma.o 1431 1424 math/*.o 64164 63635
-
由 Rich Felker 提交于
-
- 07 5月, 2013 1 次提交
-
-
由 Szabolcs Nagy 提交于
__FLOAT_BITS and __DOUBLE_BITS macros used union compound literals, now they are changed into static inline functions. A good C compiler generates the same code for both and the later is C++ conformant.
-
- 06 5月, 2013 2 次提交
-
-
由 Rich Felker 提交于
since CLOCKS_PER_SEC is 1000000 (required by XSI) and the times syscall reports values in 1/100 second units (Linux), the correct scaling factor is 10000, not 100. note that only ancient kernels which lack clock_gettime are affected.
-
由 Rich Felker 提交于
all return values are valid, and on 32-bit systems, values that look like errors can and will occur. since the only actual error this function could return is EFAULT, and it is only returnable when the application has invoked undefined behavior, simply ignore the possibility that the return value is actually an error code.
-
- 27 4月, 2013 10 次提交
-
-
由 Rich Felker 提交于
there are several reasons for this change. one is getting rid of the repetition of the syscall signature all over the place. another is sharing the constant masks without costly GOT accesses in PIC. the main motivation, however, is accurately representing whether we want to block signals that might be handled by the application, or all signals.
-
由 Rich Felker 提交于
use __syscall rather than syscall when failure is not possible or not to be considered.
-
由 Rich Felker 提交于
-
由 Rich Felker 提交于
they have already blocked signals before decrementing the thread count, so the code being removed is unreachable in the case where the thread is no longer counted.
-
由 Rich Felker 提交于
this was simply a case of saving the state in the wrong place.
-
由 Rich Felker 提交于
the previous few commits ended up leaving the thread count and signal mask wrong for atexit handlers and stdio cleanup.
-
由 Rich Felker 提交于
now that blocking signals prevents any application code from running while the last thread is exiting, the cas logic is no longer needed to prevent decrementing below zero.
-
由 Rich Felker 提交于
-
由 Rich Felker 提交于
the thread count (1+libc.threads_minus_1) must always be greater than or equal to the number of threads which could have application code running, even in an async-signal-safe sense. there is at least one dangerous race condition if this invariant fails to hold: dlopen could allocate too little TLS for existing threads, and a signal handler running in the exiting thread could claim the allocated TLS for itself (via __tls_get_addr), leaving too little for the other threads it was allocated for and thereby causing out-of-bounds access. there may be other situations where it's dangerous for the thread count to be too low, particularly in the case where only one thread should be left, in which case locking may be omitted. however, all such code paths seem to arise from undefined behavior, since async-signal-unsafe functions are not permitted to be called from a signal handler that interrupts pthread_exit (which is itself async-signal-unsafe). this change may also simplify logic in __synccall and improve the chances of making __synccall async-signal-safe.
-
由 Rich Felker 提交于
for the duration of the vm-sharing clone used by posix_spawn, all signals are blocked in the parent process, including implementation-internal signals. since __synccall cannot do anything until successfully signaling all threads, the fact that signals are blocked automatically yields the necessary safety. aside from debloating and general simplification, part of the motivation for removing the explicit lock is to simplify the synchronization logic of __synccall in hopes that it can be made async-signal-safe, which is needed to make setuid and setgid, which depend on __synccall, conform to the standard. whether this will be possible remains to be seen.
-
- 23 4月, 2013 1 次提交
-
-
由 Rich Felker 提交于
C++11, the first C++ with stdint.h, requires the previously protected macros to be exposed unconditionally by stdint.h. apparently these checks were an early attempt by the C committee to guess what the C++ committee would want, and they guessed wrong.
-
- 22 4月, 2013 1 次提交
-
-
由 Rich Felker 提交于
this caused sigsetjmp not to save the signal mask but instead to clobber it with whatever happened to be in the sigjmb_buf prior to the call.
-