libphobos: Add support for RISCV to glibc bindings

Backported from upstream druntime master.

Reviewed-on: https://github.com/dlang/druntime/pull/2355

From-SVN: r266713
This commit is contained in:
Iain Buclaw 2018-12-01 21:48:43 +00:00
parent 16e48dd1b4
commit 5a5129a0df
18 changed files with 374 additions and 6 deletions

View File

@ -34,6 +34,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -128,6 +130,12 @@ version (GNUFP)
alias fenv_t = double;
alias fexcept_t = uint;
}
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/riscv/bits/fenv.h
else version (RISCV_Any)
{
alias fenv_t = uint;
alias fexcept_t = uint;
}
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/sparc/fpu/bits/fenv.h
else version (SPARC64)
{
@ -573,6 +581,28 @@ else
FE_DOWNWARD = 3, ///
}
}
else version (RISCV_Any)
{
// Define bits representing exceptions in the FPSR status word.
enum
{
FE_INEXACT = 0x01, ///
FE_UNDERFLOW = 0x02, ///
FE_OVERFLOW = 0x04, ///
FE_DIVBYZERO = 0x08, ///
FE_INVALID = 0x10, ///
FE_ALL_EXCEPT = 0x1f, ///
}
// Define bits representing rounding modes in the FPCR Rmode field.
enum
{
FE_TONEAREST = 0x0, ///
FE_TOWARDZERO = 0x1, ///
FE_DOWNWARD = 0x2, ///
FE_UPWARD = 0x3, ///
}
}
else version (SPARC_Any)
{
// Define bits representing the exception.

View File

@ -30,6 +30,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -159,6 +161,13 @@ else version (CRuntime_Glibc)
///
enum int FP_ILOGBNAN = int.max;
}
else version (RISCV_Any)
{
///
enum int FP_ILOGB0 = -int.max;
///
enum int FP_ILOGBNAN = int.max;
}
else version (SPARC_Any)
{
///

View File

@ -16,6 +16,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -123,6 +125,30 @@ else version (ARM_Any)
void _dl_mcount_wrapper_check(void* __selfpc);
}
}
else version (RISCV_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h
// enum RTLD_LAZY = 0x0001; // POSIX
// enum RTLD_NOW = 0x0002; // POSIX
enum RTLD_BINDING_MASK = 0x3;
enum RTLD_NOLOAD = 0x00004;
enum RTLD_DEEPBIND = 0x00008;
// enum RTLD_GLOBAL = 0x00100; // POSIX
// enum RTLD_LOCAL = 0; // POSIX
enum RTLD_NODELETE = 0x01000;
static if (__USE_GNU)
{
RT DL_CALL_FCT(RT, Args...)(RT function(Args) fctp, auto ref Args args)
{
_dl_mcount_wrapper_check(cast(void*)fctp);
return fctp(args);
}
void _dl_mcount_wrapper_check(void* __selfpc);
}
}
else version (SPARC_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/dlfcn.h

View File

@ -21,6 +21,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -92,6 +94,14 @@ else version (MIPS_Any)
epoll_data_t data;
}
}
else version (RISCV_Any)
{
struct epoll_event
{
uint events;
epoll_data_t data;
}
}
else version (SPARC_Any)
{
struct epoll_event

View File

@ -15,6 +15,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
version (X86) version = X86_Any;
@ -50,6 +52,12 @@ else version (ARM_Any)
alias __WORDSIZE __ELF_NATIVE_CLASS;
alias uint32_t Elf_Symndx;
}
else version (RISCV_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h
alias __WORDSIZE __ELF_NATIVE_CLASS;
alias uint32_t Elf_Symndx;
}
else version (SPARC_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h

View File

@ -18,6 +18,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -64,6 +66,12 @@ else version (ARM_Any)
enum EFD_CLOEXEC = 0x80000; // octal!2000000
enum EFD_NONBLOCK = 0x800; // octal!4000
}
else version (RISCV_Any)
{
enum EFD_SEMAPHORE = 1;
enum EFD_CLOEXEC = 0x80000; // octal!2000000
enum EFD_NONBLOCK = 0x800; // octal!4000
}
else version (SPARC_Any)
{
enum EFD_SEMAPHORE = 1;

View File

@ -17,6 +17,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -86,6 +88,11 @@ else version (ARM_Any)
enum IN_CLOEXEC = 0x80000; // octal!2000000
enum IN_NONBLOCK = 0x800; // octal!4000
}
else version (RISCV_Any)
{
enum IN_CLOEXEC = 0x80000; // octal!2000000
enum IN_NONBLOCK = 0x800; // octal!4000
}
else version (SPARC_Any)
{
enum IN_CLOEXEC = 0x80000; // octal!2000000

View File

@ -17,6 +17,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -53,6 +55,31 @@ version (PPC_Any)
// MCL_FUTURE = 0x4000,
// }
}
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/riscv/bits/mman.h
else version (RISCV_Any)
{
static if (__USE_MISC) enum
{
MAP_GROWSDOWN = 0x00100,
MAP_DENYWRITE = 0x00800,
MAP_EXECUTABLE = 0x01000,
MAP_LOCKED = 0x02000,
MAP_NORESERVE = 0x04000,
MAP_POPULATE = 0x08000,
MAP_NONBLOCK = 0x10000,
MAP_STACK = 0x20000,
MAP_HUGETLB = 0x40000,
MAP_SYNC = 0x80000,
MAP_FIXED_NOREPLACE = 0x100000,
}
// in core.sys.posix.sys.mman
// enum
// {
// MCL_CURRENT = 0x2000,
// MCL_FUTURE = 0x4000,
// }
}
// http://sourceware.org/git/?p=glibc.git;a=blob;hb=51e945a8f950a6695754b11c1e6fba8bb750e100;f=sysdeps/unix/sysv/linux/s390/bits/mman.h
else version (IBMZ_Any)
{

View File

@ -31,6 +31,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -88,6 +90,13 @@ version (CRuntime_Glibc)
enum RTLD_GLOBAL = 0x00100;
enum RTLD_LOCAL = 0;
}
else version (RISCV_Any)
{
enum RTLD_LAZY = 0x00001;
enum RTLD_NOW = 0x00002;
enum RTLD_GLOBAL = 0x00100;
enum RTLD_LOCAL = 0;
}
else version (SPARC_Any)
{
enum RTLD_LAZY = 0x00001;

View File

@ -34,6 +34,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -191,6 +193,19 @@ version (CRuntime_Glibc)
enum O_DSYNC = 0x1000; // octal 010000
enum O_RSYNC = O_SYNC;
}
else version (RISCV_Any)
{
enum O_CREAT = 0x40; // octal 0100
enum O_EXCL = 0x80; // octal 0200
enum O_NOCTTY = 0x100; // octal 0400
enum O_TRUNC = 0x200; // octal 01000
enum O_APPEND = 0x400; // octal 02000
enum O_NONBLOCK = 0x800; // octal 04000
enum O_SYNC = 0x101000; // octal 04010000
enum O_DSYNC = 0x1000; // octal 010000
enum O_RSYNC = O_SYNC;
}
else version (SPARC_Any)
{
enum O_CREAT = 0x200;

View File

@ -20,6 +20,9 @@ private import core.sys.posix.signal; // for sigset_t
version (Posix):
extern (C) nothrow @nogc:
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
//
// Required
//
@ -125,6 +128,17 @@ version (CRuntime_Glibc)
double[6] __fpregs;
}
}
else version (RISCV_Any)
{
struct __riscv_jmp_buf
{
c_long __pc;
c_long[12] __regs;
c_long __sp;
double[12] __fpregs;
}
alias __jmp_buf = __riscv_jmp_buf[1];
}
else version (SystemZ)
{
struct __s390_jmp_buf

View File

@ -31,6 +31,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -328,6 +330,30 @@ version (linux)
enum SIGUSR2 = 12;
enum SIGURG = 23;
}
else version (RISCV_Any)
{
//SIGABRT (defined in core.stdc.signal)
enum SIGALRM = 14;
enum SIGBUS = 7;
enum SIGCHLD = 17;
enum SIGCONT = 18;
//SIGFPE (defined in core.stdc.signal)
enum SIGHUP = 1;
//SIGILL (defined in core.stdc.signal)
//SIGINT (defined in core.stdc.signal)
enum SIGKILL = 9;
enum SIGPIPE = 13;
enum SIGQUIT = 3;
//SIGSEGV (defined in core.stdc.signal)
enum SIGSTOP = 19;
//SIGTERM (defined in core.stdc.signal)
enum SIGTSTP = 20;
enum SIGTTIN = 21;
enum SIGTTOU = 22;
enum SIGUSR1 = 10;
enum SIGUSR2 = 12;
enum SIGURG = 23;
}
else version (SPARC_Any)
{
//SIGABRT (defined in core.stdc.signal)
@ -2019,6 +2045,16 @@ version (CRuntime_Glibc)
enum SIGXCPU = 24;
enum SIGXFSZ = 25;
}
else version (RISCV_Any)
{
enum SIGPOLL = 29;
enum SIGPROF = 27;
enum SIGSYS = 31;
enum SIGTRAP = 5;
enum SIGVTALRM = 26;
enum SIGXCPU = 24;
enum SIGXFSZ = 25;
}
else version (SPARC_Any)
{
enum SIGPOLL = 23;

View File

@ -34,6 +34,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -356,6 +358,8 @@ version (CRuntime_Glibc)
enum MS_INVALIDATE = 2;
enum MS_SYNC = 4;
}
else version (RISCV_Any)
private enum DEFAULTS = true;
else version (SPARC_Any)
private enum DEFAULTS = true;
else version (PPC_Any)

