Commit 6e5084b4 by Iain Buclaw

libphobos: Merge upstream druntime 7915b6a3

Includes port fixes for Musl on ARM, AArch64, and SystemZ targets.

Reviewed-on: https://github.com/dlang/druntime/pull/2751
             https://github.com/dlang/druntime/pull/2843
             https://github.com/dlang/druntime/pull/2844
             https://github.com/dlang/druntime/pull/2898
parent 9a6408bd
5bb8ce19fa495e5f794b3c513ae1bf7aabae93ff 7915b6a399fbb6d9c0db351eb5a8fda7e43fe8c5
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the dlang/druntime repository. merge done from the dlang/druntime repository.
...@@ -386,6 +386,8 @@ else version (CRuntime_Musl) ...@@ -386,6 +386,8 @@ else version (CRuntime_Musl)
} }
else version (ARM) else version (ARM)
{ {
import core.stdc.config : c_ulong;
struct fenv_t struct fenv_t
{ {
c_ulong __cw; c_ulong __cw;
......
...@@ -67,15 +67,21 @@ version (CRuntime_Glibc) ...@@ -67,15 +67,21 @@ version (CRuntime_Glibc)
} }
else version (CRuntime_Musl) else version (CRuntime_Musl)
{ {
// off_t is always 64 bits on Musl
enum _FILE_OFFSET_BITS = 64; enum _FILE_OFFSET_BITS = 64;
// Not present in Musl sources
enum __REDIRECT = false; enum __REDIRECT = false;
// Those three are irrelevant for Musl as it always uses 64 bits off_t
enum __USE_FILE_OFFSET64 = _FILE_OFFSET_BITS == 64; enum __USE_FILE_OFFSET64 = _FILE_OFFSET_BITS == 64;
enum __USE_LARGEFILE = __USE_FILE_OFFSET64 && !__REDIRECT; enum __USE_LARGEFILE = __USE_FILE_OFFSET64 && !__REDIRECT;
enum __USE_LARGEFILE64 = __USE_FILE_OFFSET64 && !__REDIRECT; enum __USE_LARGEFILE64 = __USE_FILE_OFFSET64 && !__REDIRECT;
enum __WORDSIZE=64; version (D_LP64)
enum __WORDSIZE = 64;
else
enum __WORDSIZE = 32;
} }
else version (CRuntime_UClibc) else version (CRuntime_UClibc)
{ {
......
...@@ -779,7 +779,102 @@ else version (CRuntime_Bionic) ...@@ -779,7 +779,102 @@ else version (CRuntime_Bionic)
} }
else version (CRuntime_Musl) else version (CRuntime_Musl)
{ {
enum { version (X86_64)
{
enum
{
O_DIRECTORY = 0x010000, // octal 0200000
O_NOFOLLOW = 0x020000, // octal 0400000
O_DIRECT = 0x004000, // octal 040000
O_LARGEFILE = 0,
O_TMPFILE = 0x410000, // octal 020200000
F_GETLK = 5,
F_SETLK = 6,
F_SETLKW = 7,
}
}
// Note: Definitions for i386 are in arch/generic/bits/fcntl.h
else version (X86)
{
enum
{
O_DIRECTORY = 0x010000, // octal 0200000
O_NOFOLLOW = 0x020000, // octal 0400000
O_DIRECT = 0x004000, // octal 040000
O_LARGEFILE = 0x008000, // octal 0100000
O_TMPFILE = 0x410000, // octal 020200000
F_GETLK = 12,
F_SETLK = 13,
F_SETLKW = 14,
}
}
else version (ARM)
{
enum
{
O_DIRECTORY = 0x004000, // octal 040000
O_NOFOLLOW = 0x008000, // octal 0100000
O_DIRECT = 0x010000, // octal 0200000
O_LARGEFILE = 0x020000, // octal 0400000
O_TMPFILE = 0x404000, // octal 020040000
F_GETLK = 12,
F_SETLK = 13,
F_SETLKW = 14,
}
}
else version (AArch64)
{
enum
{
O_DIRECTORY = 0x004000, // octal 040000
O_NOFOLLOW = 0x008000, // octal 0100000
O_DIRECT = 0x010000, // octal 0200000
O_LARGEFILE = 0x020000, // octal 0400000
O_TMPFILE = 0x404000, // octal 020040000
F_GETLK = 5,
F_SETLK = 6,
F_SETLKW = 7,
}
}
else version (SystemZ)
{
enum
{
O_DIRECTORY = 0x010000, // octal 0200000
O_NOFOLLOW = 0x020000, // octal 0400000
O_DIRECT = 0x004000, // octal 040000
O_LARGEFILE = 0x008000, // octal 0100000
O_TMPFILE = 0x410000, // octal 020200000
F_GETLK = 5,
F_SETLK = 6,
F_SETLKW = 7,
}
}
else version (PPC64)
{
enum
{
O_DIRECTORY = 0x004000, // octal 040000
O_NOFOLLOW = 0x008000, // octal 0100000
O_DIRECT = 0x020000, // octal 0400000
O_LARGEFILE = 0x010000, // octal 0200000
O_TMPFILE = 0x410000, // octal 020200000
F_GETLK = 5,
F_SETLK = 6,
F_SETLKW = 7,
}
}
else
static assert(0, "Platform not supported");
enum
{
O_CREAT = 0x40, // octal 0100 O_CREAT = 0x40, // octal 0100
O_EXCL = 0x80, // octal 0200 O_EXCL = 0x80, // octal 0200
O_NOCTTY = 0x100, // octal 0400 O_NOCTTY = 0x100, // octal 0400
...@@ -790,16 +885,11 @@ else version (CRuntime_Musl) ...@@ -790,16 +885,11 @@ else version (CRuntime_Musl)
O_DSYNC = 0x1000, // octal 010000 O_DSYNC = 0x1000, // octal 010000
O_SYNC = 0x101000, // octal 04010000 O_SYNC = 0x101000, // octal 04010000
O_RSYNC = O_SYNC, O_RSYNC = O_SYNC,
O_DIRECTORY = 0x10000,
O_NOFOLLOW = 0x20000,
O_CLOEXEC = 0x80000, O_CLOEXEC = 0x80000,
O_ASYNC = 0x2000, O_ASYNC = 0x2000,
O_DIRECT = 0x4000,
O_LARGEFILE = 0,
O_NOATIME = 0x40000, O_NOATIME = 0x40000,
O_PATH = 0x200000, O_PATH = 0x200000,
O_TMPFILE = 0x410000,
O_NDELAY = O_NONBLOCK, O_NDELAY = O_NONBLOCK,
O_SEARCH = O_PATH, O_SEARCH = O_PATH,
O_EXEC = O_PATH, O_EXEC = O_PATH,
...@@ -809,19 +899,19 @@ else version (CRuntime_Musl) ...@@ -809,19 +899,19 @@ else version (CRuntime_Musl)
O_WRONLY = 01, O_WRONLY = 01,
O_RDWR = 02, O_RDWR = 02,
} }
enum { enum
{
F_DUPFD = 0, F_DUPFD = 0,
F_GETFD = 1, F_GETFD = 1,
F_SETFD = 2, F_SETFD = 2,
F_GETFL = 3, F_GETFL = 3,
F_SETFL = 4, F_SETFL = 4,
F_GETLK = 5, // F_GETLK, F_SETLK, F_SETLKW are arch-specific
F_SETLK = 6,
F_SETLKW = 7,
F_SETOWN = 8, F_SETOWN = 8,
F_GETOWN = 9, F_GETOWN = 9,
} }
enum { enum
{
F_RDLCK = 0, F_RDLCK = 0,
F_WRLCK = 1, F_WRLCK = 1,
F_UNLCK = 2, F_UNLCK = 2,
......
...@@ -143,8 +143,10 @@ else version (CRuntime_Bionic) ...@@ -143,8 +143,10 @@ else version (CRuntime_Bionic)
else version (CRuntime_Musl) else version (CRuntime_Musl)
{ {
struct sem_t { struct sem_t {
int[4*long.sizeof/int.sizeof] __val; int[4*c_long.sizeof/int.sizeof] __val;
} }
enum SEM_FAILED = (sem_t*).init;
} }
else version (CRuntime_UClibc) else version (CRuntime_UClibc)
{ {
......
...@@ -1895,22 +1895,52 @@ else version (CRuntime_Musl) ...@@ -1895,22 +1895,52 @@ else version (CRuntime_Musl)
enum enum
{ {
SO_DEBUG = 1, SO_DEBUG = 1
SO_REUSEADDR = 2, }
SO_TYPE = 3,
SO_ERROR = 4, version (MIPS_Any)
SO_DONTROUTE = 5, {
SO_BROADCAST = 6, enum
SO_SNDBUF = 7, {
SO_RCVBUF = 8, SO_REUSEADDR = 0x0004,
SO_KEEPALIVE = 9, SO_TYPE = 0x1008,
SO_OOBINLINE = 10, SO_ERROR = 0x1007,
SO_LINGER = 13, SO_DONTROUTE = 0x0010,
SO_RCVLOWAT = 18, SO_BROADCAST = 0x0020,
SO_SNDLOWAT = 19, SO_SNDBUF = 0x1001,
SO_RCVTIMEO = 20, SO_RCVBUF = 0x1002,
SO_SNDTIMEO = 21, SO_KEEPALIVE = 0x0008,
SO_ACCEPTCONN = 30 SO_OOBINLINE = 0x0100,
SO_LINGER = 0x0080,
SO_REUSEPORT = 0x0200,
SO_RCVLOWAT = 0x1004,
SO_SNDLOWAT = 0x1003,
SO_RCVTIMEO = 0x1006,
SO_SNDTIMEO = 0x1005,
SO_ACCEPTCONN = 0x1009
}
}
else
{
enum
{
SO_REUSEADDR = 2,
SO_TYPE = 3,
SO_ERROR = 4,
SO_DONTROUTE = 5,
SO_BROADCAST = 6,
SO_SNDBUF = 7,
SO_RCVBUF = 8,
SO_KEEPALIVE = 9,
SO_OOBINLINE = 10,
SO_LINGER = 13,
SO_REUSEPORT = 15,
SO_RCVLOWAT = 18,
SO_SNDLOWAT = 19,
SO_RCVTIMEO = 20,
SO_SNDTIMEO = 21,
SO_ACCEPTCONN = 30
}
} }
enum : uint enum : uint
......
...@@ -1664,31 +1664,225 @@ else version (CRuntime_Musl) ...@@ -1664,31 +1664,225 @@ else version (CRuntime_Musl)
S_ISGID = 0x400, // octal 02000 S_ISGID = 0x400, // octal 02000
S_ISVTX = 0x200, // octal 01000 S_ISVTX = 0x200, // octal 01000
} }
struct stat_t { version (ARM)
dev_t st_dev; {
ino_t st_ino; struct stat_t
nlink_t st_nlink; {
dev_t st_dev;
mode_t st_mode; int __st_dev_padding;
uid_t st_uid; c_long __st_ino_truncated;
gid_t st_gid; mode_t st_mode;
uint __pad0; nlink_t st_nlink;
dev_t st_rdev;
off_t st_size; uid_t st_uid;
blksize_t st_blksize; gid_t st_gid;
blkcnt_t st_blocks; dev_t st_rdev;
int __st_rdev_padding;
off_t st_size;
blksize_t st_blksize;
blkcnt_t st_blocks;
timespec st_atim;
timespec st_mtim;
timespec st_ctim;
ino_t st_ino;
extern(D) @safe @property inout pure nothrow
{
ref inout(time_t) st_atime() return { return st_atim.tv_sec; }
ref inout(time_t) st_mtime() return { return st_mtim.tv_sec; }
ref inout(time_t) st_ctime() return { return st_ctim.tv_sec; }
}
}
}
else version (AArch64)
{
struct stat_t
{
dev_t st_dev;
ino_t st_ino;
mode_t st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
c_ulong __pad;
off_t st_size;
blksize_t st_blksize;
int __pad2;
blkcnt_t st_blocks;
timespec st_atim;
timespec st_mtim;
timespec st_ctim;
uint[2] __unused;
extern(D) @safe @property inout pure nothrow
{
ref inout(time_t) st_atime() return { return st_atim.tv_sec; }
ref inout(time_t) st_mtime() return { return st_mtim.tv_sec; }
ref inout(time_t) st_ctime() return { return st_ctim.tv_sec; }
}
}
}
else version (X86_64)
{
struct stat_t
{
dev_t st_dev;
ino_t st_ino;
nlink_t st_nlink;
mode_t st_mode;
uid_t st_uid;
gid_t st_gid;
uint __pad0;
dev_t st_rdev;
off_t st_size;
blksize_t st_blksize;
blkcnt_t st_blocks;
timespec st_atim;
timespec st_mtim;
timespec st_ctim;
c_long[3] __unused;
extern(D) @safe @property inout pure nothrow
{
ref inout(time_t) st_atime() return { return st_atim.tv_sec; }
ref inout(time_t) st_mtime() return { return st_mtim.tv_sec; }
ref inout(time_t) st_ctime() return { return st_ctim.tv_sec; }
}
}
}
else version (X86)
{
struct stat_t
{
dev_t st_dev;
int __st_dev_padding;
c_long __st_ino_truncated;
mode_t st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
int __st_rdev_padding;
off_t st_size;
blksize_t st_blksize;
blkcnt_t st_blocks;
timespec st_atim;
timespec st_mtim;
timespec st_ctim;
ino_t st_ino;
extern(D) @safe @property inout pure nothrow
{
ref inout(time_t) st_atime() return { return st_atim.tv_sec; }
ref inout(time_t) st_mtime() return { return st_mtim.tv_sec; }
ref inout(time_t) st_ctime() return { return st_ctim.tv_sec; }
}
}
}
else version (MIPS64)
{
struct stat_t
{
dev_t st_dev;
int[3] __pad1;
ino_t st_ino;
mode_t st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
uint[2] __pad2;
off_t st_size;
int __pad3;
timespec st_atim;
timespec st_mtim;
timespec st_ctim;
blksize_t st_blksize;
uint __pad4;
blkcnt_t st_blocks;
int[14] __pad5;
extern(D) @safe @property inout pure nothrow
{
ref inout(time_t) st_atime() return { return st_atim.tv_sec; }
ref inout(time_t) st_mtime() return { return st_mtim.tv_sec; }
ref inout(time_t) st_ctime() return { return st_ctim.tv_sec; }
}
}
}
else version (PPC64)
{
struct stat_t
{
dev_t st_dev;
ino_t st_ino;
nlink_t st_nlink;
mode_t st_mode;
timespec st_atim; uid_t st_uid;
timespec st_mtim; gid_t st_gid;
timespec st_ctim; dev_t st_rdev;
extern(D) @safe @property inout pure nothrow off_t st_size;
blksize_t st_blksize;
blkcnt_t st_blocks;
timespec st_atim;
timespec st_mtim;
timespec st_ctim;
c_ulong[3] __unused;
extern(D) @safe @property inout pure nothrow
{
ref inout(time_t) st_atime() return { return st_atim.tv_sec; }
ref inout(time_t) st_mtime() return { return st_mtim.tv_sec; }
ref inout(time_t) st_ctime() return { return st_ctim.tv_sec; }
}
}
}
else version (SystemZ)
{
struct stat_t
{ {
ref inout(time_t) st_atime() return { return st_atim.tv_sec; } dev_t st_dev;
ref inout(time_t) st_mtime() return { return st_mtim.tv_sec; } ino_t st_ino;
ref inout(time_t) st_ctime() return { return st_ctim.tv_sec; } nlink_t st_nlink;
mode_t st_mode;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
off_t st_size;
timespec st_atim;
timespec st_mtim;
timespec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
c_ulong[3] __unused;
extern(D) @safe @property inout pure nothrow
{
ref inout(time_t) st_atime() return { return st_atim.tv_sec; }
ref inout(time_t) st_mtime() return { return st_mtim.tv_sec; }
ref inout(time_t) st_ctime() return { return st_ctim.tv_sec; }
}
} }
long[3] __unused;
} }
else
static assert("Unsupported platform");
private private
{ {
extern (D) bool S_ISTYPE( mode_t mode, uint mask ) extern (D) bool S_ISTYPE( mode_t mode, uint mask )
......
...@@ -112,8 +112,26 @@ version (CRuntime_Glibc) ...@@ -112,8 +112,26 @@ version (CRuntime_Glibc)
} }
else version (CRuntime_Musl) else version (CRuntime_Musl)
{ {
alias c_long blksize_t; version (AArch64)
alias c_ulong nlink_t; {
alias int blksize_t;
alias uint nlink_t;
}
else version (MIPS64)
{
alias c_long blksize_t;
alias uint nlink_t;
}
else version (RISCV64)
{
alias int blksize_t;
alias uint nlink_t;
}
else
{
alias c_long blksize_t;
alias c_ulong nlink_t;
}
alias long dev_t; alias long dev_t;
alias long blkcnt_t; alias long blkcnt_t;
alias ulong ino_t; alias ulong ino_t;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment