From c8bf6646ed17bfb7e2350152935e9cba829bf929 Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Thu, 11 Apr 2019 21:11:15 +0000 Subject: [PATCH] libphobos: Merge upstream phobos cf95639ff Backports ports committed to upstream phobos since the last sync. Reviewed-on: https://github.com/dlang/phobos/pull/6947 From-SVN: r270296 --- libphobos/src/MERGE | 2 +- libphobos/src/std/datetime/systime.d | 16 ++++++ libphobos/src/std/datetime/timezone.d | 18 +++++-- .../allocator/building_blocks/region.d | 2 + libphobos/src/std/file.d | 13 ++++- libphobos/src/std/internal/cstring.d | 11 ++-- libphobos/src/std/math.d | 54 +++++++++++++++++++ libphobos/src/std/parallelism.d | 8 +++ libphobos/src/std/path.d | 2 +- libphobos/src/std/socket.d | 8 +++ libphobos/src/std/stdio.d | 6 +++ 11 files changed, 128 insertions(+), 12 deletions(-) diff --git a/libphobos/src/MERGE b/libphobos/src/MERGE index 63bd46834c5..b4d44b55624 100644 --- a/libphobos/src/MERGE +++ b/libphobos/src/MERGE @@ -1,4 +1,4 @@ -ef07932811de50a1d5810ea23462d127a60574a6 +cf95639ffd9ed6f3b9d10d98461b2fbd31615757 The first line of this file holds the git revision number of the last merge done from the dlang/phobos repository. diff --git a/libphobos/src/std/datetime/systime.d b/libphobos/src/std/datetime/systime.d index e65d296e427..326b5441724 100644 --- a/libphobos/src/std/datetime/systime.d +++ b/libphobos/src/std/datetime/systime.d @@ -214,6 +214,22 @@ public: hnsecsToUnixEpoch; } } + else version (DragonFlyBSD) + { + import core.sys.dragonflybsd.time : clock_gettime, CLOCK_REALTIME, + CLOCK_REALTIME_FAST, CLOCK_REALTIME_PRECISE, CLOCK_SECOND; + static if (clockType == ClockType.coarse) alias clockArg = CLOCK_REALTIME_FAST; + else static if (clockType == ClockType.normal) alias clockArg = CLOCK_REALTIME; + else static if (clockType == ClockType.precise) alias clockArg = CLOCK_REALTIME_PRECISE; + else static if (clockType == ClockType.second) alias clockArg = CLOCK_SECOND; + else static assert(0, "Previous static if is wrong."); + timespec ts; + if (clock_gettime(clockArg, &ts) != 0) + throw new TimeException("Call to clock_gettime() failed"); + return convert!("seconds", "hnsecs")(ts.tv_sec) + + ts.tv_nsec / 100 + + hnsecsToUnixEpoch; + } else version (Solaris) { static if (clockType == ClockType.second) diff --git a/libphobos/src/std/datetime/timezone.d b/libphobos/src/std/datetime/timezone.d index e923a34a98d..7ae19020243 100644 --- a/libphobos/src/std/datetime/timezone.d +++ b/libphobos/src/std/datetime/timezone.d @@ -292,10 +292,12 @@ public: version (Posix) { - version (FreeBSD) enum utcZone = "Etc/UTC"; - else version (NetBSD) enum utcZone = "UTC"; - else version (linux) enum utcZone = "UTC"; - else version (OSX) enum utcZone = "UTC"; + version (FreeBSD) enum utcZone = "Etc/UTC"; + else version (NetBSD) enum utcZone = "UTC"; + else version (DragonFlyBSD) enum utcZone = "UTC"; + else version (linux) enum utcZone = "UTC"; + else version (OSX) enum utcZone = "UTC"; + else version (Solaris) enum utcZone = "UTC"; else static assert(0, "The location of the UTC timezone file on this Posix platform must be set."); auto tzs = [testTZ("America/Los_Angeles", "PST", "PDT", dur!"hours"(-8), dur!"hours"(1)), @@ -1891,6 +1893,14 @@ public: // Android concatenates all time zone data into a single file and stores it here. enum defaultTZDatabaseDir = "/system/usr/share/zoneinfo/"; } + else version (Solaris) + { + /++ + The default directory where the TZ Database files are. It's empty + for Windows, since Windows doesn't have them. + +/ + enum defaultTZDatabaseDir = "/usr/share/lib/zoneinfo/"; + } else version (Posix) { /++ diff --git a/libphobos/src/std/experimental/allocator/building_blocks/region.d b/libphobos/src/std/experimental/allocator/building_blocks/region.d index dfcecce72bd..3d8431c23ca 100644 --- a/libphobos/src/std/experimental/allocator/building_blocks/region.d +++ b/libphobos/src/std/experimental/allocator/building_blocks/region.d @@ -392,6 +392,8 @@ struct InSituRegion(size_t size, size_t minAlign = platformAlignment) else version (PPC64) enum growDownwards = Yes.growDownwards; else version (MIPS32) enum growDownwards = Yes.growDownwards; else version (MIPS64) enum growDownwards = Yes.growDownwards; + else version (RISCV32) enum growDownwards = Yes.growDownwards; + else version (RISCV64) enum growDownwards = Yes.growDownwards; else version (SPARC) enum growDownwards = Yes.growDownwards; else version (SystemZ) enum growDownwards = Yes.growDownwards; else static assert(0, "Dunno how the stack grows on this architecture."); diff --git a/libphobos/src/std/file.d b/libphobos/src/std/file.d index 17b7ca82654..9ba992944eb 100644 --- a/libphobos/src/std/file.d +++ b/libphobos/src/std/file.d @@ -1488,6 +1488,7 @@ if (isInputRange!R && !isInfinite!R && isSomeChar!(ElementEncodingType!R)) // - OS X, where the native filesystem (HFS+) stores filesystem // timestamps with 1-second precision. version (FreeBSD) {} else +version (DragonFlyBSD) {} else version (OSX) {} else @system unittest { @@ -2779,6 +2780,10 @@ else version (NetBSD) { return readLink("/proc/self/exe"); } + else version (DragonFlyBSD) + { + return readLink("/proc/curproc/file"); + } else version (Solaris) { import core.sys.posix.unistd : getpid; @@ -3092,8 +3097,12 @@ else version (Posix) { import std.path : buildPath; - immutable len = core.stdc.string.strlen(fd.d_name.ptr); - _name = buildPath(path, fd.d_name[0 .. len]); + static if (is(typeof(fd.d_namlen))) + immutable len = fd.d_namlen; + else + immutable len = (() @trusted => core.stdc.string.strlen(fd.d_name.ptr))(); + + _name = buildPath(path, (() @trusted => fd.d_name.ptr[0 .. len])()); _didLStat = false; _didStat = false; diff --git a/libphobos/src/std/internal/cstring.d b/libphobos/src/std/internal/cstring.d index 257a1007b26..e5bc7f744bc 100644 --- a/libphobos/src/std/internal/cstring.d +++ b/libphobos/src/std/internal/cstring.d @@ -131,17 +131,20 @@ if (isSomeChar!To && (isInputRange!From || isSomeString!From) && private: To* _ptr; size_t _length; // length of the string + + // the 'small string optimization' version (unittest) { - enum buffLength = 16 / To.sizeof; // smaller size to trigger reallocations + // smaller size to trigger reallocations. Padding is to account for + // unittest/non-unittest cross-compilation (to avoid corruption) + To[16 / To.sizeof] _buff; + To[(256 - 16) / To.sizeof] _unittest_pad; } else { - enum buffLength = 256 / To.sizeof; // production size + To[256 / To.sizeof] _buff; // production size } - To[buffLength] _buff; // the 'small string optimization' - static Res trustedVoidInit() { Res res = void; return res; } } diff --git a/libphobos/src/std/math.d b/libphobos/src/std/math.d index e98e746a856..daee6ec3c33 100644 --- a/libphobos/src/std/math.d +++ b/libphobos/src/std/math.d @@ -162,6 +162,8 @@ version (AArch64) version = ARM_Any; version (ARM) version = ARM_Any; version (SPARC) version = SPARC_Any; version (SPARC64) version = SPARC_Any; +version (RISCV32) version = RISCV_Any; +version (RISCV64) version = RISCV_Any; version (D_InlineAsm_X86) { @@ -4683,6 +4685,7 @@ private: // The Pentium SSE2 status register is 32 bits. // The ARM and PowerPC FPSCR is a 32-bit register. // The SPARC FSR is a 32bit register (64 bits for SPARC 7 & 8, but high bits are uninteresting). + // The RISC-V (32 & 64 bit) fcsr is 32-bit register. uint flags; version (CRuntime_Microsoft) @@ -4987,6 +4990,10 @@ else version (PPC_Any) { version = IeeeFlagsSupport; } +else version (RISCV_Any) +{ + version = IeeeFlagsSupport; +} else version (MIPS_Any) { version = IeeeFlagsSupport; @@ -5226,6 +5233,21 @@ struct FloatingPointControl | inexactException, } } + else version (RISCV_Any) + { + enum : ExceptionMask + { + inexactException = 0x01, + divByZeroException = 0x02, + underflowException = 0x04, + overflowException = 0x08, + invalidException = 0x10, + severeExceptions = overflowException | divByZeroException + | invalidException, + allExceptions = severeExceptions | underflowException + | inexactException, + } + } else version (X86_Any) { enum : ExceptionMask @@ -5338,6 +5360,10 @@ private: { alias ControlState = uint; } + else version (RISCV_Any) + { + alias ControlState = uint; + } else version (X86_Any) { alias ControlState = ushort; @@ -7595,6 +7621,34 @@ private real polyImpl(real x, in real[] A) @trusted pure nothrow @nogc ; } } + else version (DragonFlyBSD) + { + asm pure nothrow @nogc // assembler by W. Bright + { + // EDX = (A.length - 1) * real.sizeof + mov ECX,A[EBP] ; // ECX = A.length + dec ECX ; + lea EDX,[ECX*8] ; + lea EDX,[EDX][ECX*4] ; + add EDX,A+4[EBP] ; + fld real ptr [EDX] ; // ST0 = coeff[ECX] + jecxz return_ST ; + fld x[EBP] ; // ST0 = x + fxch ST(1) ; // ST1 = x, ST0 = r + align 4 ; + L2: fmul ST,ST(1) ; // r *= x + fld real ptr -12[EDX] ; + sub EDX,12 ; // deg-- + faddp ST(1),ST ; + dec ECX ; + jne L2 ; + fxch ST(1) ; // ST1 = r, ST0 = x + fstp ST(0) ; // dump x + align 4 ; + return_ST: ; + ; + } + } else { static assert(0); diff --git a/libphobos/src/std/parallelism.d b/libphobos/src/std/parallelism.d index df07baf5ba2..64fa2f93c7e 100644 --- a/libphobos/src/std/parallelism.d +++ b/libphobos/src/std/parallelism.d @@ -94,6 +94,10 @@ else version (FreeBSD) { version = useSysctlbyname; } +else version (DragonFlyBSD) +{ + version = useSysctlbyname; +} else version (NetBSD) { version = useSysctlbyname; @@ -146,6 +150,10 @@ else version (useSysctlbyname) { auto nameStr = "hw.ncpu\0".ptr; } + else version (DragonFlyBSD) + { + auto nameStr = "hw.ncpu\0".ptr; + } else version (NetBSD) { auto nameStr = "hw.ncpu\0".ptr; diff --git a/libphobos/src/std/path.d b/libphobos/src/std/path.d index 32870ea118d..4a435efba6c 100644 --- a/libphobos/src/std/path.d +++ b/libphobos/src/std/path.d @@ -3970,7 +3970,7 @@ string expandTilde(string inputPath) nothrow } if (errno != ERANGE && - // On FreeBSD and OSX, errno can be left at 0 instead of set to ERANGE + // On BSD and OSX, errno can be left at 0 instead of set to ERANGE errno != 0) onOutOfMemoryError(); diff --git a/libphobos/src/std/socket.d b/libphobos/src/std/socket.d index 78479c85b58..2853dbde0c6 100644 --- a/libphobos/src/std/socket.d +++ b/libphobos/src/std/socket.d @@ -187,6 +187,14 @@ string formatSocketError(int err) @trusted else return "Socket error " ~ to!string(err); } + else version (DragonFlyBSD) + { + auto errs = strerror_r(err, buf.ptr, buf.length); + if (errs == 0) + cs = buf.ptr; + else + return "Socket error " ~ to!string(err); + } else version (Solaris) { auto errs = strerror_r(err, buf.ptr, buf.length); diff --git a/libphobos/src/std/stdio.d b/libphobos/src/std/stdio.d index 91646e79c1a..63bc32e9694 100644 --- a/libphobos/src/std/stdio.d +++ b/libphobos/src/std/stdio.d @@ -63,6 +63,12 @@ version (NetBSD) version = HAS_GETDELIM; } +version (DragonFlyBSD) +{ + version = GENERIC_IO; + version = HAS_GETDELIM; +} + version (Solaris) { version = GENERIC_IO;