View File

@ -180,6 +180,51 @@ else version (PPC64)
c_ulong __glibc_reserved5;
}
}
else version (RISCV32)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/generic/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
c_ulong __glibc_reserved1;
time_t msg_stime;
c_ulong __glibc_reserved2;
time_t msg_rtime;
c_ulong __glibc_reserved3;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (RISCV64)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/generic/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (S390)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/s390/bits/msq.h

View File

@ -33,6 +33,8 @@ version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
@ -391,6 +393,40 @@ version (CRuntime_Glibc)
SO_TYPE = 3
}
}
else version (RISCV_Any)
{
enum
{
SOCK_DGRAM = 2,
SOCK_SEQPACKET = 5,
SOCK_STREAM = 1
}
enum
{
SOL_SOCKET = 1
}
enum
{
SO_ACCEPTCONN = 30,
SO_BROADCAST = 6,
SO_DEBUG = 1,
SO_DONTROUTE = 5,
SO_ERROR = 4,
SO_KEEPALIVE = 9,
SO_LINGER = 13,
SO_OOBINLINE = 10,
SO_RCVBUF = 8,
SO_RCVLOWAT = 18,
SO_RCVTIMEO = 20,
SO_REUSEADDR = 2,
SO_SNDBUF = 7,
SO_SNDLOWAT = 19,
SO_SNDTIMEO = 21,
SO_TYPE = 3
}
}
else version (SPARC_Any)
{
enum

View File

@ -28,6 +28,9 @@ else version (TVOS)
else version (WatchOS)
version = Darwin;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (Posix):
extern (C) nothrow @nogc:
@ -353,6 +356,30 @@ version (CRuntime_Glibc)
c_ulong __unused6;
}
}
else version (RISCV_Any)
{
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;
dev_t __pad1;
off_t st_size;
blksize_t st_blksize;
int __pad2;
time_t st_atime;
c_ulong st_atime_nsec;
time_t st_mtime;
c_ulong st_mtime_nsec;
time_t st_ctime;
c_ulong st_ctime_nsec;
int[2] __reserved;
}
}
else version (ARM)
{
private

View File

@ -23,6 +23,9 @@ extern (C):
nothrow:
@nogc:
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
//
// XOpen (XSI)
//
@ -542,6 +545,55 @@ version (CRuntime_Glibc)
mcontext_t uc_mcontext;
}
}
else version (RISCV_Any)
{
private
{
alias c_ulong[32] __riscv_mc_gp_state;
struct __riscv_mc_f_ext_state
{
uint[32] __f;
uint __fcsr;
}
struct __riscv_mc_d_ext_state
{
ulong[32] __f;
uint __fcsr;
}
struct __riscv_mc_q_ext_state
{
align(16) ulong[64] __f;
uint __fcsr;
uint[3] __reserved;
}
union __riscv_mc_fp_state
{
__riscv_mc_f_ext_state __f;
__riscv_mc_d_ext_state __d;
__riscv_mc_q_ext_state __q;
}
}
struct mcontext_t
{
__riscv_mc_gp_state __gregs;
__riscv_mc_fp_state __fpregs;
}
struct ucontext_t
{
c_ulong __uc_flags;
ucontext_t* uc_link;
stack_t uc_stack;
sigset_t uc_sigmask;
char[1024 / 8 - sigset_t.sizeof] __reserved;
mcontext_t uc_mcontext;
}
}
else version (SPARC64)
{
enum MC_NGREG = 19;

View File

@ -965,19 +965,24 @@ extern(C) void* __tls_get_addr(tls_index* ti) nothrow @nogc;
* each TLS block. This is at least true for PowerPC and Mips platforms.
* See: https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/powerpc/dl-tls.h;h=f7cf6f96ebfb505abfd2f02be0ad0e833107c0cd;hb=HEAD#l34
* https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/mips/dl-tls.h;h=93a6dc050cb144b9f68b96fb3199c60f5b1fcd18;hb=HEAD#l32
* https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/riscv/dl-tls.h;h=ab2d860314de94c18812bc894ff6b3f55368f20f;hb=HEAD#l32
*/
version (X86)
enum TLS_DTV_OFFSET = 0x;
enum TLS_DTV_OFFSET = 0x0;
else version (X86_64)
enum TLS_DTV_OFFSET = 0x;
enum TLS_DTV_OFFSET = 0x0;
else version (ARM)
enum TLS_DTV_OFFSET = 0x;
enum TLS_DTV_OFFSET = 0x0;
else version (AArch64)
enum TLS_DTV_OFFSET = 0x;
enum TLS_DTV_OFFSET = 0x0;
else version (RISCV32)
enum TLS_DTV_OFFSET = 0x800;
else version (RISCV64)
enum TLS_DTV_OFFSET = 0x800;
else version (SPARC)
enum TLS_DTV_OFFSET = 0x;
enum TLS_DTV_OFFSET = 0x0;
else version (SPARC64)
enum TLS_DTV_OFFSET = 0x;
enum TLS_DTV_OFFSET = 0x0;
else version (PPC)
enum TLS_DTV_OFFSET = 0x8000;
else version (PPC64)