diff --git a/zig/CMakeLists.txt b/zig/CMakeLists.txt index 0108f448df..1082827189 100644 --- a/zig/CMakeLists.txt +++ b/zig/CMakeLists.txt @@ -488,6 +488,7 @@ set(ZIG_STAGE2_SOURCES "${CMAKE_SOURCE_DIR}/lib/std/Target/avr.zig" "${CMAKE_SOURCE_DIR}/lib/std/Target/bpf.zig" "${CMAKE_SOURCE_DIR}/lib/std/Target/hexagon.zig" + "${CMAKE_SOURCE_DIR}/lib/std/Target/loongarch.zig" "${CMAKE_SOURCE_DIR}/lib/std/Target/mips.zig" "${CMAKE_SOURCE_DIR}/lib/std/Target/msp430.zig" "${CMAKE_SOURCE_DIR}/lib/std/Target/nvptx.zig" diff --git a/zig/deps/aro/aro/target.zig b/zig/deps/aro/aro/target.zig index f05e64d5a6..c332c9c683 100644 --- a/zig/deps/aro/aro/target.zig +++ b/zig/deps/aro/aro/target.zig @@ -768,7 +768,7 @@ test "alignment functions - smoke test" { var target: std.Target = undefined; const x86 = std.Target.Cpu.Arch.x86_64; target.cpu = std.Target.Cpu.baseline(x86); - target.os = std.Target.Os.Tag.defaultVersionRange(.linux, x86); + target.os = std.Target.Os.Tag.defaultVersionRange(.linux); target.abi = std.Target.Abi.default(x86, target.os); try std.testing.expect(isTlsSupported(target)); @@ -781,7 +781,7 @@ test "alignment functions - smoke test" { const arm = std.Target.Cpu.Arch.arm; target.cpu = std.Target.Cpu.baseline(arm); - target.os = std.Target.Os.Tag.defaultVersionRange(.ios, arm); + target.os = std.Target.Os.Tag.defaultVersionRange(.ios); target.abi = std.Target.Abi.default(arm, target.os); try std.testing.expect(!isTlsSupported(target)); @@ -799,7 +799,7 @@ test "target size/align tests" { const x86 = std.Target.Cpu.Arch.x86; comp.target.cpu.arch = x86; comp.target.cpu.model = &std.Target.x86.cpu.i586; - comp.target.os = std.Target.Os.Tag.defaultVersionRange(.linux, x86); + comp.target.os = std.Target.Os.Tag.defaultVersionRange(.linux); comp.target.abi = std.Target.Abi.gnu; const tt: Type = .{ @@ -811,7 +811,7 @@ test "target size/align tests" { const arm = std.Target.Cpu.Arch.arm; comp.target.cpu = std.Target.Cpu.Model.toCpu(&std.Target.arm.cpu.cortex_r4, arm); - comp.target.os = std.Target.Os.Tag.defaultVersionRange(.ios, arm); + comp.target.os = std.Target.Os.Tag.defaultVersionRange(.ios); comp.target.abi = std.Target.Abi.none; const ct: Type = .{ diff --git a/zig/lib/c.zig b/zig/lib/c.zig index 5d5040de7e..81ac8a4c5a 100644 --- a/zig/lib/c.zig +++ b/zig/lib/c.zig @@ -549,6 +549,33 @@ fn clone() callconv(.Naked) void { \\ restore ); }, + .loongarch64 => { + // __clone(func, stack, flags, arg, ptid, tls, ctid) + // a0, a1, a2, a3, a4, a5, a6 + // sys_clone(flags, stack, ptid, ctid, tls) + // a0, a1, a2, a3, a4 + asm volatile ( + \\ # Save function pointer and argument pointer on new thread stack + \\ addi.d $a1, $a1, -16 + \\ st.d $a0, $a1, 0 # save function pointer + \\ st.d $a3, $a1, 8 # save argument pointer + \\ or $a0, $a2, $zero + \\ or $a2, $a4, $zero + \\ or $a3, $a6, $zero + \\ or $a4, $a5, $zero + \\ ori $a7, $zero, 220 + \\ syscall 0 # call clone + \\ + \\ beqz $a0, 1f # whether child process + \\ jirl $zero, $ra, 0 # parent process return + \\1: + \\ ld.d $t8, $sp, 0 # function pointer + \\ ld.d $a0, $sp, 8 # argument pointer + \\ jirl $ra, $t8, 0 # call the user's function + \\ ori $a7, $zero, 93 + \\ syscall 0 # child process exit + ); + }, else => @compileError("Implement clone() for this arch."), } } diff --git a/zig/lib/libc/glibc/abilists b/zig/lib/libc/glibc/abilists index 5e98c564ba..b04c949890 100644 Binary files a/zig/lib/libc/glibc/abilists and b/zig/lib/libc/glibc/abilists differ diff --git a/zig/lib/libc/glibc/sysdeps/generic/sysdep.h b/zig/lib/libc/glibc/sysdeps/generic/sysdep.h index e77be376f7..6cff55a6d4 100644 --- a/zig/lib/libc/glibc/sysdeps/generic/sysdep.h +++ b/zig/lib/libc/glibc/sysdeps/generic/sysdep.h @@ -56,6 +56,13 @@ # define cfi_personality(enc, exp) .cfi_personality enc, exp # define cfi_lsda(enc, exp) .cfi_lsda enc, exp +/* .cfi_label is a gas extension not supported by clang. */ +# ifndef __clang__ +# define cfi_label(label) .cfi_label label +# else +# define cfi_label(label) +# endif + #else /* ! ASSEMBLER */ # define CFI_STRINGIFY(Name) CFI_STRINGIFY2 (Name) diff --git a/zig/lib/libc/glibc/sysdeps/loongarch/start.S b/zig/lib/libc/glibc/sysdeps/loongarch/start.S new file mode 100644 index 0000000000..5b61b8e1f0 --- /dev/null +++ b/zig/lib/libc/glibc/sysdeps/loongarch/start.S @@ -0,0 +1,92 @@ +/* Startup code compliant to the ELF LoongArch ABI. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define __ASSEMBLY__ 1 +#include +#include + +/* The entry point's job is to call __libc_start_main. Per the ABI, + a0 contains the address of a function to be passed to atexit. + __libc_start_main wants this in a5. */ + +/* +int +__libc_start_main (int (*main) (int, char **, char **), + int argc, + char **argv, + __typeof (main) init, + void (*fini) (void), + void (*rtld_fini) (void), + void *stack_end); + */ + +ENTRY (ENTRY_POINT) + +/* Terminate call stack by noting ra is undefined. Use a dummy + .cfi_label to force starting the FDE. */ + cfi_label (.Ldummy) + cfi_undefined (1) + or a5, a0, zero /* rtld_fini */ + +#if ENABLE_STATIC_PIE +/* For static PIE, the GOT cannot be used in _start because the GOT entries are + offsets instead of real addresses before __libc_start_main. + __libc_start_main and/or main may be not local, so we rely on the linker to + produce PLT entries for them. GNU ld >= 2.40 supports this. */ +# define LA la.pcrel +#else +/* Old GNU ld (< 2.40) cannot handle PC relative address against a non-local + function correctly. We deem these old linkers failing to support static PIE + and load the addresses from GOT. */ +# define LA la.got +#endif + + LA a0, t0, main + REG_L a1, sp, 0 + ADDI a2, sp, SZREG + + /* Adjust $sp for 16-aligned */ + BSTRINS sp, zero, 3, 0 + + move a3, zero /* used to be init */ + move a4, zero /* used to be fini */ + or a6, sp, zero /* stack_end */ + + LA ra, t0, __libc_start_main + jirl ra, ra, 0 + + LA ra, t0, abort + jirl ra, ra, 0 +END (ENTRY_POINT) diff --git a/zig/lib/libc/include/aarch64-linux-musl/bits/syscall.h b/zig/lib/libc/include/aarch64-linux-musl/bits/syscall.h index d2a4e40aa8..102d3633fa 100644 --- a/zig/lib/libc/include/aarch64-linux-musl/bits/syscall.h +++ b/zig/lib/libc/include/aarch64-linux-musl/bits/syscall.h @@ -299,6 +299,11 @@ #define __NR_landlock_create_ruleset 444 #define __NR_landlock_add_rule 445 #define __NR_landlock_restrict_self 446 +#define __NR_process_mrelease 448 +#define __NR_futex_waitv 449 +#define __NR_set_mempolicy_home_node 450 +#define __NR_cachestat 451 +#define __NR_fchmodat2 452 #define SYS_io_setup 0 #define SYS_io_destroy 1 @@ -600,4 +605,9 @@ #define SYS_mount_setattr 442 #define SYS_landlock_create_ruleset 444 #define SYS_landlock_add_rule 445 -#define SYS_landlock_restrict_self 446 \ No newline at end of file +#define SYS_landlock_restrict_self 446 +#define SYS_process_mrelease 448 +#define SYS_futex_waitv 449 +#define SYS_set_mempolicy_home_node 450 +#define SYS_cachestat 451 +#define SYS_fchmodat2 452 \ No newline at end of file diff --git a/zig/lib/libc/include/arm-linux-musl/bits/float.h b/zig/lib/libc/include/arm-linux-musl/bits/float.h new file mode 100644 index 0000000000..7523476b4f --- /dev/null +++ b/zig/lib/libc/include/arm-linux-musl/bits/float.h @@ -0,0 +1,16 @@ +#define FLT_EVAL_METHOD 0 + +#define LDBL_TRUE_MIN 4.94065645841246544177e-324L +#define LDBL_MIN 2.22507385850720138309e-308L +#define LDBL_MAX 1.79769313486231570815e+308L +#define LDBL_EPSILON 2.22044604925031308085e-16L + +#define LDBL_MANT_DIG 53 +#define LDBL_MIN_EXP (-1021) +#define LDBL_MAX_EXP 1024 + +#define LDBL_DIG 15 +#define LDBL_MIN_10_EXP (-307) +#define LDBL_MAX_10_EXP 308 + +#define DECIMAL_DIG 17 \ No newline at end of file diff --git a/zig/lib/libc/include/arm-linux-musl/bits/syscall.h b/zig/lib/libc/include/arm-linux-musl/bits/syscall.h index 179b6df9f3..31807daa3d 100644 --- a/zig/lib/libc/include/arm-linux-musl/bits/syscall.h +++ b/zig/lib/libc/include/arm-linux-musl/bits/syscall.h @@ -399,6 +399,11 @@ #define __NR_landlock_create_ruleset 444 #define __NR_landlock_add_rule 445 #define __NR_landlock_restrict_self 446 +#define __NR_process_mrelease 448 +#define __NR_futex_waitv 449 +#define __NR_set_mempolicy_home_node 450 +#define __NR_cachestat 451 +#define __NR_fchmodat2 452 #define __ARM_NR_breakpoint 0x0f0001 #define __ARM_NR_cacheflush 0x0f0002 @@ -807,4 +812,9 @@ #define SYS_mount_setattr 442 #define SYS_landlock_create_ruleset 444 #define SYS_landlock_add_rule 445 -#define SYS_landlock_restrict_self 446 \ No newline at end of file +#define SYS_landlock_restrict_self 446 +#define SYS_process_mrelease 448 +#define SYS_futex_waitv 449 +#define SYS_set_mempolicy_home_node 450 +#define SYS_cachestat 451 +#define SYS_fchmodat2 452 \ No newline at end of file diff --git a/zig/lib/libc/include/csky-linux-gnueabi/bits/struct_rwlock.h b/zig/lib/libc/include/csky-linux-gnueabi/bits/struct_rwlock.h deleted file mode 100644 index 91b0a3b012..0000000000 --- a/zig/lib/libc/include/csky-linux-gnueabi/bits/struct_rwlock.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Default read-write lock implementation struct definitions. - Copyright (C) 2019-2023 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifndef __RWLOCK_INTERNAL_H -#define __RWLOCK_INTERNAL_H - -#include - -/* Generic struct for both POSIX read-write lock. New ports are expected - to use the default layout, however archictetures can redefine it to add - arch-specific extensions (such as lock-elision). The struct have a size - of 32 bytes on both LP32 and LP64 architectures. */ - -struct __pthread_rwlock_arch_t -{ - unsigned int __readers; - unsigned int __writers; - unsigned int __wrphase_futex; - unsigned int __writers_futex; - unsigned int __pad3; - unsigned int __pad4; - /* FLAGS must stay at its position in the structure to maintain - binary compatibility. */ -#if __BYTE_ORDER == __BIG_ENDIAN - unsigned char __pad1; - unsigned char __pad2; - unsigned char __shared; - unsigned char __flags; -#else - unsigned char __flags; - unsigned char __shared; - unsigned char __pad1; - unsigned char __pad2; -#endif - int __cur_writer; -}; - -#if __BYTE_ORDER == __BIG_ENDIAN -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 -#else -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ - 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 -#endif - -#endif \ No newline at end of file diff --git a/zig/lib/libc/include/csky-linux-gnueabihf/bits/struct_rwlock.h b/zig/lib/libc/include/csky-linux-gnueabihf/bits/struct_rwlock.h deleted file mode 100644 index 91b0a3b012..0000000000 --- a/zig/lib/libc/include/csky-linux-gnueabihf/bits/struct_rwlock.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Default read-write lock implementation struct definitions. - Copyright (C) 2019-2023 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifndef __RWLOCK_INTERNAL_H -#define __RWLOCK_INTERNAL_H - -#include - -/* Generic struct for both POSIX read-write lock. New ports are expected - to use the default layout, however archictetures can redefine it to add - arch-specific extensions (such as lock-elision). The struct have a size - of 32 bytes on both LP32 and LP64 architectures. */ - -struct __pthread_rwlock_arch_t -{ - unsigned int __readers; - unsigned int __writers; - unsigned int __wrphase_futex; - unsigned int __writers_futex; - unsigned int __pad3; - unsigned int __pad4; - /* FLAGS must stay at its position in the structure to maintain - binary compatibility. */ -#if __BYTE_ORDER == __BIG_ENDIAN - unsigned char __pad1; - unsigned char __pad2; - unsigned char __shared; - unsigned char __flags; -#else - unsigned char __flags; - unsigned char __shared; - unsigned char __pad1; - unsigned char __pad2; -#endif - int __cur_writer; -}; - -#if __BYTE_ORDER == __BIG_ENDIAN -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 -#else -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ - 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 -#endif - -#endif \ No newline at end of file diff --git a/zig/lib/libc/include/generic-glibc/bits/struct_rwlock.h b/zig/lib/libc/include/generic-glibc/bits/struct_rwlock.h index 1de6d9250c..91b0a3b012 100644 --- a/zig/lib/libc/include/generic-glibc/bits/struct_rwlock.h +++ b/zig/lib/libc/include/generic-glibc/bits/struct_rwlock.h @@ -1,4 +1,4 @@ -/* MIPS internal rwlock struct definitions. +/* Default read-write lock implementation struct definitions. Copyright (C) 2019-2023 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -16,8 +16,15 @@ License along with the GNU C Library; if not, see . */ -#ifndef _RWLOCK_INTERNAL_H -#define _RWLOCK_INTERNAL_H +#ifndef __RWLOCK_INTERNAL_H +#define __RWLOCK_INTERNAL_H + +#include + +/* Generic struct for both POSIX read-write lock. New ports are expected + to use the default layout, however archictetures can redefine it to add + arch-specific extensions (such as lock-elision). The struct have a size + of 32 bytes on both LP32 and LP64 architectures. */ struct __pthread_rwlock_arch_t { @@ -27,45 +34,28 @@ struct __pthread_rwlock_arch_t unsigned int __writers_futex; unsigned int __pad3; unsigned int __pad4; -#if _MIPS_SIM == _ABI64 - int __cur_writer; - int __shared; - unsigned long int __pad1; - unsigned long int __pad2; - /* FLAGS must stay at this position in the structure to maintain + /* FLAGS must stay at its position in the structure to maintain binary compatibility. */ - unsigned int __flags; -# else -# if __BYTE_ORDER == __BIG_ENDIAN +#if __BYTE_ORDER == __BIG_ENDIAN unsigned char __pad1; unsigned char __pad2; unsigned char __shared; - /* FLAGS must stay at this position in the structure to maintain - binary compatibility. */ unsigned char __flags; -# else - /* FLAGS must stay at this position in the structure to maintain - binary compatibility. */ +#else unsigned char __flags; unsigned char __shared; unsigned char __pad1; unsigned char __pad2; -# endif - int __cur_writer; #endif + int __cur_writer; }; -#if _MIPS_SIM == _ABI64 +#if __BYTE_ORDER == __BIG_ENDIAN # define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags -#else -# if __BYTE_ORDER == __BIG_ENDIAN -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 -# else -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ +#else +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 -# endif #endif #endif \ No newline at end of file diff --git a/zig/lib/libc/include/generic-musl/bits/float.h b/zig/lib/libc/include/generic-musl/bits/float.h index 7523476b4f..f8cb54bb3f 100644 --- a/zig/lib/libc/include/generic-musl/bits/float.h +++ b/zig/lib/libc/include/generic-musl/bits/float.h @@ -1,16 +1,16 @@ #define FLT_EVAL_METHOD 0 -#define LDBL_TRUE_MIN 4.94065645841246544177e-324L -#define LDBL_MIN 2.22507385850720138309e-308L -#define LDBL_MAX 1.79769313486231570815e+308L -#define LDBL_EPSILON 2.22044604925031308085e-16L +#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L +#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L +#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L +#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L -#define LDBL_MANT_DIG 53 -#define LDBL_MIN_EXP (-1021) -#define LDBL_MAX_EXP 1024 +#define LDBL_MANT_DIG 113 +#define LDBL_MIN_EXP (-16381) +#define LDBL_MAX_EXP 16384 -#define LDBL_DIG 15 -#define LDBL_MIN_10_EXP (-307) -#define LDBL_MAX_10_EXP 308 +#define LDBL_DIG 33 +#define LDBL_MIN_10_EXP (-4931) +#define LDBL_MAX_10_EXP 4932 -#define DECIMAL_DIG 17 \ No newline at end of file +#define DECIMAL_DIG 36 \ No newline at end of file diff --git a/zig/lib/libc/include/generic-musl/elf.h b/zig/lib/libc/include/generic-musl/elf.h index 8b4d3a864d..93db50257c 100644 --- a/zig/lib/libc/include/generic-musl/elf.h +++ b/zig/lib/libc/include/generic-musl/elf.h @@ -315,7 +315,8 @@ typedef struct { #define EM_RISCV 243 #define EM_BPF 247 #define EM_CSKY 252 -#define EM_NUM 253 +#define EM_LOONGARCH 258 +#define EM_NUM 259 #define EM_ALPHA 0x9026 @@ -558,6 +559,11 @@ typedef struct { +typedef Elf32_Word Elf32_Relr; +typedef Elf64_Xword Elf64_Relr; + + + #define ELF32_R_SYM(val) ((val) >> 8) #define ELF32_R_TYPE(val) ((val) & 0xff) #define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff)) @@ -698,7 +704,14 @@ typedef struct { #define NT_MIPS_DSP 0x800 #define NT_MIPS_FP_MODE 0x801 #define NT_MIPS_MSA 0x802 +#define NT_RISCV_CSR 0x900 +#define NT_RISCV_VECTOR 0x901 #define NT_VERSION 1 +#define NT_LOONGARCH_CPUCFG 0xa00 +#define NT_LOONGARCH_CSR 0xa01 +#define NT_LOONGARCH_LSX 0xa02 +#define NT_LOONGARCH_LASX 0xa03 +#define NT_LOONGARCH_LBT 0xa04 @@ -3249,6 +3262,7 @@ enum #define R_RISCV_TLS_DTPREL64 9 #define R_RISCV_TLS_TPREL32 10 #define R_RISCV_TLS_TPREL64 11 +#define R_RISCV_TLSDESC 12 #define R_RISCV_BRANCH 16 #define R_RISCV_JAL 17 @@ -3275,16 +3289,11 @@ enum #define R_RISCV_SUB16 38 #define R_RISCV_SUB32 39 #define R_RISCV_SUB64 40 -#define R_RISCV_GNU_VTINHERIT 41 -#define R_RISCV_GNU_VTENTRY 42 +#define R_RISCV_GOT32_PCREL 41 #define R_RISCV_ALIGN 43 #define R_RISCV_RVC_BRANCH 44 #define R_RISCV_RVC_JUMP 45 #define R_RISCV_RVC_LUI 46 -#define R_RISCV_GPREL_I 47 -#define R_RISCV_GPREL_S 48 -#define R_RISCV_TPREL_I 49 -#define R_RISCV_TPREL_S 50 #define R_RISCV_RELAX 51 #define R_RISCV_SUB6 52 #define R_RISCV_SET6 53 @@ -3292,6 +3301,110 @@ enum #define R_RISCV_SET16 55 #define R_RISCV_SET32 56 #define R_RISCV_32_PCREL 57 +#define R_RISCV_IRELATIVE 58 +#define R_RISCV_PLT32 59 +#define R_RISCV_SET_ULEB128 60 +#define R_RISCV_SUB_ULEB128 61 +#define R_RISCV_TLSDESC_HI20 62 +#define R_RISCV_TLSDESC_LOAD_LO12 63 +#define R_RISCV_TLSDESC_ADD_LO12 64 +#define R_RISCV_TLSDESC_CALL 65 + +#define EF_LARCH_ABI_MODIFIER_MASK 0x07 +#define EF_LARCH_ABI_SOFT_FLOAT 0x01 +#define EF_LARCH_ABI_SINGLE_FLOAT 0x02 +#define EF_LARCH_ABI_DOUBLE_FLOAT 0x03 +#define EF_LARCH_OBJABI_V1 0x40 + +#define R_LARCH_NONE 0 +#define R_LARCH_32 1 +#define R_LARCH_64 2 +#define R_LARCH_RELATIVE 3 +#define R_LARCH_COPY 4 +#define R_LARCH_JUMP_SLOT 5 +#define R_LARCH_TLS_DTPMOD32 6 +#define R_LARCH_TLS_DTPMOD64 7 +#define R_LARCH_TLS_DTPREL32 8 +#define R_LARCH_TLS_DTPREL64 9 +#define R_LARCH_TLS_TPREL32 10 +#define R_LARCH_TLS_TPREL64 11 +#define R_LARCH_IRELATIVE 12 +#define R_LARCH_MARK_LA 20 +#define R_LARCH_MARK_PCREL 21 +#define R_LARCH_SOP_PUSH_PCREL 22 +#define R_LARCH_SOP_PUSH_ABSOLUTE 23 +#define R_LARCH_SOP_PUSH_DUP 24 +#define R_LARCH_SOP_PUSH_GPREL 25 +#define R_LARCH_SOP_PUSH_TLS_TPREL 26 +#define R_LARCH_SOP_PUSH_TLS_GOT 27 +#define R_LARCH_SOP_PUSH_TLS_GD 28 +#define R_LARCH_SOP_PUSH_PLT_PCREL 29 +#define R_LARCH_SOP_ASSERT 30 +#define R_LARCH_SOP_NOT 31 +#define R_LARCH_SOP_SUB 32 +#define R_LARCH_SOP_SL 33 +#define R_LARCH_SOP_SR 34 +#define R_LARCH_SOP_ADD 35 +#define R_LARCH_SOP_AND 36 +#define R_LARCH_SOP_IF_ELSE 37 +#define R_LARCH_SOP_POP_32_S_10_5 38 +#define R_LARCH_SOP_POP_32_U_10_12 39 +#define R_LARCH_SOP_POP_32_S_10_12 40 +#define R_LARCH_SOP_POP_32_S_10_16 41 +#define R_LARCH_SOP_POP_32_S_10_16_S2 42 +#define R_LARCH_SOP_POP_32_S_5_20 43 +#define R_LARCH_SOP_POP_32_S_0_5_10_16_S2 44 +#define R_LARCH_SOP_POP_32_S_0_10_10_16_S2 45 +#define R_LARCH_SOP_POP_32_U 46 +#define R_LARCH_ADD8 47 +#define R_LARCH_ADD16 48 +#define R_LARCH_ADD24 49 +#define R_LARCH_ADD32 50 +#define R_LARCH_ADD64 51 +#define R_LARCH_SUB8 52 +#define R_LARCH_SUB16 53 +#define R_LARCH_SUB24 54 +#define R_LARCH_SUB32 55 +#define R_LARCH_SUB64 56 +#define R_LARCH_GNU_VTINHERIT 57 +#define R_LARCH_GNU_VTENTRY 58 +#define R_LARCH_B16 64 +#define R_LARCH_B21 65 +#define R_LARCH_B26 66 +#define R_LARCH_ABS_HI20 67 +#define R_LARCH_ABS_LO12 68 +#define R_LARCH_ABS64_LO20 69 +#define R_LARCH_ABS64_HI12 70 +#define R_LARCH_PCALA_HI20 71 +#define R_LARCH_PCALA_LO12 72 +#define R_LARCH_PCALA64_LO20 73 +#define R_LARCH_PCALA64_HI12 74 +#define R_LARCH_GOT_PC_HI20 75 +#define R_LARCH_GOT_PC_LO12 76 +#define R_LARCH_GOT64_PC_LO20 77 +#define R_LARCH_GOT64_PC_HI12 78 +#define R_LARCH_GOT_HI20 79 +#define R_LARCH_GOT_LO12 80 +#define R_LARCH_GOT64_LO20 81 +#define R_LARCH_GOT64_HI12 82 +#define R_LARCH_TLS_LE_HI20 83 +#define R_LARCH_TLS_LE_LO12 84 +#define R_LARCH_TLS_LE64_LO20 85 +#define R_LARCH_TLS_LE64_HI12 86 +#define R_LARCH_TLS_IE_PC_HI20 87 +#define R_LARCH_TLS_IE_PC_LO12 88 +#define R_LARCH_TLS_IE64_PC_LO20 89 +#define R_LARCH_TLS_IE64_PC_HI12 90 +#define R_LARCH_TLS_IE_HI20 91 +#define R_LARCH_TLS_IE_LO12 92 +#define R_LARCH_TLS_IE64_LO20 93 +#define R_LARCH_TLS_IE64_HI12 94 +#define R_LARCH_TLS_LD_PC_HI20 95 +#define R_LARCH_TLS_LD_HI20 96 +#define R_LARCH_TLS_GD_PC_HI20 97 +#define R_LARCH_TLS_GD_HI20 98 +#define R_LARCH_32_PCREL 99 +#define R_LARCH_RELAX 100 #ifdef __cplusplus } diff --git a/zig/lib/libc/include/generic-musl/fcntl.h b/zig/lib/libc/include/generic-musl/fcntl.h index 9636209d8c..91d5f77766 100644 --- a/zig/lib/libc/include/generic-musl/fcntl.h +++ b/zig/lib/libc/include/generic-musl/fcntl.h @@ -184,7 +184,6 @@ struct f_owner_ex { #define SPLICE_F_MORE 4 #define SPLICE_F_GIFT 8 int fallocate(int, int, off_t, off_t); -#define fallocate64 fallocate int name_to_handle_at(int, const char *, struct file_handle *, int *, int); int open_by_handle_at(int, struct file_handle *, int); ssize_t readahead(int, off_t, size_t); @@ -207,6 +206,9 @@ ssize_t tee(int, int, size_t, unsigned); #define posix_fadvise64 posix_fadvise #define posix_fallocate64 posix_fallocate #define off64_t off_t +#if defined(_GNU_SOURCE) +#define fallocate64 fallocate +#endif #endif #ifdef __cplusplus diff --git a/zig/lib/libc/include/generic-musl/poll.h b/zig/lib/libc/include/generic-musl/poll.h index 45078b866d..5d83374031 100644 --- a/zig/lib/libc/include/generic-musl/poll.h +++ b/zig/lib/libc/include/generic-musl/poll.h @@ -36,7 +36,7 @@ struct pollfd { int poll (struct pollfd *, nfds_t, int); -#ifdef _GNU_SOURCE +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) #define __NEED_time_t #define __NEED_struct_timespec #define __NEED_sigset_t @@ -45,7 +45,7 @@ int ppoll(struct pollfd *, nfds_t, const struct timespec *, const sigset_t *); #endif #if _REDIR_TIME64 -#ifdef _GNU_SOURCE +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) __REDIR(ppoll, __ppoll_time64); #endif #endif diff --git a/zig/lib/libc/include/generic-musl/stdc-predef.h b/zig/lib/libc/include/generic-musl/stdc-predef.h index 7f0f90dc81..0af589e14f 100644 --- a/zig/lib/libc/include/generic-musl/stdc-predef.h +++ b/zig/lib/libc/include/generic-musl/stdc-predef.h @@ -7,7 +7,12 @@ #define __STDC_IEC_559__ 1 #endif +#if !defined(__STDC_UTF_16__) #define __STDC_UTF_16__ 1 +#endif + +#if !defined(__STDC_UTF_32__) #define __STDC_UTF_32__ 1 +#endif #endif \ No newline at end of file diff --git a/zig/lib/libc/include/generic-musl/string.h b/zig/lib/libc/include/generic-musl/string.h index 406484ea78..f82dc2f1c6 100644 --- a/zig/lib/libc/include/generic-musl/string.h +++ b/zig/lib/libc/include/generic-musl/string.h @@ -95,9 +95,6 @@ char *strchrnul(const char *, int); char *strcasestr(const char *, const char *); void *memrchr(const void *, int, size_t); void *mempcpy(void *, const void *, size_t); -#ifndef __cplusplus -char *basename(); -#endif #endif #ifdef __cplusplus diff --git a/zig/lib/libc/include/generic-musl/sys/stat.h b/zig/lib/libc/include/generic-musl/sys/stat.h index b36d3b34b7..b2c7045a99 100644 --- a/zig/lib/libc/include/generic-musl/sys/stat.h +++ b/zig/lib/libc/include/generic-musl/sys/stat.h @@ -18,6 +18,13 @@ extern "C" { #define __NEED_blkcnt_t #define __NEED_struct_timespec +#ifdef _GNU_SOURCE +#define __NEED_int64_t +#define __NEED_uint64_t +#define __NEED_uint32_t +#define __NEED_uint16_t +#endif + #include #include @@ -98,6 +105,54 @@ int lchmod(const char *, mode_t); #define S_IEXEC S_IXUSR #endif +#if defined(_GNU_SOURCE) +#define STATX_TYPE 1U +#define STATX_MODE 2U +#define STATX_NLINK 4U +#define STATX_UID 8U +#define STATX_GID 0x10U +#define STATX_ATIME 0x20U +#define STATX_MTIME 0x40U +#define STATX_CTIME 0x80U +#define STATX_INO 0x100U +#define STATX_SIZE 0x200U +#define STATX_BLOCKS 0x400U +#define STATX_BASIC_STATS 0x7ffU +#define STATX_BTIME 0x800U +#define STATX_ALL 0xfffU + +struct statx_timestamp { + int64_t tv_sec; + uint32_t tv_nsec, __pad; +}; + +struct statx { + uint32_t stx_mask; + uint32_t stx_blksize; + uint64_t stx_attributes; + uint32_t stx_nlink; + uint32_t stx_uid; + uint32_t stx_gid; + uint16_t stx_mode; + uint16_t __pad0[1]; + uint64_t stx_ino; + uint64_t stx_size; + uint64_t stx_blocks; + uint64_t stx_attributes_mask; + struct statx_timestamp stx_atime; + struct statx_timestamp stx_btime; + struct statx_timestamp stx_ctime; + struct statx_timestamp stx_mtime; + uint32_t stx_rdev_major; + uint32_t stx_rdev_minor; + uint32_t stx_dev_major; + uint32_t stx_dev_minor; + uint64_t __pad1[14]; +}; + +int statx(int, const char *__restrict, int, unsigned, struct statx *__restrict); +#endif + #if defined(_LARGEFILE64_SOURCE) #define stat64 stat #define fstat64 fstat diff --git a/zig/lib/libc/include/generic-musl/sys/statvfs.h b/zig/lib/libc/include/generic-musl/sys/statvfs.h index b599caaa45..393fcce607 100644 --- a/zig/lib/libc/include/generic-musl/sys/statvfs.h +++ b/zig/lib/libc/include/generic-musl/sys/statvfs.h @@ -23,7 +23,8 @@ struct statvfs { unsigned long f_fsid; #endif unsigned long f_flag, f_namemax; - int __reserved[6]; + unsigned int f_type; + int __reserved[5]; }; int statvfs (const char *__restrict, struct statvfs *__restrict); diff --git a/zig/lib/libc/include/generic-musl/sys/uio.h b/zig/lib/libc/include/generic-musl/sys/uio.h index c98c77db55..445ab7cd1a 100644 --- a/zig/lib/libc/include/generic-musl/sys/uio.h +++ b/zig/lib/libc/include/generic-musl/sys/uio.h @@ -39,6 +39,13 @@ ssize_t pwritev (int, const struct iovec *, int, off_t); #ifdef _GNU_SOURCE ssize_t process_vm_writev(pid_t, const struct iovec *, unsigned long, const struct iovec *, unsigned long, unsigned long); ssize_t process_vm_readv(pid_t, const struct iovec *, unsigned long, const struct iovec *, unsigned long, unsigned long); +ssize_t preadv2 (int, const struct iovec *, int, off_t, int); +ssize_t pwritev2 (int, const struct iovec *, int, off_t, int); +#define RWF_HIPRI 0x00000001 +#define RWF_DSYNC 0x00000002 +#define RWF_SYNC 0x00000004 +#define RWF_NOWAIT 0x00000008 +#define RWF_APPEND 0x00000010 #endif #ifdef __cplusplus diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/endianness.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/endianness.h new file mode 100644 index 0000000000..989463fb5d --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/endianness.h @@ -0,0 +1,11 @@ +#ifndef _BITS_ENDIANNESS_H +#define _BITS_ENDIANNESS_H 1 + +#ifndef _BITS_ENDIAN_H +#error "Never use directly; include instead." +#endif + +/* LoongArch is little-endian. */ +#define __BYTE_ORDER __LITTLE_ENDIAN + +#endif /* bits/endianness.h */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/fcntl.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/fcntl.h new file mode 100644 index 0000000000..093176b2a3 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/fcntl.h @@ -0,0 +1,61 @@ +/* O_*, F_*, FD_* bit values for the generic Linux/LoongArch ABI. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _FCNTL_H +#error "Never use directly; include instead." +#endif + +#include + +/* In 64-bit ISA files are always with 64bit off_t and F_*LK64 are the same as + non-64-bit versions. It will need to be revised for 128-bit. */ +#if __WORDSIZE == 64 +#define __O_LARGEFILE 0 + +#define F_GETLK64 5 /* Get record locking info. */ +#define F_SETLK64 6 /* Set record locking info (non-blocking). */ +#define F_SETLKW64 7 /* Set record locking info (blocking). */ +#endif + +struct flock +{ + short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */ + short int l_whence; /* Where `l_start' is relative to (like `lseek'). */ +#ifndef __USE_FILE_OFFSET64 + __off_t l_start; /* Offset where the lock begins. */ + __off_t l_len; /* Size of the locked area; zero means until EOF. */ +#else + __off64_t l_start; /* Offset where the lock begins. */ + __off64_t l_len; /* Size of the locked area; zero means until EOF. */ +#endif + __pid_t l_pid; /* Process holding the lock. */ +}; + +#ifdef __USE_LARGEFILE64 +struct flock64 +{ + short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */ + short int l_whence; /* Where `l_start' is relative to (like `lseek'). */ + __off64_t l_start; /* Offset where the lock begins. */ + __off64_t l_len; /* Size of the locked area; zero means until EOF. */ + __pid_t l_pid; /* Process holding the lock. */ +}; +#endif + +/* Include generic Linux declarations. */ +#include \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/fenv.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/fenv.h new file mode 100644 index 0000000000..d6754e3016 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/fenv.h @@ -0,0 +1,90 @@ +/* Floating point environment. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _FENV_H +#error "Never use directly; include instead." +#endif + +/* Define bits representing the exception. We use the bit positions + of the appropriate bits in the FPU control word. */ +enum +{ + FE_INEXACT = +#define FE_INEXACT 0x010000 + FE_INEXACT, + FE_UNDERFLOW = +#define FE_UNDERFLOW 0x020000 + FE_UNDERFLOW, + FE_OVERFLOW = +#define FE_OVERFLOW 0x040000 + FE_OVERFLOW, + FE_DIVBYZERO = +#define FE_DIVBYZERO 0x080000 + FE_DIVBYZERO, + FE_INVALID = +#define FE_INVALID 0x100000 + FE_INVALID, +}; + +#define FE_ALL_EXCEPT \ + (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID) + +/* The LoongArch FPU supports all of the four defined rounding modes. We + use again the bit positions in the FPU control word as the values + for the appropriate macros. */ +enum +{ + FE_TONEAREST = +#define FE_TONEAREST 0x000 + FE_TONEAREST, + FE_TOWARDZERO = +#define FE_TOWARDZERO 0x100 + FE_TOWARDZERO, + FE_UPWARD = +#define FE_UPWARD 0x200 + FE_UPWARD, + FE_DOWNWARD = +#define FE_DOWNWARD 0x300 + FE_DOWNWARD +}; + +/* Type representing exception flags. */ +typedef unsigned int fexcept_t; + +/* Type representing floating-point environment. This function corresponds + to the layout of the block written by the `fstenv'. */ +typedef struct +{ + unsigned int __fp_control_register; +} fenv_t; + +/* If the default argument is used we use this value. */ +#define FE_DFL_ENV ((const fenv_t *) -1) + +#ifdef __USE_GNU +/* Floating-point environment where none of the exception is masked. */ +#define FE_NOMASK_ENV ((const fenv_t *) -257) +#endif + +#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X) +/* Type representing floating-point control modes. */ +typedef unsigned int femode_t; + +/* Default floating-point control modes. */ +#define FE_DFL_MODE ((const femode_t *) -1L) +#endif \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/floatn.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/floatn.h new file mode 100644 index 0000000000..a4ac95d55e --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/floatn.h @@ -0,0 +1,97 @@ +/* Macros to control TS 18661-3 glibc features on ldbl-128 platforms. + Copyright (C) 2017-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _BITS_FLOATN_H +#define _BITS_FLOATN_H + +#include +#include + +/* Defined to 1 if the current compiler invocation provides a + floating-point type with the IEEE 754 binary128 format, and this + glibc includes corresponding *f128 interfaces for it. */ +#ifndef __NO_LONG_DOUBLE_MATH +# define __HAVE_FLOAT128 1 +#else +/* glibc does not support _Float128 for platforms where long double is + normally binary128 when building with long double as binary64. + GCC's default for supported scalar modes does not support it either + in that case. */ +# define __HAVE_FLOAT128 0 +#endif + +/* Defined to 1 if __HAVE_FLOAT128 is 1 and the type is ABI-distinct + from the default float, double and long double types in this glibc. */ +#define __HAVE_DISTINCT_FLOAT128 0 + +/* Defined to 1 if the current compiler invocation provides a + floating-point type with the right format for _Float64x, and this + glibc includes corresponding *f64x interfaces for it. */ +#define __HAVE_FLOAT64X __HAVE_FLOAT128 + +/* Defined to 1 if __HAVE_FLOAT64X is 1 and _Float64x has the format + of long double. Otherwise, if __HAVE_FLOAT64X is 1, _Float64x has + the format of _Float128, which must be different from that of long + double. */ +#define __HAVE_FLOAT64X_LONG_DOUBLE __HAVE_FLOAT128 + +#ifndef __ASSEMBLER__ + +/* Defined to concatenate the literal suffix to be used with _Float128 + types, if __HAVE_FLOAT128 is 1. */ +# if __HAVE_FLOAT128 +# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) +/* The literal suffix f128 exists only since GCC 7.0. */ +# define __f128(x) x##l +# else +# define __f128(x) x##f128 +# endif +# endif + +/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ +# if __HAVE_FLOAT128 +# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) +# define __CFLOAT128 _Complex long double +# else +# define __CFLOAT128 _Complex _Float128 +# endif +# endif + +/* The remaining of this file provides support for older compilers. */ +# if __HAVE_FLOAT128 + +/* The type _Float128 exists only since GCC 7.0. */ +# if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0)) +typedef long double _Float128; +# endif + +/* Various built-in functions do not exist before GCC 7.0. */ +# if !__GNUC_PREREQ (7, 0) +# define __builtin_huge_valf128() (__builtin_huge_vall ()) +# define __builtin_inff128() (__builtin_infl ()) +# define __builtin_nanf128(x) (__builtin_nanl (x)) +# define __builtin_nansf128(x) (__builtin_nansl (x)) +# endif + +# endif + +#endif /* !__ASSEMBLER__. */ + +#include + +#endif /* _BITS_FLOATN_H */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/hwcap.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/hwcap.h new file mode 100644 index 0000000000..6a9040597b --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/hwcap.h @@ -0,0 +1,37 @@ +/* Defines for bits in AT_HWCAP. LoongArch64 Linux version. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#if !defined (_SYS_AUXV_H) +# error "Never include directly; use instead." +#endif + +/* The following must match the kernel's . */ +/* HWCAP flags */ +#define HWCAP_LOONGARCH_CPUCFG (1 << 0) +#define HWCAP_LOONGARCH_LAM (1 << 1) +#define HWCAP_LOONGARCH_UAL (1 << 2) +#define HWCAP_LOONGARCH_FPU (1 << 3) +#define HWCAP_LOONGARCH_LSX (1 << 4) +#define HWCAP_LOONGARCH_LASX (1 << 5) +#define HWCAP_LOONGARCH_CRC32 (1 << 6) +#define HWCAP_LOONGARCH_COMPLEX (1 << 7) +#define HWCAP_LOONGARCH_CRYPTO (1 << 8) +#define HWCAP_LOONGARCH_LVZ (1 << 9) +#define HWCAP_LOONGARCH_LBT_X86 (1 << 10) +#define HWCAP_LOONGARCH_LBT_ARM (1 << 11) +#define HWCAP_LOONGARCH_LBT_MIPS (1 << 12) \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/link.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/link.h new file mode 100644 index 0000000000..71c99556dd --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/link.h @@ -0,0 +1,58 @@ +/* Machine-specific declarations for dynamic linker interface. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _LINK_H +#error "Never include directly; use instead." +#endif + +typedef struct La_loongarch_regs +{ + unsigned long int lr_reg[8]; /* a0 - a7 */ + double lr_fpreg[8]; /* fa0 - fa7 */ + unsigned long int lr_ra; + unsigned long int lr_sp; +} La_loongarch_regs; + +/* Return values for calls from PLT on LoongArch. */ +typedef struct La_loongarch_retval +{ + unsigned long int lrv_a0; + unsigned long int lrv_a1; + double lrv_fa0; + double lrv_fa1; +} La_loongarch_retval; + +__BEGIN_DECLS + +extern ElfW (Addr) la_loongarch_gnu_pltenter (ElfW (Sym) *__sym, + unsigned int __ndx, + uintptr_t *__refcook, + uintptr_t *__defcook, + La_loongarch_regs *__regs, + unsigned int *__flags, + const char *__symname, + long int *__framesizep); +extern unsigned int la_loongarch_gnu_pltexit (ElfW (Sym) *__sym, + unsigned int __ndx, + uintptr_t *__refcook, + uintptr_t *__defcook, + const La_loongarch_regs *__inregs, + La_loongarch_retval *__outregs, + const char *__symname); + +__END_DECLS \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/long-double.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/long-double.h new file mode 100644 index 0000000000..3455ce2356 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/long-double.h @@ -0,0 +1,21 @@ +/* Properties of long double type. ldbl-128 version. + Copyright (C) 2016-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* long double is distinct from double, so there is nothing to + define here. */ +#define __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI 0 \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/procfs.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/procfs.h new file mode 100644 index 0000000000..875ccb6fd9 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/procfs.h @@ -0,0 +1,52 @@ +/* Types for registers for sys/procfs.h. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _SYS_PROCFS_H +# error "Never include directly; use instead." +#endif + +/* Type for a general-purpose register. */ +typedef __uint64_t elf_greg_t; + +/* And the whole bunch of them. We could have used `struct + pt_regs' directly in the typedef, but tradition says that + the register set is an array, which does have some peculiar + semantics, so leave it that way. */ +#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t)) +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + +#define ELF_NFPREG 34 /* 32 FPRs + 8-byte byte-vec for fcc + 4-byte FCR */ +typedef union +{ + double d; + float f; +} elf_fpreg_t; +typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; + +typedef union +{ + double d[2]; + float f[4]; +} __attribute__ ((__aligned__ (16))) elf_lsxregset_t[32]; + +typedef union +{ + double d[4]; + float f[8]; +} __attribute__ ((__aligned__ (32))) elf_lasxregset_t[32]; \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/pthread_stack_min.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/pthread_stack_min.h new file mode 100644 index 0000000000..9b23b294eb --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/pthread_stack_min.h @@ -0,0 +1,20 @@ +/* Definition of PTHREAD_STACK_MIN. LoongArch Linux version. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +/* Minimum size for a thread. At least two pages with 64k pages. */ +#define PTHREAD_STACK_MIN 131072 \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/rseq.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/rseq.h new file mode 100644 index 0000000000..fe2e400300 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/rseq.h @@ -0,0 +1,29 @@ +/* Restartable Sequences architecture header. Stub version. + Copyright (C) 2021-2023 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _SYS_RSEQ_H +# error "Never use directly; include instead." +#endif + +/* RSEQ_SIG is a signature required before each abort handler code. + + It is a 32-bit value that maps to actual architecture code compiled + into applications and libraries. It needs to be defined for each + architecture. When choosing this value, it needs to be taken into + account that generating invalid instructions may have ill effects on + tools like objdump, and may also have impact on the CPU speculative + execution efficiency in some cases. */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/setjmp.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/setjmp.h new file mode 100644 index 0000000000..a59e27d4aa --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/setjmp.h @@ -0,0 +1,42 @@ +/* Define the machine-dependent type `jmp_buf'. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _LOONGARCH_BITS_SETJMP_H +#define _LOONGARCH_BITS_SETJMP_H + +typedef struct __jmp_buf_internal_tag +{ + /* Program counter. */ + long int __pc; + /* Stack pointer. */ + long int __sp; + /* Reserved */ + long int __x; + /* Frame pointer. */ + long int __fp; + /* Callee-saved registers. */ + long int __regs[9]; + +#ifndef __loongarch_soft_float + /* Callee-saved floating point registers. */ + double __fpregs[8]; +#endif + +} __jmp_buf[1]; + +#endif /* _LOONGARCH_BITS_SETJMP_H */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/shmlba.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/shmlba.h new file mode 100644 index 0000000000..586ffd010c --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/shmlba.h @@ -0,0 +1,24 @@ +/* Define SHMLBA. LoongArch version. + Copyright (C) 2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _SYS_SHM_H +# error "Never use directly; include instead." +#endif + +/* Segment low boundary address multiple. */ +#define SHMLBA 0x10000 \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/sigstack.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/sigstack.h new file mode 100644 index 0000000000..b1af3ba9eb --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/sigstack.h @@ -0,0 +1,32 @@ +/* sigstack, sigaltstack definitions. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _BITS_SIGSTACK_H +#define _BITS_SIGSTACK_H 1 + +#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H +# error "Never include this file directly. Use instead" +#endif + +/* Minimum stack size for a signal handler. */ +#define MINSIGSTKSZ 4096 + +/* System default stack size. */ +#define SIGSTKSZ 16384 + +#endif /* bits/sigstack.h */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/struct_stat.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/struct_stat.h new file mode 100644 index 0000000000..54192765a2 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/struct_stat.h @@ -0,0 +1,127 @@ +/* Definition for struct stat. + Copyright (C) 2020-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#if !defined _SYS_STAT_H && !defined _FCNTL_H +# error "Never include directly; use instead." +#endif + +#ifndef _BITS_STRUCT_STAT_H +#define _BITS_STRUCT_STAT_H 1 + +#include +#include + +#if defined __USE_FILE_OFFSET64 +# define __field64(type, type64, name) type64 name +#elif __WORDSIZE == 64 || defined __INO_T_MATCHES_INO64_T +# if defined __INO_T_MATCHES_INO64_T && !defined __OFF_T_MATCHES_OFF64_T +# error "ino_t and off_t must both be the same type" +# endif +# define __field64(type, type64, name) type name +#elif __BYTE_ORDER == __LITTLE_ENDIAN +# define __field64(type, type64, name) \ + type name __attribute__((__aligned__ (__alignof__ (type64)))); int __##name##_pad +#else +# define __field64(type, type64, name) \ + int __##name##_pad __attribute__((__aligned__ (__alignof__ (type64)))); type name +#endif + +struct stat + { + __dev_t st_dev; /* Device. */ + __field64(__ino_t, __ino64_t, st_ino); /* File serial number. */ + __mode_t st_mode; /* File mode. */ + __nlink_t st_nlink; /* Link count. */ + __uid_t st_uid; /* User ID of the file's owner. */ + __gid_t st_gid; /* Group ID of the file's group.*/ + __dev_t st_rdev; /* Device number, if device. */ + __dev_t __pad1; + __field64(__off_t, __off64_t, st_size); /* Size of file, in bytes. */ + __blksize_t st_blksize; /* Optimal block size for I/O. */ + int __pad2; + __field64(__blkcnt_t, __blkcnt64_t, st_blocks); /* 512-byte blocks */ +#ifdef __USE_XOPEN2K8 + /* Nanosecond resolution timestamps are stored in a format + equivalent to 'struct timespec'. This is the type used + whenever possible but the Unix namespace rules do not allow the + identifier 'timespec' to appear in the header. + Therefore we have to handle the use of this header in strictly + standard-compliant sources special. */ + struct timespec st_atim; /* Time of last access. */ + struct timespec st_mtim; /* Time of last modification. */ + struct timespec st_ctim; /* Time of last status change. */ +# define st_atime st_atim.tv_sec /* Backward compatibility. */ +# define st_mtime st_mtim.tv_sec +# define st_ctime st_ctim.tv_sec +#else + __time_t st_atime; /* Time of last access. */ + unsigned long int st_atimensec; /* Nscecs of last access. */ + __time_t st_mtime; /* Time of last modification. */ + unsigned long int st_mtimensec; /* Nsecs of last modification. */ + __time_t st_ctime; /* Time of last status change. */ + unsigned long int st_ctimensec; /* Nsecs of last status change. */ +#endif + int __glibc_reserved[2]; + }; + +#undef __field64 + +#ifdef __USE_LARGEFILE64 +struct stat64 + { + __dev_t st_dev; /* Device. */ + __ino64_t st_ino; /* File serial number. */ + __mode_t st_mode; /* File mode. */ + __nlink_t st_nlink; /* Link count. */ + __uid_t st_uid; /* User ID of the file's owner. */ + __gid_t st_gid; /* Group ID of the file's group.*/ + __dev_t st_rdev; /* Device number, if device. */ + __dev_t __pad1; + __off64_t st_size; /* Size of file, in bytes. */ + __blksize_t st_blksize; /* Optimal block size for I/O. */ + int __pad2; + __blkcnt64_t st_blocks; /* Nr. 512-byte blocks allocated. */ +#ifdef __USE_XOPEN2K8 + /* Nanosecond resolution timestamps are stored in a format + equivalent to 'struct timespec'. This is the type used + whenever possible but the Unix namespace rules do not allow the + identifier 'timespec' to appear in the header. + Therefore we have to handle the use of this header in strictly + standard-compliant sources special. */ + struct timespec st_atim; /* Time of last access. */ + struct timespec st_mtim; /* Time of last modification. */ + struct timespec st_ctim; /* Time of last status change. */ +#else + __time_t st_atime; /* Time of last access. */ + unsigned long int st_atimensec; /* Nscecs of last access. */ + __time_t st_mtime; /* Time of last modification. */ + unsigned long int st_mtimensec; /* Nsecs of last modification. */ + __time_t st_ctime; /* Time of last status change. */ + unsigned long int st_ctimensec; /* Nsecs of last status change. */ +#endif + int __glibc_reserved[2]; + }; +#endif + +/* Tell code we have these members. */ +#define _STATBUF_ST_BLKSIZE +#define _STATBUF_ST_RDEV +/* Nanosecond resolution time values are supported. */ +#define _STATBUF_ST_NSEC + +#endif /* _BITS_STRUCT_STAT_H */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/timesize.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/timesize.h new file mode 100644 index 0000000000..00217b042a --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/timesize.h @@ -0,0 +1,20 @@ +/* Bit size of the time_t type at glibc build time, general case. + Copyright (C) 2018-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* Size in bits of the 'time_t' type of the default ABI. */ +#define __TIMESIZE 64 \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/typesizes.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/typesizes.h new file mode 100644 index 0000000000..fa5fab6be4 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/typesizes.h @@ -0,0 +1,107 @@ +/* bits/typesizes.h -- underlying types for *_t. For the generic Linux ABI. + Copyright (C) 2011-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _BITS_TYPES_H +# error "Never include directly; use instead." +#endif + +#ifndef _BITS_TYPESIZES_H +#define _BITS_TYPESIZES_H 1 + +/* See for the meaning of these macros. This file exists so + that need not vary across different GNU platforms. */ +#if __TIMESIZE == 64 && __WORDSIZE == 32 +/* These are the "new" y2038 types defined for architectures added after + the 5.1 kernel. */ +# define __INO_T_TYPE __UQUAD_TYPE +# define __OFF_T_TYPE __SQUAD_TYPE +# define __RLIM_T_TYPE __UQUAD_TYPE +# define __BLKCNT_T_TYPE __SQUAD_TYPE +# define __FSBLKCNT_T_TYPE __UQUAD_TYPE +# define __FSFILCNT_T_TYPE __UQUAD_TYPE +# define __TIME_T_TYPE __SQUAD_TYPE +# define __SUSECONDS_T_TYPE __SQUAD_TYPE +#else +# define __INO_T_TYPE __ULONGWORD_TYPE +# define __OFF_T_TYPE __SLONGWORD_TYPE +# define __RLIM_T_TYPE __ULONGWORD_TYPE +# define __BLKCNT_T_TYPE __SLONGWORD_TYPE +# define __FSBLKCNT_T_TYPE __ULONGWORD_TYPE +# define __FSFILCNT_T_TYPE __ULONGWORD_TYPE +# define __TIME_T_TYPE __SLONGWORD_TYPE +# define __SUSECONDS_T_TYPE __SLONGWORD_TYPE +#endif + +#define __DEV_T_TYPE __UQUAD_TYPE +#define __UID_T_TYPE __U32_TYPE +#define __GID_T_TYPE __U32_TYPE +#define __INO64_T_TYPE __UQUAD_TYPE +#define __MODE_T_TYPE __U32_TYPE +#define __NLINK_T_TYPE __U32_TYPE +#define __OFF64_T_TYPE __SQUAD_TYPE +#define __PID_T_TYPE __S32_TYPE +#define __RLIM64_T_TYPE __UQUAD_TYPE +#define __BLKCNT64_T_TYPE __SQUAD_TYPE +#define __FSBLKCNT64_T_TYPE __UQUAD_TYPE +#define __FSFILCNT64_T_TYPE __UQUAD_TYPE +#define __FSWORD_T_TYPE __SWORD_TYPE +#define __ID_T_TYPE __U32_TYPE +#define __CLOCK_T_TYPE __SLONGWORD_TYPE +#define __USECONDS_T_TYPE __U32_TYPE +#define __SUSECONDS64_T_TYPE __SQUAD_TYPE +#define __DADDR_T_TYPE __S32_TYPE +#define __KEY_T_TYPE __S32_TYPE +#define __CLOCKID_T_TYPE __S32_TYPE +#define __TIMER_T_TYPE void * +#define __BLKSIZE_T_TYPE __S32_TYPE +#define __FSID_T_TYPE struct { int __val[2]; } +#define __SSIZE_T_TYPE __SWORD_TYPE +#define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE +#define __SYSCALL_ULONG_TYPE __ULONGWORD_TYPE +#define __CPU_MASK_TYPE __ULONGWORD_TYPE + +#if defined __LP64__ || (__TIMESIZE == 64 && __WORDSIZE == 32) +/* Tell the libc code that off_t and off64_t are actually the same type + for all ABI purposes, even if possibly expressed as different base types + for C type-checking purposes. */ +# define __OFF_T_MATCHES_OFF64_T 1 + +/* Same for ino_t and ino64_t. */ +# define __INO_T_MATCHES_INO64_T 1 + +/* And for __rlim_t and __rlim64_t. */ +# define __RLIM_T_MATCHES_RLIM64_T 1 + +/* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ +# define __STATFS_MATCHES_STATFS64 1 + +/* And for getitimer, setitimer and rusage */ +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 (__WORDSIZE == 64) +#else +# define __RLIM_T_MATCHES_RLIM64_T 0 + +# define __STATFS_MATCHES_STATFS64 0 + +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 +#endif + +/* Number of descriptors that can fit in an `fd_set'. */ +#define __FD_SETSIZE 1024 + + +#endif /* bits/typesizes.h */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/bits/wordsize.h b/zig/lib/libc/include/loongarch64-linux-gnu/bits/wordsize.h new file mode 100644 index 0000000000..6d82e348b2 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/bits/wordsize.h @@ -0,0 +1,19 @@ +/* Copyright (C) 1999-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define __WORDSIZE 64 +#define __WORDSIZE_TIME64_COMPAT32 0 \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/fpu_control.h b/zig/lib/libc/include/loongarch64-linux-gnu/fpu_control.h new file mode 100644 index 0000000000..54d47194a9 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/fpu_control.h @@ -0,0 +1,119 @@ +/* FPU control word bits. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _FPU_CONTROL_H +#define _FPU_CONTROL_H + +/* LoongArch FPU floating point control register bits. + * + * 31-29 -> reserved (read as 0, can not changed by software) + * 28 -> cause bit for invalid exception + * 27 -> cause bit for division by zero exception + * 26 -> cause bit for overflow exception + * 25 -> cause bit for underflow exception + * 24 -> cause bit for inexact exception + * 23-21 -> reserved (read as 0, can not changed by software) + * 20 -> flag invalid exception + * 19 -> flag division by zero exception + * 18 -> flag overflow exception + * 17 -> flag underflow exception + * 16 -> flag inexact exception + * 9-8 -> rounding control + * 7-5 -> reserved (read as 0, can not changed by software) + * 4 -> enable exception for invalid exception + * 3 -> enable exception for division by zero exception + * 2 -> enable exception for overflow exception + * 1 -> enable exception for underflow exception + * 0 -> enable exception for inexact exception + * + * + * Rounding Control: + * 00 - rounding ties to even (RNE) + * 01 - rounding toward zero (RZ) + * 10 - rounding (up) toward plus infinity (RP) + * 11 - rounding (down) toward minus infinity (RM) + */ + +#include + +#ifdef __loongarch_soft_float + +#define _FPU_RESERVED 0xffffffff +#define _FPU_DEFAULT 0x00000000 +typedef unsigned int fpu_control_t; +#define _FPU_GETCW(cw) (cw) = 0 +#define _FPU_SETCW(cw) (void) (cw) +extern fpu_control_t __fpu_control; + +#else /* __loongarch_soft_float */ + +/* Masks for interrupts. */ +#define _FPU_MASK_V 0x10 /* Invalid operation */ +#define _FPU_MASK_Z 0x08 /* Division by zero */ +#define _FPU_MASK_O 0x04 /* Overflow */ +#define _FPU_MASK_U 0x02 /* Underflow */ +#define _FPU_MASK_I 0x01 /* Inexact operation */ + +/* Flush denormalized numbers to zero. */ +#define _FPU_FLUSH_TZ 0x1000000 + +/* Rounding control. */ +#define _FPU_RC_NEAREST 0x000 /* RECOMMENDED */ +#define _FPU_RC_ZERO 0x100 +#define _FPU_RC_UP 0x200 +#define _FPU_RC_DOWN 0x300 +/* Mask for rounding control. */ +#define _FPU_RC_MASK 0x300 + +#define _FPU_RESERVED 0x0 + +#define _FPU_DEFAULT 0x0 +#define _FPU_IEEE 0x1F + +/* Type of the control word. */ +typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__))); + +/* Macros for accessing the hardware control word. */ +extern fpu_control_t __loongarch_fpu_getcw (void) __THROW; +extern void __loongarch_fpu_setcw (fpu_control_t) __THROW; +#define _FPU_GETCW(cw) __asm__ volatile ("movfcsr2gr %0,$r0" : "=r"(cw)) +#define _FPU_SETCW(cw) __asm__ volatile ("movgr2fcsr $r0,%0" : : "r"(cw)) + +/* Default control word set at startup. */ +extern fpu_control_t __fpu_control; + +# define _FCLASS_SNAN (1 << 0) +# define _FCLASS_QNAN (1 << 1) +# define _FCLASS_MINF (1 << 2) +# define _FCLASS_MNORM (1 << 3) +# define _FCLASS_MSUBNORM (1 << 4) +# define _FCLASS_MZERO (1 << 5) +# define _FCLASS_PINF (1 << 6) +# define _FCLASS_PNORM (1 << 7) +# define _FCLASS_PSUBNORM (1 << 8) +# define _FCLASS_PZERO (1 << 9) + +# define _FCLASS_ZERO (_FCLASS_MZERO | _FCLASS_PZERO) +# define _FCLASS_SUBNORM (_FCLASS_MSUBNORM | _FCLASS_PSUBNORM) +# define _FCLASS_NORM (_FCLASS_MNORM | _FCLASS_PNORM) +# define _FCLASS_INF (_FCLASS_MINF | _FCLASS_PINF) +# define _FCLASS_NAN (_FCLASS_SNAN | _FCLASS_QNAN) + +#endif /* __loongarch_soft_float */ + +#endif /* fpu_control.h */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/gnu/lib-names-lp64d.h b/zig/lib/libc/include/loongarch64-linux-gnu/gnu/lib-names-lp64d.h new file mode 100644 index 0000000000..35f957c3d1 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/gnu/lib-names-lp64d.h @@ -0,0 +1,28 @@ +/* This file is automatically generated. */ +#ifndef __GNU_LIB_NAMES_H +# error "Never use directly; include instead." +#endif + +#define LD_LINUX_LOONGARCH_LP64D_SO "ld-linux-loongarch-lp64d.so.1" +#define LD_SO "ld-linux-loongarch-lp64d.so.1" +#define LIBANL_SO "libanl.so.1" +#define LIBBROKENLOCALE_SO "libBrokenLocale.so.1" +#define LIBCRYPT_SO "libcrypt.so.1" +#define LIBC_MALLOC_DEBUG_SO "libc_malloc_debug.so.0" +#define LIBC_SO "libc.so.6" +#define LIBDL_SO "libdl.so.2" +#define LIBGCC_S_SO "libgcc_s.so.1" +#define LIBMVEC_SO "libmvec.so.1" +#define LIBM_SO "libm.so.6" +#define LIBNSL_SO "libnsl.so.1" +#define LIBNSS_COMPAT_SO "libnss_compat.so.2" +#define LIBNSS_DB_SO "libnss_db.so.2" +#define LIBNSS_DNS_SO "libnss_dns.so.2" +#define LIBNSS_FILES_SO "libnss_files.so.2" +#define LIBNSS_HESIOD_SO "libnss_hesiod.so.2" +#define LIBNSS_LDAP_SO "libnss_ldap.so.2" +#define LIBPTHREAD_SO "libpthread.so.0" +#define LIBRESOLV_SO "libresolv.so.2" +#define LIBRT_SO "librt.so.1" +#define LIBTHREAD_DB_SO "libthread_db.so.1" +#define LIBUTIL_SO "libutil.so.1" \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/gnu/lib-names.h b/zig/lib/libc/include/loongarch64-linux-gnu/gnu/lib-names.h new file mode 100644 index 0000000000..c3eba41e09 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/gnu/lib-names.h @@ -0,0 +1,16 @@ +/* This file is automatically generated. + It defines macros to allow user program to find the shared + library files which come as part of GNU libc. */ +#ifndef __GNU_LIB_NAMES_H +#define __GNU_LIB_NAMES_H 1 + +#include + +#if __WORDSIZE == 64 && defined __loongarch_soft_float +# include +#endif +#if __WORDSIZE == 64 && defined __loongarch_double_float +# include +#endif + +#endif /* gnu/lib-names.h */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/gnu/stubs-lp64d.h b/zig/lib/libc/include/loongarch64-linux-gnu/gnu/stubs-lp64d.h new file mode 100644 index 0000000000..4c2911dd6d --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/gnu/stubs-lp64d.h @@ -0,0 +1,21 @@ +/* This file is automatically generated. + It defines a symbol `__stub_FUNCTION' for each function + in the C library which is a stub, meaning it will fail + every time called, usually setting errno to ENOSYS. */ + +#ifdef _LIBC + #error Applications may not define the macro _LIBC +#endif + +#define __stub___compat_bdflush +#define __stub___compat_create_module +#define __stub___compat_get_kernel_syms +#define __stub___compat_query_module +#define __stub___compat_uselib +#define __stub_chflags +#define __stub_fchflags +#define __stub_gtty +#define __stub_revoke +#define __stub_setlogin +#define __stub_sigreturn +#define __stub_stty \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/gnu/stubs.h b/zig/lib/libc/include/loongarch64-linux-gnu/gnu/stubs.h new file mode 100644 index 0000000000..ea3f10c421 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/gnu/stubs.h @@ -0,0 +1,12 @@ +/* This file is automatically generated. + This file selects the right generated file of `__stub_FUNCTION' macros + based on the architecture being compiled for. */ + +#include + +#if __WORDSIZE == 64 && defined __loongarch_soft_float +# include +#endif +#if __WORDSIZE == 64 && defined __loongarch_double_float +# include +#endif \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/ieee754.h b/zig/lib/libc/include/loongarch64-linux-gnu/ieee754.h new file mode 100644 index 0000000000..c76cf156f6 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/ieee754.h @@ -0,0 +1,170 @@ +/* Copyright (C) 1992-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _IEEE754_H +#define _IEEE754_H 1 + +#include + +#include + +__BEGIN_DECLS + +union ieee754_float + { + float f; + + /* This is the IEEE 754 single-precision format. */ + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int negative:1; + unsigned int exponent:8; + unsigned int mantissa:23; +#endif /* Big endian. */ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int mantissa:23; + unsigned int exponent:8; + unsigned int negative:1; +#endif /* Little endian. */ + } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int negative:1; + unsigned int exponent:8; + unsigned int quiet_nan:1; + unsigned int mantissa:22; +#endif /* Big endian. */ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int mantissa:22; + unsigned int quiet_nan:1; + unsigned int exponent:8; + unsigned int negative:1; +#endif /* Little endian. */ + } ieee_nan; + }; + +#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ + + +union ieee754_double + { + double d; + + /* This is the IEEE 754 double-precision format. */ + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int negative:1; + unsigned int exponent:11; + /* Together these comprise the mantissa. */ + unsigned int mantissa0:20; + unsigned int mantissa1:32; +#endif /* Big endian. */ +#if __BYTE_ORDER == __LITTLE_ENDIAN + /* Together these comprise the mantissa. */ + unsigned int mantissa1:32; + unsigned int mantissa0:20; + unsigned int exponent:11; + unsigned int negative:1; +#endif /* Little endian. */ + } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int negative:1; + unsigned int exponent:11; + unsigned int quiet_nan:1; + /* Together these comprise the mantissa. */ + unsigned int mantissa0:19; + unsigned int mantissa1:32; +#else + /* Together these comprise the mantissa. */ + unsigned int mantissa1:32; + unsigned int mantissa0:19; + unsigned int quiet_nan:1; + unsigned int exponent:11; + unsigned int negative:1; +#endif + } ieee_nan; + }; + +#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ + + +union ieee854_long_double + { + long double d; + + /* This is the IEEE 854 quad-precision format. */ + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int negative:1; + unsigned int exponent:15; + /* Together these comprise the mantissa. */ + unsigned int mantissa0:16; + unsigned int mantissa1:32; + unsigned int mantissa2:32; + unsigned int mantissa3:32; +#endif /* Big endian. */ +#if __BYTE_ORDER == __LITTLE_ENDIAN + /* Together these comprise the mantissa. */ + unsigned int mantissa3:32; + unsigned int mantissa2:32; + unsigned int mantissa1:32; + unsigned int mantissa0:16; + unsigned int exponent:15; + unsigned int negative:1; +#endif /* Little endian. */ + } ieee; + + /* This format makes it easier to see if a NaN is a signalling NaN. */ + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int negative:1; + unsigned int exponent:15; + unsigned int quiet_nan:1; + /* Together these comprise the mantissa. */ + unsigned int mantissa0:15; + unsigned int mantissa1:32; + unsigned int mantissa2:32; + unsigned int mantissa3:32; +#else + /* Together these comprise the mantissa. */ + unsigned int mantissa3:32; + unsigned int mantissa2:32; + unsigned int mantissa1:32; + unsigned int mantissa0:15; + unsigned int quiet_nan:1; + unsigned int exponent:15; + unsigned int negative:1; +#endif + } ieee_nan; + }; + +#define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent. */ + +__END_DECLS + +#endif /* ieee754.h */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/sys/asm.h b/zig/lib/libc/include/loongarch64-linux-gnu/sys/asm.h new file mode 100644 index 0000000000..e948ace57b --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/sys/asm.h @@ -0,0 +1,62 @@ +/* Miscellaneous macros. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _SYS_ASM_H +#define _SYS_ASM_H + +#include +#include + +/* Macros to handle different pointer/register sizes for 32/64-bit code. */ +#define SZREG 8 +#define SZFREG 8 +#define SZVREG 16 +#define SZXREG 32 +#define REG_L ld.d +#define REG_S st.d +#define SRLI srli.d +#define SLLI slli.d +#define ADDI addi.d +#define ADD add.d +#define SUB sub.d +#define BSTRINS bstrins.d +#define LI li.d +#define FREG_L fld.d +#define FREG_S fst.d + +/* Declare leaf routine. */ +#define LEAF(symbol) \ + .text; \ + .globl symbol; \ + .align 3; \ + cfi_startproc; \ + .type symbol, @function; \ + symbol: + +#define ENTRY(symbol) LEAF (symbol) + +/* Mark end of function. */ +#undef END +#define END(function) \ + cfi_endproc; \ + .size function, .- function; + +/* Stack alignment. */ +#define ALMASK ~15 + +#endif /* sys/asm.h */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/sys/regdef.h b/zig/lib/libc/include/loongarch64-linux-gnu/sys/regdef.h new file mode 100644 index 0000000000..5100f36d24 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/sys/regdef.h @@ -0,0 +1,111 @@ +/* Register Macro definitions + Copyright (C) 2022-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _SYS_REGDEF_H +#define _SYS_REGDEF_H + +#define zero $r0 +#define ra $r1 +#define tp $r2 +#define sp $r3 +#define a0 $r4 +#define a1 $r5 +#define a2 $r6 +#define a3 $r7 +#define a4 $r8 +#define a5 $r9 +#define a6 $r10 +#define a7 $r11 +#define v0 $r4 +#define v1 $r5 +#define t0 $r12 +#define t1 $r13 +#define t2 $r14 +#define t3 $r15 +#define t4 $r16 +#define t5 $r17 +#define t6 $r18 +#define t7 $r19 +#define t8 $r20 +#define x $r21 +#define fp $r22 +#define s0 $r23 +#define s1 $r24 +#define s2 $r25 +#define s3 $r26 +#define s4 $r27 +#define s5 $r28 +#define s6 $r29 +#define s7 $r30 +#define s8 $r31 + +#define fa0 $f0 +#define fa1 $f1 +#define fa2 $f2 +#define fa3 $f3 +#define fa4 $f4 +#define fa5 $f5 +#define fa6 $f6 +#define fa7 $f7 +#define fv0 $f0 +#define fv1 $f1 +#define ft0 $f8 +#define ft1 $f9 +#define ft2 $f10 +#define ft3 $f11 +#define ft4 $f12 +#define ft5 $f13 +#define ft6 $f14 +#define ft7 $f15 +#define ft8 $f16 +#define ft9 $f17 +#define ft10 $f18 +#define ft11 $f19 +#define ft12 $f20 +#define ft13 $f21 +#define ft14 $f22 +#define ft15 $f23 +#define fs0 $f24 +#define fs1 $f25 +#define fs2 $f26 +#define fs3 $f27 +#define fs4 $f28 +#define fs5 $f29 +#define fs6 $f30 +#define fs7 $f31 + +#define vr0 $vr0 +#define vr1 $vr1 +#define vr2 $vr2 +#define vr3 $vr3 +#define vr4 $vr4 +#define vr5 $vr5 +#define vr6 $vr6 +#define vr7 $vr7 + +#define xr0 $xr0 +#define xr1 $xr1 +#define xr2 $xr2 +#define xr3 $xr3 +#define xr4 $xr4 +#define xr5 $xr5 +#define xr6 $xr6 +#define xr7 $xr7 + +#endif /* _SYS_REGDEF_H */ diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/sys/ucontext.h b/zig/lib/libc/include/loongarch64-linux-gnu/sys/ucontext.h new file mode 100644 index 0000000000..e729ae570d --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/sys/ucontext.h @@ -0,0 +1,64 @@ +/* struct ucontext definition. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +/* Don't rely on this, the interface is currently messed up and may need to + be broken to be fixed. */ +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include + +#include +#include + +#ifdef __USE_MISC +#define LARCH_NGREG 32 + +#define LARCH_REG_RA 1 +#define LARCH_REG_SP 3 +#define LARCH_REG_S0 23 +#define LARCH_REG_S1 24 +#define LARCH_REG_A0 4 +#define LARCH_REG_S2 25 +#define LARCH_REG_NARGS 8 + +typedef unsigned long int greg_t; +/* Container for all general registers. */ +typedef greg_t gregset_t[32]; +#endif + +typedef struct mcontext_t +{ + unsigned long long __pc; + unsigned long long __gregs[32]; + unsigned int __flags; + unsigned long long __extcontext[0] __attribute__((__aligned__(16))); +} mcontext_t; + +/* Userlevel context. */ +typedef struct ucontext_t +{ + unsigned long int __uc_flags; + struct ucontext_t *uc_link; + stack_t uc_stack; + sigset_t uc_sigmask; + mcontext_t uc_mcontext; +} ucontext_t; + +#endif /* sys/ucontext.h */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-gnu/sys/user.h b/zig/lib/libc/include/loongarch64-linux-gnu/sys/user.h new file mode 100644 index 0000000000..b9952c629a --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-gnu/sys/user.h @@ -0,0 +1,42 @@ +/* struct user_regs_struct definition for LoongArch. + Copyright (C) 2022-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _SYS_USER_H +#define _SYS_USER_H 1 + +#include + +struct user_regs_struct +{ + /* Saved main processor registers. */ + uint64_t regs[32]; + + /* Saved special registers. */ + uint64_t orig_a0; + uint64_t csr_era; + uint64_t csr_badv; + uint64_t reserved[10]; +}; + +struct user_fp_struct { + uint64_t fpr[32]; + uint64_t fcc; + uint32_t fcsr; +}; + +#endif /* _SYS_USER_H */ \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-musl/bits/alltypes.h b/zig/lib/libc/include/loongarch64-linux-musl/bits/alltypes.h new file mode 100644 index 0000000000..7a558e341c --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-musl/bits/alltypes.h @@ -0,0 +1,413 @@ +#define _Addr long +#define _Int64 long +#define _Reg long + +#define __BYTE_ORDER 1234 +#define __LONG_MAX 0x7fffffffffffffffL + +#ifndef __cplusplus +#if defined(__NEED_wchar_t) && !defined(__DEFINED_wchar_t) +typedef int wchar_t; +#define __DEFINED_wchar_t +#endif + +#endif + +#if defined(__NEED_float_t) && !defined(__DEFINED_float_t) +typedef float float_t; +#define __DEFINED_float_t +#endif + +#if defined(__NEED_double_t) && !defined(__DEFINED_double_t) +typedef double double_t; +#define __DEFINED_double_t +#endif + + +#if defined(__NEED_max_align_t) && !defined(__DEFINED_max_align_t) +typedef struct { long long __ll; long double __ld; } max_align_t; +#define __DEFINED_max_align_t +#endif + + +#if defined(__NEED_nlink_t) && !defined(__DEFINED_nlink_t) +typedef unsigned nlink_t; +#define __DEFINED_nlink_t +#endif + +#if defined(__NEED_blksize_t) && !defined(__DEFINED_blksize_t) +typedef int blksize_t; +#define __DEFINED_blksize_t +#endif + +#define __LITTLE_ENDIAN 1234 +#define __BIG_ENDIAN 4321 +#define __USE_TIME_BITS64 1 + +#if defined(__NEED_size_t) && !defined(__DEFINED_size_t) +typedef unsigned _Addr size_t; +#define __DEFINED_size_t +#endif + +#if defined(__NEED_uintptr_t) && !defined(__DEFINED_uintptr_t) +typedef unsigned _Addr uintptr_t; +#define __DEFINED_uintptr_t +#endif + +#if defined(__NEED_ptrdiff_t) && !defined(__DEFINED_ptrdiff_t) +typedef _Addr ptrdiff_t; +#define __DEFINED_ptrdiff_t +#endif + +#if defined(__NEED_ssize_t) && !defined(__DEFINED_ssize_t) +typedef _Addr ssize_t; +#define __DEFINED_ssize_t +#endif + +#if defined(__NEED_intptr_t) && !defined(__DEFINED_intptr_t) +typedef _Addr intptr_t; +#define __DEFINED_intptr_t +#endif + +#if defined(__NEED_regoff_t) && !defined(__DEFINED_regoff_t) +typedef _Addr regoff_t; +#define __DEFINED_regoff_t +#endif + +#if defined(__NEED_register_t) && !defined(__DEFINED_register_t) +typedef _Reg register_t; +#define __DEFINED_register_t +#endif + +#if defined(__NEED_time_t) && !defined(__DEFINED_time_t) +typedef _Int64 time_t; +#define __DEFINED_time_t +#endif + +#if defined(__NEED_suseconds_t) && !defined(__DEFINED_suseconds_t) +typedef _Int64 suseconds_t; +#define __DEFINED_suseconds_t +#endif + + +#if defined(__NEED_int8_t) && !defined(__DEFINED_int8_t) +typedef signed char int8_t; +#define __DEFINED_int8_t +#endif + +#if defined(__NEED_int16_t) && !defined(__DEFINED_int16_t) +typedef signed short int16_t; +#define __DEFINED_int16_t +#endif + +#if defined(__NEED_int32_t) && !defined(__DEFINED_int32_t) +typedef signed int int32_t; +#define __DEFINED_int32_t +#endif + +#if defined(__NEED_int64_t) && !defined(__DEFINED_int64_t) +typedef signed _Int64 int64_t; +#define __DEFINED_int64_t +#endif + +#if defined(__NEED_intmax_t) && !defined(__DEFINED_intmax_t) +typedef signed _Int64 intmax_t; +#define __DEFINED_intmax_t +#endif + +#if defined(__NEED_uint8_t) && !defined(__DEFINED_uint8_t) +typedef unsigned char uint8_t; +#define __DEFINED_uint8_t +#endif + +#if defined(__NEED_uint16_t) && !defined(__DEFINED_uint16_t) +typedef unsigned short uint16_t; +#define __DEFINED_uint16_t +#endif + +#if defined(__NEED_uint32_t) && !defined(__DEFINED_uint32_t) +typedef unsigned int uint32_t; +#define __DEFINED_uint32_t +#endif + +#if defined(__NEED_uint64_t) && !defined(__DEFINED_uint64_t) +typedef unsigned _Int64 uint64_t; +#define __DEFINED_uint64_t +#endif + +#if defined(__NEED_u_int64_t) && !defined(__DEFINED_u_int64_t) +typedef unsigned _Int64 u_int64_t; +#define __DEFINED_u_int64_t +#endif + +#if defined(__NEED_uintmax_t) && !defined(__DEFINED_uintmax_t) +typedef unsigned _Int64 uintmax_t; +#define __DEFINED_uintmax_t +#endif + + +#if defined(__NEED_mode_t) && !defined(__DEFINED_mode_t) +typedef unsigned mode_t; +#define __DEFINED_mode_t +#endif + +#if defined(__NEED_nlink_t) && !defined(__DEFINED_nlink_t) +typedef unsigned _Reg nlink_t; +#define __DEFINED_nlink_t +#endif + +#if defined(__NEED_off_t) && !defined(__DEFINED_off_t) +typedef _Int64 off_t; +#define __DEFINED_off_t +#endif + +#if defined(__NEED_ino_t) && !defined(__DEFINED_ino_t) +typedef unsigned _Int64 ino_t; +#define __DEFINED_ino_t +#endif + +#if defined(__NEED_dev_t) && !defined(__DEFINED_dev_t) +typedef unsigned _Int64 dev_t; +#define __DEFINED_dev_t +#endif + +#if defined(__NEED_blksize_t) && !defined(__DEFINED_blksize_t) +typedef long blksize_t; +#define __DEFINED_blksize_t +#endif + +#if defined(__NEED_blkcnt_t) && !defined(__DEFINED_blkcnt_t) +typedef _Int64 blkcnt_t; +#define __DEFINED_blkcnt_t +#endif + +#if defined(__NEED_fsblkcnt_t) && !defined(__DEFINED_fsblkcnt_t) +typedef unsigned _Int64 fsblkcnt_t; +#define __DEFINED_fsblkcnt_t +#endif + +#if defined(__NEED_fsfilcnt_t) && !defined(__DEFINED_fsfilcnt_t) +typedef unsigned _Int64 fsfilcnt_t; +#define __DEFINED_fsfilcnt_t +#endif + + +#if defined(__NEED_wint_t) && !defined(__DEFINED_wint_t) +typedef unsigned wint_t; +#define __DEFINED_wint_t +#endif + +#if defined(__NEED_wctype_t) && !defined(__DEFINED_wctype_t) +typedef unsigned long wctype_t; +#define __DEFINED_wctype_t +#endif + + +#if defined(__NEED_timer_t) && !defined(__DEFINED_timer_t) +typedef void * timer_t; +#define __DEFINED_timer_t +#endif + +#if defined(__NEED_clockid_t) && !defined(__DEFINED_clockid_t) +typedef int clockid_t; +#define __DEFINED_clockid_t +#endif + +#if defined(__NEED_clock_t) && !defined(__DEFINED_clock_t) +typedef long clock_t; +#define __DEFINED_clock_t +#endif + +#if defined(__NEED_struct_timeval) && !defined(__DEFINED_struct_timeval) +struct timeval { time_t tv_sec; suseconds_t tv_usec; }; +#define __DEFINED_struct_timeval +#endif + +#if defined(__NEED_struct_timespec) && !defined(__DEFINED_struct_timespec) +struct timespec { time_t tv_sec; int :8*(sizeof(time_t)-sizeof(long))*(__BYTE_ORDER==4321); long tv_nsec; int :8*(sizeof(time_t)-sizeof(long))*(__BYTE_ORDER!=4321); }; +#define __DEFINED_struct_timespec +#endif + + +#if defined(__NEED_pid_t) && !defined(__DEFINED_pid_t) +typedef int pid_t; +#define __DEFINED_pid_t +#endif + +#if defined(__NEED_id_t) && !defined(__DEFINED_id_t) +typedef unsigned id_t; +#define __DEFINED_id_t +#endif + +#if defined(__NEED_uid_t) && !defined(__DEFINED_uid_t) +typedef unsigned uid_t; +#define __DEFINED_uid_t +#endif + +#if defined(__NEED_gid_t) && !defined(__DEFINED_gid_t) +typedef unsigned gid_t; +#define __DEFINED_gid_t +#endif + +#if defined(__NEED_key_t) && !defined(__DEFINED_key_t) +typedef int key_t; +#define __DEFINED_key_t +#endif + +#if defined(__NEED_useconds_t) && !defined(__DEFINED_useconds_t) +typedef unsigned useconds_t; +#define __DEFINED_useconds_t +#endif + + +#ifdef __cplusplus +#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t) +typedef unsigned long pthread_t; +#define __DEFINED_pthread_t +#endif + +#else +#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t) +typedef struct __pthread * pthread_t; +#define __DEFINED_pthread_t +#endif + +#endif +#if defined(__NEED_pthread_once_t) && !defined(__DEFINED_pthread_once_t) +typedef int pthread_once_t; +#define __DEFINED_pthread_once_t +#endif + +#if defined(__NEED_pthread_key_t) && !defined(__DEFINED_pthread_key_t) +typedef unsigned pthread_key_t; +#define __DEFINED_pthread_key_t +#endif + +#if defined(__NEED_pthread_spinlock_t) && !defined(__DEFINED_pthread_spinlock_t) +typedef int pthread_spinlock_t; +#define __DEFINED_pthread_spinlock_t +#endif + +#if defined(__NEED_pthread_mutexattr_t) && !defined(__DEFINED_pthread_mutexattr_t) +typedef struct { unsigned __attr; } pthread_mutexattr_t; +#define __DEFINED_pthread_mutexattr_t +#endif + +#if defined(__NEED_pthread_condattr_t) && !defined(__DEFINED_pthread_condattr_t) +typedef struct { unsigned __attr; } pthread_condattr_t; +#define __DEFINED_pthread_condattr_t +#endif + +#if defined(__NEED_pthread_barrierattr_t) && !defined(__DEFINED_pthread_barrierattr_t) +typedef struct { unsigned __attr; } pthread_barrierattr_t; +#define __DEFINED_pthread_barrierattr_t +#endif + +#if defined(__NEED_pthread_rwlockattr_t) && !defined(__DEFINED_pthread_rwlockattr_t) +typedef struct { unsigned __attr[2]; } pthread_rwlockattr_t; +#define __DEFINED_pthread_rwlockattr_t +#endif + + +#if defined(__NEED_struct__IO_FILE) && !defined(__DEFINED_struct__IO_FILE) +struct _IO_FILE { char __x; }; +#define __DEFINED_struct__IO_FILE +#endif + +#if defined(__NEED_FILE) && !defined(__DEFINED_FILE) +typedef struct _IO_FILE FILE; +#define __DEFINED_FILE +#endif + + +#if defined(__NEED_va_list) && !defined(__DEFINED_va_list) +typedef __builtin_va_list va_list; +#define __DEFINED_va_list +#endif + +#if defined(__NEED___isoc_va_list) && !defined(__DEFINED___isoc_va_list) +typedef __builtin_va_list __isoc_va_list; +#define __DEFINED___isoc_va_list +#endif + + +#if defined(__NEED_mbstate_t) && !defined(__DEFINED_mbstate_t) +typedef struct __mbstate_t { unsigned __opaque1, __opaque2; } mbstate_t; +#define __DEFINED_mbstate_t +#endif + + +#if defined(__NEED_locale_t) && !defined(__DEFINED_locale_t) +typedef struct __locale_struct * locale_t; +#define __DEFINED_locale_t +#endif + + +#if defined(__NEED_sigset_t) && !defined(__DEFINED_sigset_t) +typedef struct __sigset_t { unsigned long __bits[128/sizeof(long)]; } sigset_t; +#define __DEFINED_sigset_t +#endif + + +#if defined(__NEED_struct_iovec) && !defined(__DEFINED_struct_iovec) +struct iovec { void *iov_base; size_t iov_len; }; +#define __DEFINED_struct_iovec +#endif + + +#if defined(__NEED_struct_winsize) && !defined(__DEFINED_struct_winsize) +struct winsize { unsigned short ws_row, ws_col, ws_xpixel, ws_ypixel; }; +#define __DEFINED_struct_winsize +#endif + + +#if defined(__NEED_socklen_t) && !defined(__DEFINED_socklen_t) +typedef unsigned socklen_t; +#define __DEFINED_socklen_t +#endif + +#if defined(__NEED_sa_family_t) && !defined(__DEFINED_sa_family_t) +typedef unsigned short sa_family_t; +#define __DEFINED_sa_family_t +#endif + + +#if defined(__NEED_pthread_attr_t) && !defined(__DEFINED_pthread_attr_t) +typedef struct { union { int __i[sizeof(long)==8?14:9]; volatile int __vi[sizeof(long)==8?14:9]; unsigned long __s[sizeof(long)==8?7:9]; } __u; } pthread_attr_t; +#define __DEFINED_pthread_attr_t +#endif + +#if defined(__NEED_pthread_mutex_t) && !defined(__DEFINED_pthread_mutex_t) +typedef struct { union { int __i[sizeof(long)==8?10:6]; volatile int __vi[sizeof(long)==8?10:6]; volatile void *volatile __p[sizeof(long)==8?5:6]; } __u; } pthread_mutex_t; +#define __DEFINED_pthread_mutex_t +#endif + +#if defined(__NEED_mtx_t) && !defined(__DEFINED_mtx_t) +typedef struct { union { int __i[sizeof(long)==8?10:6]; volatile int __vi[sizeof(long)==8?10:6]; volatile void *volatile __p[sizeof(long)==8?5:6]; } __u; } mtx_t; +#define __DEFINED_mtx_t +#endif + +#if defined(__NEED_pthread_cond_t) && !defined(__DEFINED_pthread_cond_t) +typedef struct { union { int __i[12]; volatile int __vi[12]; void *__p[12*sizeof(int)/sizeof(void*)]; } __u; } pthread_cond_t; +#define __DEFINED_pthread_cond_t +#endif + +#if defined(__NEED_cnd_t) && !defined(__DEFINED_cnd_t) +typedef struct { union { int __i[12]; volatile int __vi[12]; void *__p[12*sizeof(int)/sizeof(void*)]; } __u; } cnd_t; +#define __DEFINED_cnd_t +#endif + +#if defined(__NEED_pthread_rwlock_t) && !defined(__DEFINED_pthread_rwlock_t) +typedef struct { union { int __i[sizeof(long)==8?14:8]; volatile int __vi[sizeof(long)==8?14:8]; void *__p[sizeof(long)==8?7:8]; } __u; } pthread_rwlock_t; +#define __DEFINED_pthread_rwlock_t +#endif + +#if defined(__NEED_pthread_barrier_t) && !defined(__DEFINED_pthread_barrier_t) +typedef struct { union { int __i[sizeof(long)==8?8:5]; volatile int __vi[sizeof(long)==8?8:5]; void *__p[sizeof(long)==8?4:5]; } __u; } pthread_barrier_t; +#define __DEFINED_pthread_barrier_t +#endif + + +#undef _Addr +#undef _Int64 +#undef _Reg \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-musl/bits/fenv.h b/zig/lib/libc/include/loongarch64-linux-musl/bits/fenv.h new file mode 100644 index 0000000000..548677f357 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-musl/bits/fenv.h @@ -0,0 +1,20 @@ +#define FE_INEXACT 0x010000 +#define FE_UNDERFLOW 0x020000 +#define FE_OVERFLOW 0x040000 +#define FE_DIVBYZERO 0x080000 +#define FE_INVALID 0x100000 + +#define FE_ALL_EXCEPT 0x1F0000 + +#define FE_TONEAREST 0x000 +#define FE_TOWARDZERO 0x100 +#define FE_UPWARD 0x200 +#define FE_DOWNWARD 0x300 + +typedef unsigned fexcept_t; + +typedef struct { + unsigned __cw; +} fenv_t; + +#define FE_DFL_ENV ((const fenv_t *) -1) \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-musl/bits/posix.h b/zig/lib/libc/include/loongarch64-linux-musl/bits/posix.h new file mode 100644 index 0000000000..b33ac2f035 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-musl/bits/posix.h @@ -0,0 +1,2 @@ +#define _POSIX_V6_LP64_OFF64 1 +#define _POSIX_V7_LP64_OFF64 1 \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-musl/bits/setjmp.h b/zig/lib/libc/include/loongarch64-linux-musl/bits/setjmp.h new file mode 100644 index 0000000000..4c44236b62 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-musl/bits/setjmp.h @@ -0,0 +1 @@ +typedef unsigned long __jmp_buf[23]; \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-musl/bits/signal.h b/zig/lib/libc/include/loongarch64-linux-musl/bits/signal.h new file mode 100644 index 0000000000..b403ad46ac --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-musl/bits/signal.h @@ -0,0 +1,101 @@ +#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) + +#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +#define MINSIGSTKSZ 4096 +#define SIGSTKSZ 16384 +#endif + +#if defined(_GNU_SOURCE) +#define LARCH_NGREG 32 +#define LARCH_REG_RA 1 +#define LARCH_REG_SP 3 +#define LARCH_REG_S0 23 +#define LARCH_REG_S1 24 +#define LARCH_REG_A0 4 +#define LARCH_REG_S2 25 +#define LARCH_REG_NARGS 8 +#endif + +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +typedef unsigned long greg_t, gregset_t[32]; + +struct sigcontext { + unsigned long sc_pc; + unsigned long sc_regs[32]; + unsigned sc_flags; + unsigned long sc_extcontext[] __attribute__((__aligned__(16))); +}; +#endif + +typedef struct { + unsigned long __pc; + unsigned long __gregs[32]; + unsigned __flags; + unsigned long __extcontext[] __attribute__((__aligned__(16))); +} mcontext_t; + +struct sigaltstack { + void *ss_sp; + int ss_flags; + size_t ss_size; +}; + +typedef struct __ucontext +{ + unsigned long uc_flags; + struct __ucontext *uc_link; + stack_t uc_stack; + sigset_t uc_sigmask; + long __uc_pad; + mcontext_t uc_mcontext; +} ucontext_t; + +#define __uc_flags uc_flags + +#define SA_NOCLDSTOP 1 +#define SA_NOCLDWAIT 2 +#define SA_SIGINFO 4 +#define SA_ONSTACK 0x08000000 +#define SA_RESTART 0x10000000 +#define SA_NODEFER 0x40000000 +#define SA_RESETHAND 0x80000000 + +#endif + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT SIGABRT +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL SIGIO +#define SIGPWR 30 +#define SIGSYS 31 +#define SIGUNUSED SIGSYS + +#define _NSIG 65 \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-musl/bits/syscall.h b/zig/lib/libc/include/loongarch64-linux-musl/bits/syscall.h new file mode 100644 index 0000000000..b735242427 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-musl/bits/syscall.h @@ -0,0 +1,623 @@ +#define __NR_io_setup 0 +#define __NR_io_destroy 1 +#define __NR_io_submit 2 +#define __NR_io_cancel 3 +#define __NR_io_getevents 4 +#define __NR_setxattr 5 +#define __NR_lsetxattr 6 +#define __NR_fsetxattr 7 +#define __NR_getxattr 8 +#define __NR_lgetxattr 9 +#define __NR_fgetxattr 10 +#define __NR_listxattr 11 +#define __NR_llistxattr 12 +#define __NR_flistxattr 13 +#define __NR_removexattr 14 +#define __NR_lremovexattr 15 +#define __NR_fremovexattr 16 +#define __NR_getcwd 17 +#define __NR_lookup_dcookie 18 +#define __NR_eventfd2 19 +#define __NR_epoll_create1 20 +#define __NR_epoll_ctl 21 +#define __NR_epoll_pwait 22 +#define __NR_dup 23 +#define __NR_dup3 24 +#define __NR3264_fcntl 25 +#define __NR_inotify_init1 26 +#define __NR_inotify_add_watch 27 +#define __NR_inotify_rm_watch 28 +#define __NR_ioctl 29 +#define __NR_ioprio_set 30 +#define __NR_ioprio_get 31 +#define __NR_flock 32 +#define __NR_mknodat 33 +#define __NR_mkdirat 34 +#define __NR_unlinkat 35 +#define __NR_symlinkat 36 +#define __NR_linkat 37 +#define __NR_umount2 39 +#define __NR_mount 40 +#define __NR_pivot_root 41 +#define __NR_nfsservctl 42 +#define __NR3264_statfs 43 +#define __NR3264_fstatfs 44 +#define __NR3264_truncate 45 +#define __NR3264_ftruncate 46 +#define __NR_fallocate 47 +#define __NR_faccessat 48 +#define __NR_chdir 49 +#define __NR_fchdir 50 +#define __NR_chroot 51 +#define __NR_fchmod 52 +#define __NR_fchmodat 53 +#define __NR_fchownat 54 +#define __NR_fchown 55 +#define __NR_openat 56 +#define __NR_close 57 +#define __NR_vhangup 58 +#define __NR_pipe2 59 +#define __NR_quotactl 60 +#define __NR_getdents64 61 +#define __NR3264_lseek 62 +#define __NR_read 63 +#define __NR_write 64 +#define __NR_readv 65 +#define __NR_writev 66 +#define __NR_pread64 67 +#define __NR_pwrite64 68 +#define __NR_preadv 69 +#define __NR_pwritev 70 +#define __NR3264_sendfile 71 +#define __NR_pselect6 72 +#define __NR_ppoll 73 +#define __NR_signalfd4 74 +#define __NR_vmsplice 75 +#define __NR_splice 76 +#define __NR_tee 77 +#define __NR_readlinkat 78 +#define __NR_sync 81 +#define __NR_fsync 82 +#define __NR_fdatasync 83 +#define __NR_sync_file_range 84 +#define __NR_timerfd_create 85 +#define __NR_timerfd_settime 86 +#define __NR_timerfd_gettime 87 +#define __NR_utimensat 88 +#define __NR_acct 89 +#define __NR_capget 90 +#define __NR_capset 91 +#define __NR_personality 92 +#define __NR_exit 93 +#define __NR_exit_group 94 +#define __NR_waitid 95 +#define __NR_set_tid_address 96 +#define __NR_unshare 97 +#define __NR_futex 98 +#define __NR_set_robust_list 99 +#define __NR_get_robust_list 100 +#define __NR_nanosleep 101 +#define __NR_getitimer 102 +#define __NR_setitimer 103 +#define __NR_kexec_load 104 +#define __NR_init_module 105 +#define __NR_delete_module 106 +#define __NR_timer_create 107 +#define __NR_timer_gettime 108 +#define __NR_timer_getoverrun 109 +#define __NR_timer_settime 110 +#define __NR_timer_delete 111 +#define __NR_clock_settime 112 +#define __NR_clock_gettime 113 +#define __NR_clock_getres 114 +#define __NR_clock_nanosleep 115 +#define __NR_syslog 116 +#define __NR_ptrace 117 +#define __NR_sched_setparam 118 +#define __NR_sched_setscheduler 119 +#define __NR_sched_getscheduler 120 +#define __NR_sched_getparam 121 +#define __NR_sched_setaffinity 122 +#define __NR_sched_getaffinity 123 +#define __NR_sched_yield 124 +#define __NR_sched_get_priority_max 125 +#define __NR_sched_get_priority_min 126 +#define __NR_sched_rr_get_interval 127 +#define __NR_restart_syscall 128 +#define __NR_kill 129 +#define __NR_tkill 130 +#define __NR_tgkill 131 +#define __NR_sigaltstack 132 +#define __NR_rt_sigsuspend 133 +#define __NR_rt_sigaction 134 +#define __NR_rt_sigprocmask 135 +#define __NR_rt_sigpending 136 +#define __NR_rt_sigtimedwait 137 +#define __NR_rt_sigqueueinfo 138 +#define __NR_rt_sigreturn 139 +#define __NR_setpriority 140 +#define __NR_getpriority 141 +#define __NR_reboot 142 +#define __NR_setregid 143 +#define __NR_setgid 144 +#define __NR_setreuid 145 +#define __NR_setuid 146 +#define __NR_setresuid 147 +#define __NR_getresuid 148 +#define __NR_setresgid 149 +#define __NR_getresgid 150 +#define __NR_setfsuid 151 +#define __NR_setfsgid 152 +#define __NR_times 153 +#define __NR_setpgid 154 +#define __NR_getpgid 155 +#define __NR_getsid 156 +#define __NR_setsid 157 +#define __NR_getgroups 158 +#define __NR_setgroups 159 +#define __NR_uname 160 +#define __NR_sethostname 161 +#define __NR_setdomainname 162 +#define __NR_getrusage 165 +#define __NR_umask 166 +#define __NR_prctl 167 +#define __NR_getcpu 168 +#define __NR_gettimeofday 169 +#define __NR_settimeofday 170 +#define __NR_adjtimex 171 +#define __NR_getpid 172 +#define __NR_getppid 173 +#define __NR_getuid 174 +#define __NR_geteuid 175 +#define __NR_getgid 176 +#define __NR_getegid 177 +#define __NR_gettid 178 +#define __NR_sysinfo 179 +#define __NR_mq_open 180 +#define __NR_mq_unlink 181 +#define __NR_mq_timedsend 182 +#define __NR_mq_timedreceive 183 +#define __NR_mq_notify 184 +#define __NR_mq_getsetattr 185 +#define __NR_msgget 186 +#define __NR_msgctl 187 +#define __NR_msgrcv 188 +#define __NR_msgsnd 189 +#define __NR_semget 190 +#define __NR_semctl 191 +#define __NR_semtimedop 192 +#define __NR_semop 193 +#define __NR_shmget 194 +#define __NR_shmctl 195 +#define __NR_shmat 196 +#define __NR_shmdt 197 +#define __NR_socket 198 +#define __NR_socketpair 199 +#define __NR_bind 200 +#define __NR_listen 201 +#define __NR_accept 202 +#define __NR_connect 203 +#define __NR_getsockname 204 +#define __NR_getpeername 205 +#define __NR_sendto 206 +#define __NR_recvfrom 207 +#define __NR_setsockopt 208 +#define __NR_getsockopt 209 +#define __NR_shutdown 210 +#define __NR_sendmsg 211 +#define __NR_recvmsg 212 +#define __NR_readahead 213 +#define __NR_brk 214 +#define __NR_munmap 215 +#define __NR_mremap 216 +#define __NR_add_key 217 +#define __NR_request_key 218 +#define __NR_keyctl 219 +#define __NR_clone 220 +#define __NR_execve 221 +#define __NR3264_mmap 222 +#define __NR3264_fadvise64 223 +#define __NR_swapon 224 +#define __NR_swapoff 225 +#define __NR_mprotect 226 +#define __NR_msync 227 +#define __NR_mlock 228 +#define __NR_munlock 229 +#define __NR_mlockall 230 +#define __NR_munlockall 231 +#define __NR_mincore 232 +#define __NR_madvise 233 +#define __NR_remap_file_pages 234 +#define __NR_mbind 235 +#define __NR_get_mempolicy 236 +#define __NR_set_mempolicy 237 +#define __NR_migrate_pages 238 +#define __NR_move_pages 239 +#define __NR_rt_tgsigqueueinfo 240 +#define __NR_perf_event_open 241 +#define __NR_accept4 242 +#define __NR_recvmmsg 243 +#define __NR_arch_specific_syscall 244 +#define __NR_wait4 260 +#define __NR_prlimit64 261 +#define __NR_fanotify_init 262 +#define __NR_fanotify_mark 263 +#define __NR_name_to_handle_at 264 +#define __NR_open_by_handle_at 265 +#define __NR_clock_adjtime 266 +#define __NR_syncfs 267 +#define __NR_setns 268 +#define __NR_sendmmsg 269 +#define __NR_process_vm_readv 270 +#define __NR_process_vm_writev 271 +#define __NR_kcmp 272 +#define __NR_finit_module 273 +#define __NR_sched_setattr 274 +#define __NR_sched_getattr 275 +#define __NR_renameat2 276 +#define __NR_seccomp 277 +#define __NR_getrandom 278 +#define __NR_memfd_create 279 +#define __NR_bpf 280 +#define __NR_execveat 281 +#define __NR_userfaultfd 282 +#define __NR_membarrier 283 +#define __NR_mlock2 284 +#define __NR_copy_file_range 285 +#define __NR_preadv2 286 +#define __NR_pwritev2 287 +#define __NR_pkey_mprotect 288 +#define __NR_pkey_alloc 289 +#define __NR_pkey_free 290 +#define __NR_statx 291 +#define __NR_io_pgetevents 292 +#define __NR_rseq 293 +#define __NR_kexec_file_load 294 +#define __NR_pidfd_send_signal 424 +#define __NR_io_uring_setup 425 +#define __NR_io_uring_enter 426 +#define __NR_io_uring_register 427 +#define __NR_open_tree 428 +#define __NR_move_mount 429 +#define __NR_fsopen 430 +#define __NR_fsconfig 431 +#define __NR_fsmount 432 +#define __NR_fspick 433 +#define __NR_pidfd_open 434 +#define __NR_clone3 435 +#define __NR_close_range 436 +#define __NR_openat2 437 +#define __NR_pidfd_getfd 438 +#define __NR_faccessat2 439 +#define __NR_process_madvise 440 +#define __NR_epoll_pwait2 441 +#define __NR_mount_setattr 442 +#define __NR_quotactl_fd 443 +#define __NR_landlock_create_ruleset 444 +#define __NR_landlock_add_rule 445 +#define __NR_landlock_restrict_self 446 +#define __NR_process_mrelease 448 +#define __NR_futex_waitv 449 +#define __NR_set_mempolicy_home_node 450 +#define __NR_cachestat 451 +#define __NR_fchmodat2 452 +#define __NR_map_shadow_stack 453 +#define __NR_futex_wake 454 +#define __NR_futex_wait 455 +#define __NR_futex_requeue 456 +#define __NR_fcntl __NR3264_fcntl +#define __NR_statfs __NR3264_statfs +#define __NR_fstatfs __NR3264_fstatfs +#define __NR_truncate __NR3264_truncate +#define __NR_ftruncate __NR3264_ftruncate +#define __NR_lseek __NR3264_lseek +#define __NR_sendfile __NR3264_sendfile +#define __NR_mmap __NR3264_mmap +#define __NR_fadvise64 __NR3264_fadvise64 +#define SYS_io_setup 0 +#define SYS_io_destroy 1 +#define SYS_io_submit 2 +#define SYS_io_cancel 3 +#define SYS_io_getevents 4 +#define SYS_setxattr 5 +#define SYS_lsetxattr 6 +#define SYS_fsetxattr 7 +#define SYS_getxattr 8 +#define SYS_lgetxattr 9 +#define SYS_fgetxattr 10 +#define SYS_listxattr 11 +#define SYS_llistxattr 12 +#define SYS_flistxattr 13 +#define SYS_removexattr 14 +#define SYS_lremovexattr 15 +#define SYS_fremovexattr 16 +#define SYS_getcwd 17 +#define SYS_lookup_dcookie 18 +#define SYS_eventfd2 19 +#define SYS_epoll_create1 20 +#define SYS_epoll_ctl 21 +#define SYS_epoll_pwait 22 +#define SYS_dup 23 +#define SYS_dup3 24 +#define SYS_inotify_init1 26 +#define SYS_inotify_add_watch 27 +#define SYS_inotify_rm_watch 28 +#define SYS_ioctl 29 +#define SYS_ioprio_set 30 +#define SYS_ioprio_get 31 +#define SYS_flock 32 +#define SYS_mknodat 33 +#define SYS_mkdirat 34 +#define SYS_unlinkat 35 +#define SYS_symlinkat 36 +#define SYS_linkat 37 +#define SYS_umount2 39 +#define SYS_mount 40 +#define SYS_pivot_root 41 +#define SYS_nfsservctl 42 +#define SYS_fallocate 47 +#define SYS_faccessat 48 +#define SYS_chdir 49 +#define SYS_fchdir 50 +#define SYS_chroot 51 +#define SYS_fchmod 52 +#define SYS_fchmodat 53 +#define SYS_fchownat 54 +#define SYS_fchown 55 +#define SYS_openat 56 +#define SYS_close 57 +#define SYS_vhangup 58 +#define SYS_pipe2 59 +#define SYS_quotactl 60 +#define SYS_getdents64 61 +#define SYS_read 63 +#define SYS_write 64 +#define SYS_readv 65 +#define SYS_writev 66 +#define SYS_pread64 67 +#define SYS_pwrite64 68 +#define SYS_preadv 69 +#define SYS_pwritev 70 +#define SYS_pselect6 72 +#define SYS_ppoll 73 +#define SYS_signalfd4 74 +#define SYS_vmsplice 75 +#define SYS_splice 76 +#define SYS_tee 77 +#define SYS_readlinkat 78 +#define SYS_sync 81 +#define SYS_fsync 82 +#define SYS_fdatasync 83 +#define SYS_sync_file_range 84 +#define SYS_timerfd_create 85 +#define SYS_timerfd_settime 86 +#define SYS_timerfd_gettime 87 +#define SYS_utimensat 88 +#define SYS_acct 89 +#define SYS_capget 90 +#define SYS_capset 91 +#define SYS_personality 92 +#define SYS_exit 93 +#define SYS_exit_group 94 +#define SYS_waitid 95 +#define SYS_set_tid_address 96 +#define SYS_unshare 97 +#define SYS_futex 98 +#define SYS_set_robust_list 99 +#define SYS_get_robust_list 100 +#define SYS_nanosleep 101 +#define SYS_getitimer 102 +#define SYS_setitimer 103 +#define SYS_kexec_load 104 +#define SYS_init_module 105 +#define SYS_delete_module 106 +#define SYS_timer_create 107 +#define SYS_timer_gettime 108 +#define SYS_timer_getoverrun 109 +#define SYS_timer_settime 110 +#define SYS_timer_delete 111 +#define SYS_clock_settime 112 +#define SYS_clock_gettime 113 +#define SYS_clock_getres 114 +#define SYS_clock_nanosleep 115 +#define SYS_syslog 116 +#define SYS_ptrace 117 +#define SYS_sched_setparam 118 +#define SYS_sched_setscheduler 119 +#define SYS_sched_getscheduler 120 +#define SYS_sched_getparam 121 +#define SYS_sched_setaffinity 122 +#define SYS_sched_getaffinity 123 +#define SYS_sched_yield 124 +#define SYS_sched_get_priority_max 125 +#define SYS_sched_get_priority_min 126 +#define SYS_sched_rr_get_interval 127 +#define SYS_restart_syscall 128 +#define SYS_kill 129 +#define SYS_tkill 130 +#define SYS_tgkill 131 +#define SYS_sigaltstack 132 +#define SYS_rt_sigsuspend 133 +#define SYS_rt_sigaction 134 +#define SYS_rt_sigprocmask 135 +#define SYS_rt_sigpending 136 +#define SYS_rt_sigtimedwait 137 +#define SYS_rt_sigqueueinfo 138 +#define SYS_rt_sigreturn 139 +#define SYS_setpriority 140 +#define SYS_getpriority 141 +#define SYS_reboot 142 +#define SYS_setregid 143 +#define SYS_setgid 144 +#define SYS_setreuid 145 +#define SYS_setuid 146 +#define SYS_setresuid 147 +#define SYS_getresuid 148 +#define SYS_setresgid 149 +#define SYS_getresgid 150 +#define SYS_setfsuid 151 +#define SYS_setfsgid 152 +#define SYS_times 153 +#define SYS_setpgid 154 +#define SYS_getpgid 155 +#define SYS_getsid 156 +#define SYS_setsid 157 +#define SYS_getgroups 158 +#define SYS_setgroups 159 +#define SYS_uname 160 +#define SYS_sethostname 161 +#define SYS_setdomainname 162 +#define SYS_getrusage 165 +#define SYS_umask 166 +#define SYS_prctl 167 +#define SYS_getcpu 168 +#define SYS_gettimeofday 169 +#define SYS_settimeofday 170 +#define SYS_adjtimex 171 +#define SYS_getpid 172 +#define SYS_getppid 173 +#define SYS_getuid 174 +#define SYS_geteuid 175 +#define SYS_getgid 176 +#define SYS_getegid 177 +#define SYS_gettid 178 +#define SYS_sysinfo 179 +#define SYS_mq_open 180 +#define SYS_mq_unlink 181 +#define SYS_mq_timedsend 182 +#define SYS_mq_timedreceive 183 +#define SYS_mq_notify 184 +#define SYS_mq_getsetattr 185 +#define SYS_msgget 186 +#define SYS_msgctl 187 +#define SYS_msgrcv 188 +#define SYS_msgsnd 189 +#define SYS_semget 190 +#define SYS_semctl 191 +#define SYS_semtimedop 192 +#define SYS_semop 193 +#define SYS_shmget 194 +#define SYS_shmctl 195 +#define SYS_shmat 196 +#define SYS_shmdt 197 +#define SYS_socket 198 +#define SYS_socketpair 199 +#define SYS_bind 200 +#define SYS_listen 201 +#define SYS_accept 202 +#define SYS_connect 203 +#define SYS_getsockname 204 +#define SYS_getpeername 205 +#define SYS_sendto 206 +#define SYS_recvfrom 207 +#define SYS_setsockopt 208 +#define SYS_getsockopt 209 +#define SYS_shutdown 210 +#define SYS_sendmsg 211 +#define SYS_recvmsg 212 +#define SYS_readahead 213 +#define SYS_brk 214 +#define SYS_munmap 215 +#define SYS_mremap 216 +#define SYS_add_key 217 +#define SYS_request_key 218 +#define SYS_keyctl 219 +#define SYS_clone 220 +#define SYS_execve 221 +#define SYS_swapon 224 +#define SYS_swapoff 225 +#define SYS_mprotect 226 +#define SYS_msync 227 +#define SYS_mlock 228 +#define SYS_munlock 229 +#define SYS_mlockall 230 +#define SYS_munlockall 231 +#define SYS_mincore 232 +#define SYS_madvise 233 +#define SYS_remap_file_pages 234 +#define SYS_mbind 235 +#define SYS_get_mempolicy 236 +#define SYS_set_mempolicy 237 +#define SYS_migrate_pages 238 +#define SYS_move_pages 239 +#define SYS_rt_tgsigqueueinfo 240 +#define SYS_perf_event_open 241 +#define SYS_accept4 242 +#define SYS_recvmmsg 243 +#define SYS_arch_specific_syscall 244 +#define SYS_wait4 260 +#define SYS_prlimit64 261 +#define SYS_fanotify_init 262 +#define SYS_fanotify_mark 263 +#define SYS_name_to_handle_at 264 +#define SYS_open_by_handle_at 265 +#define SYS_clock_adjtime 266 +#define SYS_syncfs 267 +#define SYS_setns 268 +#define SYS_sendmmsg 269 +#define SYS_process_vm_readv 270 +#define SYS_process_vm_writev 271 +#define SYS_kcmp 272 +#define SYS_finit_module 273 +#define SYS_sched_setattr 274 +#define SYS_sched_getattr 275 +#define SYS_renameat2 276 +#define SYS_seccomp 277 +#define SYS_getrandom 278 +#define SYS_memfd_create 279 +#define SYS_bpf 280 +#define SYS_execveat 281 +#define SYS_userfaultfd 282 +#define SYS_membarrier 283 +#define SYS_mlock2 284 +#define SYS_copy_file_range 285 +#define SYS_preadv2 286 +#define SYS_pwritev2 287 +#define SYS_pkey_mprotect 288 +#define SYS_pkey_alloc 289 +#define SYS_pkey_free 290 +#define SYS_statx 291 +#define SYS_io_pgetevents 292 +#define SYS_rseq 293 +#define SYS_kexec_file_load 294 +#define SYS_pidfd_send_signal 424 +#define SYS_io_uring_setup 425 +#define SYS_io_uring_enter 426 +#define SYS_io_uring_register 427 +#define SYS_open_tree 428 +#define SYS_move_mount 429 +#define SYS_fsopen 430 +#define SYS_fsconfig 431 +#define SYS_fsmount 432 +#define SYS_fspick 433 +#define SYS_pidfd_open 434 +#define SYS_clone3 435 +#define SYS_close_range 436 +#define SYS_openat2 437 +#define SYS_pidfd_getfd 438 +#define SYS_faccessat2 439 +#define SYS_process_madvise 440 +#define SYS_epoll_pwait2 441 +#define SYS_mount_setattr 442 +#define SYS_quotactl_fd 443 +#define SYS_landlock_create_ruleset 444 +#define SYS_landlock_add_rule 445 +#define SYS_landlock_restrict_self 446 +#define SYS_process_mrelease 448 +#define SYS_futex_waitv 449 +#define SYS_set_mempolicy_home_node 450 +#define SYS_cachestat 451 +#define SYS_fchmodat2 452 +#define SYS_map_shadow_stack 453 +#define SYS_futex_wake 454 +#define SYS_futex_wait 455 +#define SYS_futex_requeue 456 +#define SYS_fcntl __NR3264_fcntl +#define SYS_statfs __NR3264_statfs +#define SYS_fstatfs __NR3264_fstatfs +#define SYS_truncate __NR3264_truncate +#define SYS_ftruncate __NR3264_ftruncate +#define SYS_lseek __NR3264_lseek +#define SYS_sendfile __NR3264_sendfile +#define SYS_mmap __NR3264_mmap +#define SYS_fadvise64 __NR3264_fadvise64 \ No newline at end of file diff --git a/zig/lib/libc/include/loongarch64-linux-musl/bits/user.h b/zig/lib/libc/include/loongarch64-linux-musl/bits/user.h new file mode 100644 index 0000000000..a5ad31f301 --- /dev/null +++ b/zig/lib/libc/include/loongarch64-linux-musl/bits/user.h @@ -0,0 +1,24 @@ +#define ELF_NGREG 45 +#define ELF_NFPREG 34 + +struct user_regs_struct { + unsigned long regs[32]; + unsigned long orig_a0; + unsigned long csr_era; + unsigned long csr_badv; + unsigned long reserved[10]; +}; + +struct user_fp_struct { + unsigned long fpr[32]; + unsigned long fcc; + unsigned int fcsr; +}; + +typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG]; + +typedef union { + double d; + float f; +} elf_fpreg_t; +typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; \ No newline at end of file diff --git a/zig/lib/libc/include/m68k-linux-gnu/bits/struct_rwlock.h b/zig/lib/libc/include/m68k-linux-gnu/bits/struct_rwlock.h deleted file mode 100644 index 91b0a3b012..0000000000 --- a/zig/lib/libc/include/m68k-linux-gnu/bits/struct_rwlock.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Default read-write lock implementation struct definitions. - Copyright (C) 2019-2023 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifndef __RWLOCK_INTERNAL_H -#define __RWLOCK_INTERNAL_H - -#include - -/* Generic struct for both POSIX read-write lock. New ports are expected - to use the default layout, however archictetures can redefine it to add - arch-specific extensions (such as lock-elision). The struct have a size - of 32 bytes on both LP32 and LP64 architectures. */ - -struct __pthread_rwlock_arch_t -{ - unsigned int __readers; - unsigned int __writers; - unsigned int __wrphase_futex; - unsigned int __writers_futex; - unsigned int __pad3; - unsigned int __pad4; - /* FLAGS must stay at its position in the structure to maintain - binary compatibility. */ -#if __BYTE_ORDER == __BIG_ENDIAN - unsigned char __pad1; - unsigned char __pad2; - unsigned char __shared; - unsigned char __flags; -#else - unsigned char __flags; - unsigned char __shared; - unsigned char __pad1; - unsigned char __pad2; -#endif - int __cur_writer; -}; - -#if __BYTE_ORDER == __BIG_ENDIAN -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 -#else -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ - 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 -#endif - -#endif \ No newline at end of file diff --git a/zig/lib/libc/include/m68k-linux-musl/bits/syscall.h b/zig/lib/libc/include/m68k-linux-musl/bits/syscall.h index b6b94a1fe5..89888dc31b 100644 --- a/zig/lib/libc/include/m68k-linux-musl/bits/syscall.h +++ b/zig/lib/libc/include/m68k-linux-musl/bits/syscall.h @@ -416,6 +416,11 @@ #define __NR_landlock_create_ruleset 444 #define __NR_landlock_add_rule 445 #define __NR_landlock_restrict_self 446 +#define __NR_process_mrelease 448 +#define __NR_futex_waitv 449 +#define __NR_set_mempolicy_home_node 450 +#define __NR_cachestat 451 +#define __NR_fchmodat2 452 #define SYS_restart_syscall 0 #define SYS_exit 1 #define SYS_fork 2 @@ -833,4 +838,9 @@ #define SYS_mount_setattr 442 #define SYS_landlock_create_ruleset 444 #define SYS_landlock_add_rule 445 -#define SYS_landlock_restrict_self 446 \ No newline at end of file +#define SYS_landlock_restrict_self 446 +#define SYS_process_mrelease 448 +#define SYS_futex_waitv 449 +#define SYS_set_mempolicy_home_node 450 +#define SYS_cachestat 451 +#define SYS_fchmodat2 452 \ No newline at end of file diff --git a/zig/lib/libc/include/arm-linux-gnueabi/bits/struct_rwlock.h b/zig/lib/libc/include/mips-linux-gnueabi/bits/struct_rwlock.h similarity index 64% rename from zig/lib/libc/include/arm-linux-gnueabi/bits/struct_rwlock.h rename to zig/lib/libc/include/mips-linux-gnueabi/bits/struct_rwlock.h index 91b0a3b012..1de6d9250c 100644 --- a/zig/lib/libc/include/arm-linux-gnueabi/bits/struct_rwlock.h +++ b/zig/lib/libc/include/mips-linux-gnueabi/bits/struct_rwlock.h @@ -1,4 +1,4 @@ -/* Default read-write lock implementation struct definitions. +/* MIPS internal rwlock struct definitions. Copyright (C) 2019-2023 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -16,15 +16,8 @@ License along with the GNU C Library; if not, see . */ -#ifndef __RWLOCK_INTERNAL_H -#define __RWLOCK_INTERNAL_H - -#include - -/* Generic struct for both POSIX read-write lock. New ports are expected - to use the default layout, however archictetures can redefine it to add - arch-specific extensions (such as lock-elision). The struct have a size - of 32 bytes on both LP32 and LP64 architectures. */ +#ifndef _RWLOCK_INTERNAL_H +#define _RWLOCK_INTERNAL_H struct __pthread_rwlock_arch_t { @@ -34,28 +27,45 @@ struct __pthread_rwlock_arch_t unsigned int __writers_futex; unsigned int __pad3; unsigned int __pad4; - /* FLAGS must stay at its position in the structure to maintain +#if _MIPS_SIM == _ABI64 + int __cur_writer; + int __shared; + unsigned long int __pad1; + unsigned long int __pad2; + /* FLAGS must stay at this position in the structure to maintain binary compatibility. */ -#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int __flags; +# else +# if __BYTE_ORDER == __BIG_ENDIAN unsigned char __pad1; unsigned char __pad2; unsigned char __shared; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ unsigned char __flags; -#else +# else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ unsigned char __flags; unsigned char __shared; unsigned char __pad1; unsigned char __pad2; -#endif +# endif int __cur_writer; +#endif }; -#if __BYTE_ORDER == __BIG_ENDIAN +#if _MIPS_SIM == _ABI64 # define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags #else -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ +# if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 +# else +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 +# endif #endif #endif \ No newline at end of file diff --git a/zig/lib/libc/include/arm-linux-gnueabihf/bits/struct_rwlock.h b/zig/lib/libc/include/mips-linux-gnueabihf/bits/struct_rwlock.h similarity index 64% rename from zig/lib/libc/include/arm-linux-gnueabihf/bits/struct_rwlock.h rename to zig/lib/libc/include/mips-linux-gnueabihf/bits/struct_rwlock.h index 91b0a3b012..1de6d9250c 100644 --- a/zig/lib/libc/include/arm-linux-gnueabihf/bits/struct_rwlock.h +++ b/zig/lib/libc/include/mips-linux-gnueabihf/bits/struct_rwlock.h @@ -1,4 +1,4 @@ -/* Default read-write lock implementation struct definitions. +/* MIPS internal rwlock struct definitions. Copyright (C) 2019-2023 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -16,15 +16,8 @@ License along with the GNU C Library; if not, see . */ -#ifndef __RWLOCK_INTERNAL_H -#define __RWLOCK_INTERNAL_H - -#include - -/* Generic struct for both POSIX read-write lock. New ports are expected - to use the default layout, however archictetures can redefine it to add - arch-specific extensions (such as lock-elision). The struct have a size - of 32 bytes on both LP32 and LP64 architectures. */ +#ifndef _RWLOCK_INTERNAL_H +#define _RWLOCK_INTERNAL_H struct __pthread_rwlock_arch_t { @@ -34,28 +27,45 @@ struct __pthread_rwlock_arch_t unsigned int __writers_futex; unsigned int __pad3; unsigned int __pad4; - /* FLAGS must stay at its position in the structure to maintain +#if _MIPS_SIM == _ABI64 + int __cur_writer; + int __shared; + unsigned long int __pad1; + unsigned long int __pad2; + /* FLAGS must stay at this position in the structure to maintain binary compatibility. */ -#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int __flags; +# else +# if __BYTE_ORDER == __BIG_ENDIAN unsigned char __pad1; unsigned char __pad2; unsigned char __shared; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ unsigned char __flags; -#else +# else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ unsigned char __flags; unsigned char __shared; unsigned char __pad1; unsigned char __pad2; -#endif +# endif int __cur_writer; +#endif }; -#if __BYTE_ORDER == __BIG_ENDIAN +#if _MIPS_SIM == _ABI64 # define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags #else -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ +# if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 +# else +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 +# endif #endif #endif \ No newline at end of file diff --git a/zig/lib/libc/include/mips-linux-musl/bits/float.h b/zig/lib/libc/include/mips-linux-musl/bits/float.h new file mode 100644 index 0000000000..7523476b4f --- /dev/null +++ b/zig/lib/libc/include/mips-linux-musl/bits/float.h @@ -0,0 +1,16 @@ +#define FLT_EVAL_METHOD 0 + +#define LDBL_TRUE_MIN 4.94065645841246544177e-324L +#define LDBL_MIN 2.22507385850720138309e-308L +#define LDBL_MAX 1.79769313486231570815e+308L +#define LDBL_EPSILON 2.22044604925031308085e-16L + +#define LDBL_MANT_DIG 53 +#define LDBL_MIN_EXP (-1021) +#define LDBL_MAX_EXP 1024 + +#define LDBL_DIG 15 +#define LDBL_MIN_10_EXP (-307) +#define LDBL_MAX_10_EXP 308 + +#define DECIMAL_DIG 17 \ No newline at end of file diff --git a/zig/lib/libc/include/mips-linux-musl/bits/syscall.h b/zig/lib/libc/include/mips-linux-musl/bits/syscall.h index fffb6b9ce3..968aeabd4e 100644 --- a/zig/lib/libc/include/mips-linux-musl/bits/syscall.h +++ b/zig/lib/libc/include/mips-linux-musl/bits/syscall.h @@ -418,6 +418,11 @@ #define __NR_landlock_create_ruleset 4444 #define __NR_landlock_add_rule 4445 #define __NR_landlock_restrict_self 4446 +#define __NR_process_mrelease 4448 +#define __NR_futex_waitv 4449 +#define __NR_set_mempolicy_home_node 4450 +#define __NR_cachestat 4451 +#define __NR_fchmodat2 4452 #define SYS_syscall 4000 #define SYS_exit 4001 @@ -838,4 +843,9 @@ #define SYS_mount_setattr 4442 #define SYS_landlock_create_ruleset 4444 #define SYS_landlock_add_rule 4445 -#define SYS_landlock_restrict_self 4446 \ No newline at end of file +#define SYS_landlock_restrict_self 4446 +#define SYS_process_mrelease 4448 +#define SYS_futex_waitv 4449 +#define SYS_set_mempolicy_home_node 4450 +#define SYS_cachestat 4451 +#define SYS_fchmodat2 4452 \ No newline at end of file diff --git a/zig/lib/libc/include/armeb-linux-gnueabi/bits/struct_rwlock.h b/zig/lib/libc/include/mips64-linux-gnuabi64/bits/struct_rwlock.h similarity index 64% rename from zig/lib/libc/include/armeb-linux-gnueabi/bits/struct_rwlock.h rename to zig/lib/libc/include/mips64-linux-gnuabi64/bits/struct_rwlock.h index 91b0a3b012..1de6d9250c 100644 --- a/zig/lib/libc/include/armeb-linux-gnueabi/bits/struct_rwlock.h +++ b/zig/lib/libc/include/mips64-linux-gnuabi64/bits/struct_rwlock.h @@ -1,4 +1,4 @@ -/* Default read-write lock implementation struct definitions. +/* MIPS internal rwlock struct definitions. Copyright (C) 2019-2023 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -16,15 +16,8 @@ License along with the GNU C Library; if not, see . */ -#ifndef __RWLOCK_INTERNAL_H -#define __RWLOCK_INTERNAL_H - -#include - -/* Generic struct for both POSIX read-write lock. New ports are expected - to use the default layout, however archictetures can redefine it to add - arch-specific extensions (such as lock-elision). The struct have a size - of 32 bytes on both LP32 and LP64 architectures. */ +#ifndef _RWLOCK_INTERNAL_H +#define _RWLOCK_INTERNAL_H struct __pthread_rwlock_arch_t { @@ -34,28 +27,45 @@ struct __pthread_rwlock_arch_t unsigned int __writers_futex; unsigned int __pad3; unsigned int __pad4; - /* FLAGS must stay at its position in the structure to maintain +#if _MIPS_SIM == _ABI64 + int __cur_writer; + int __shared; + unsigned long int __pad1; + unsigned long int __pad2; + /* FLAGS must stay at this position in the structure to maintain binary compatibility. */ -#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int __flags; +# else +# if __BYTE_ORDER == __BIG_ENDIAN unsigned char __pad1; unsigned char __pad2; unsigned char __shared; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ unsigned char __flags; -#else +# else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ unsigned char __flags; unsigned char __shared; unsigned char __pad1; unsigned char __pad2; -#endif +# endif int __cur_writer; +#endif }; -#if __BYTE_ORDER == __BIG_ENDIAN +#if _MIPS_SIM == _ABI64 # define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags #else -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ +# if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 +# else +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 +# endif #endif #endif \ No newline at end of file diff --git a/zig/lib/libc/include/armeb-linux-gnueabihf/bits/struct_rwlock.h b/zig/lib/libc/include/mips64-linux-gnuabin32/bits/struct_rwlock.h similarity index 64% rename from zig/lib/libc/include/armeb-linux-gnueabihf/bits/struct_rwlock.h rename to zig/lib/libc/include/mips64-linux-gnuabin32/bits/struct_rwlock.h index 91b0a3b012..1de6d9250c 100644 --- a/zig/lib/libc/include/armeb-linux-gnueabihf/bits/struct_rwlock.h +++ b/zig/lib/libc/include/mips64-linux-gnuabin32/bits/struct_rwlock.h @@ -1,4 +1,4 @@ -/* Default read-write lock implementation struct definitions. +/* MIPS internal rwlock struct definitions. Copyright (C) 2019-2023 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -16,15 +16,8 @@ License along with the GNU C Library; if not, see . */ -#ifndef __RWLOCK_INTERNAL_H -#define __RWLOCK_INTERNAL_H - -#include - -/* Generic struct for both POSIX read-write lock. New ports are expected - to use the default layout, however archictetures can redefine it to add - arch-specific extensions (such as lock-elision). The struct have a size - of 32 bytes on both LP32 and LP64 architectures. */ +#ifndef _RWLOCK_INTERNAL_H +#define _RWLOCK_INTERNAL_H struct __pthread_rwlock_arch_t { @@ -34,28 +27,45 @@ struct __pthread_rwlock_arch_t unsigned int __writers_futex; unsigned int __pad3; unsigned int __pad4; - /* FLAGS must stay at its position in the structure to maintain +#if _MIPS_SIM == _ABI64 + int __cur_writer; + int __shared; + unsigned long int __pad1; + unsigned long int __pad2; + /* FLAGS must stay at this position in the structure to maintain binary compatibility. */ -#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int __flags; +# else +# if __BYTE_ORDER == __BIG_ENDIAN unsigned char __pad1; unsigned char __pad2; unsigned char __shared; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ unsigned char __flags; -#else +# else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ unsigned char __flags; unsigned char __shared; unsigned char __pad1; unsigned char __pad2; -#endif +# endif int __cur_writer; +#endif }; -#if __BYTE_ORDER == __BIG_ENDIAN +#if _MIPS_SIM == _ABI64 # define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags #else -# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ +# if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 +# else +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 +# endif #endif #endif \ No newline at end of file diff --git a/zig/lib/libc/include/mips64-linux-musl/bits/syscall.h b/zig/lib/libc/include/mips64-linux-musl/bits/syscall.h index 30803a8e15..b1f66b34a2 100644 --- a/zig/lib/libc/include/mips64-linux-musl/bits/syscall.h +++ b/zig/lib/libc/include/mips64-linux-musl/bits/syscall.h @@ -348,6 +348,11 @@ #define __NR_landlock_create_ruleset 5444 #define __NR_landlock_add_rule 5445 #define __NR_landlock_restrict_self 5446 +#define __NR_process_mrelease 5448 +#define __NR_futex_waitv 5449 +#define __NR_set_mempolicy_home_node 5450 +#define __NR_cachestat 5451 +#define __NR_fchmodat2 5452 #define SYS_read 5000 #define SYS_write 5001 @@ -698,4 +703,9 @@ #define SYS_mount_setattr 5442 #define SYS_landlock_create_ruleset 5444 #define SYS_landlock_add_rule 5445 -#define SYS_landlock_restrict_self 5446 \ No newline at end of file +#define SYS_landlock_restrict_self 5446 +#define SYS_process_mrelease 5448 +#define SYS_futex_waitv 5449 +#define SYS_set_mempolicy_home_node 5450 +#define SYS_cachestat 5451 +#define SYS_fchmodat2 5452 \ No newline at end of file diff --git a/zig/lib/libc/include/mips64el-linux-gnuabi64/bits/struct_rwlock.h b/zig/lib/libc/include/mips64el-linux-gnuabi64/bits/struct_rwlock.h new file mode 100644 index 0000000000..1de6d9250c --- /dev/null +++ b/zig/lib/libc/include/mips64el-linux-gnuabi64/bits/struct_rwlock.h @@ -0,0 +1,71 @@ +/* MIPS internal rwlock struct definitions. + Copyright (C) 2019-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _RWLOCK_INTERNAL_H +#define _RWLOCK_INTERNAL_H + +struct __pthread_rwlock_arch_t +{ + unsigned int __readers; + unsigned int __writers; + unsigned int __wrphase_futex; + unsigned int __writers_futex; + unsigned int __pad3; + unsigned int __pad4; +#if _MIPS_SIM == _ABI64 + int __cur_writer; + int __shared; + unsigned long int __pad1; + unsigned long int __pad2; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned int __flags; +# else +# if __BYTE_ORDER == __BIG_ENDIAN + unsigned char __pad1; + unsigned char __pad2; + unsigned char __shared; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; +# else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; + unsigned char __shared; + unsigned char __pad1; + unsigned char __pad2; +# endif + int __cur_writer; +#endif +}; + +#if _MIPS_SIM == _ABI64 +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags +#else +# if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 +# else +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 +# endif +#endif + +#endif \ No newline at end of file diff --git a/zig/lib/libc/include/mips64el-linux-gnuabin32/bits/struct_rwlock.h b/zig/lib/libc/include/mips64el-linux-gnuabin32/bits/struct_rwlock.h new file mode 100644 index 0000000000..1de6d9250c --- /dev/null +++ b/zig/lib/libc/include/mips64el-linux-gnuabin32/bits/struct_rwlock.h @@ -0,0 +1,71 @@ +/* MIPS internal rwlock struct definitions. + Copyright (C) 2019-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _RWLOCK_INTERNAL_H +#define _RWLOCK_INTERNAL_H + +struct __pthread_rwlock_arch_t +{ + unsigned int __readers; + unsigned int __writers; + unsigned int __wrphase_futex; + unsigned int __writers_futex; + unsigned int __pad3; + unsigned int __pad4; +#if _MIPS_SIM == _ABI64 + int __cur_writer; + int __shared; + unsigned long int __pad1; + unsigned long int __pad2; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned int __flags; +# else +# if __BYTE_ORDER == __BIG_ENDIAN + unsigned char __pad1; + unsigned char __pad2; + unsigned char __shared; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; +# else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; + unsigned char __shared; + unsigned char __pad1; + unsigned char __pad2; +# endif + int __cur_writer; +#endif +}; + +#if _MIPS_SIM == _ABI64 +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags +#else +# if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 +# else +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 +# endif +#endif + +#endif \ No newline at end of file diff --git a/zig/lib/libc/include/mipsel-linux-gnueabi/bits/struct_rwlock.h b/zig/lib/libc/include/mipsel-linux-gnueabi/bits/struct_rwlock.h new file mode 100644 index 0000000000..1de6d9250c --- /dev/null +++ b/zig/lib/libc/include/mipsel-linux-gnueabi/bits/struct_rwlock.h @@ -0,0 +1,71 @@ +/* MIPS internal rwlock struct definitions. + Copyright (C) 2019-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _RWLOCK_INTERNAL_H +#define _RWLOCK_INTERNAL_H + +struct __pthread_rwlock_arch_t +{ + unsigned int __readers; + unsigned int __writers; + unsigned int __wrphase_futex; + unsigned int __writers_futex; + unsigned int __pad3; + unsigned int __pad4; +#if _MIPS_SIM == _ABI64 + int __cur_writer; + int __shared; + unsigned long int __pad1; + unsigned long int __pad2; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned int __flags; +# else +# if __BYTE_ORDER == __BIG_ENDIAN + unsigned char __pad1; + unsigned char __pad2; + unsigned char __shared; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; +# else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; + unsigned char __shared; + unsigned char __pad1; + unsigned char __pad2; +# endif + int __cur_writer; +#endif +}; + +#if _MIPS_SIM == _ABI64 +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags +#else +# if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 +# else +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 +# endif +#endif + +#endif \ No newline at end of file diff --git a/zig/lib/libc/include/mipsel-linux-gnueabihf/bits/struct_rwlock.h b/zig/lib/libc/include/mipsel-linux-gnueabihf/bits/struct_rwlock.h new file mode 100644 index 0000000000..1de6d9250c --- /dev/null +++ b/zig/lib/libc/include/mipsel-linux-gnueabihf/bits/struct_rwlock.h @@ -0,0 +1,71 @@ +/* MIPS internal rwlock struct definitions. + Copyright (C) 2019-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _RWLOCK_INTERNAL_H +#define _RWLOCK_INTERNAL_H + +struct __pthread_rwlock_arch_t +{ + unsigned int __readers; + unsigned int __writers; + unsigned int __wrphase_futex; + unsigned int __writers_futex; + unsigned int __pad3; + unsigned int __pad4; +#if _MIPS_SIM == _ABI64 + int __cur_writer; + int __shared; + unsigned long int __pad1; + unsigned long int __pad2; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned int __flags; +# else +# if __BYTE_ORDER == __BIG_ENDIAN + unsigned char __pad1; + unsigned char __pad2; + unsigned char __shared; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; +# else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; + unsigned char __shared; + unsigned char __pad1; + unsigned char __pad2; +# endif + int __cur_writer; +#endif +}; + +#if _MIPS_SIM == _ABI64 +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags +#else +# if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags, 0 +# else +# define __PTHREAD_RWLOCK_INITIALIZER(__flags) \ + 0, 0, 0, 0, 0, 0, __flags, 0, 0, 0, 0 +# endif +#endif + +#endif \ No newline at end of file diff --git a/zig/lib/libc/include/powerpc-linux-musl/bits/float.h b/zig/lib/libc/include/powerpc-linux-musl/bits/float.h new file mode 100644 index 0000000000..7523476b4f --- /dev/null +++ b/zig/lib/libc/include/powerpc-linux-musl/bits/float.h @@ -0,0 +1,16 @@ +#define FLT_EVAL_METHOD 0 + +#define LDBL_TRUE_MIN 4.94065645841246544177e-324L +#define LDBL_MIN 2.22507385850720138309e-308L +#define LDBL_MAX 1.79769313486231570815e+308L +#define LDBL_EPSILON 2.22044604925031308085e-16L + +#define LDBL_MANT_DIG 53 +#define LDBL_MIN_EXP (-1021) +#define LDBL_MAX_EXP 1024 + +#define LDBL_DIG 15 +#define LDBL_MIN_10_EXP (-307) +#define LDBL_MAX_10_EXP 308 + +#define DECIMAL_DIG 17 \ No newline at end of file diff --git a/zig/lib/libc/include/powerpc-linux-musl/bits/syscall.h b/zig/lib/libc/include/powerpc-linux-musl/bits/syscall.h index a309456d00..0597a86530 100644 --- a/zig/lib/libc/include/powerpc-linux-musl/bits/syscall.h +++ b/zig/lib/libc/include/powerpc-linux-musl/bits/syscall.h @@ -425,6 +425,11 @@ #define __NR_landlock_create_ruleset 444 #define __NR_landlock_add_rule 445 #define __NR_landlock_restrict_self 446 +#define __NR_process_mrelease 448 +#define __NR_futex_waitv 449 +#define __NR_set_mempolicy_home_node 450 +#define __NR_cachestat 451 +#define __NR_fchmodat2 452 #define SYS_restart_syscall 0 #define SYS_exit 1 @@ -852,4 +857,9 @@ #define SYS_mount_setattr 442 #define SYS_landlock_create_ruleset 444 #define SYS_landlock_add_rule 445 -#define SYS_landlock_restrict_self 446 \ No newline at end of file +#define SYS_landlock_restrict_self 446 +#define SYS_process_mrelease 448 +#define SYS_futex_waitv 449 +#define SYS_set_mempolicy_home_node 450 +#define SYS_cachestat 451 +#define SYS_fchmodat2 452 \ No newline at end of file diff --git a/zig/lib/libc/include/powerpc64-linux-musl/bits/float.h b/zig/lib/libc/include/powerpc64-linux-musl/bits/float.h new file mode 100644 index 0000000000..7523476b4f --- /dev/null +++ b/zig/lib/libc/include/powerpc64-linux-musl/bits/float.h @@ -0,0 +1,16 @@ +#define FLT_EVAL_METHOD 0 + +#define LDBL_TRUE_MIN 4.94065645841246544177e-324L +#define LDBL_MIN 2.22507385850720138309e-308L +#define LDBL_MAX 1.79769313486231570815e+308L +#define LDBL_EPSILON 2.22044604925031308085e-16L + +#define LDBL_MANT_DIG 53 +#define LDBL_MIN_EXP (-1021) +#define LDBL_MAX_EXP 1024 + +#define LDBL_DIG 15 +#define LDBL_MIN_10_EXP (-307) +#define LDBL_MAX_10_EXP 308 + +#define DECIMAL_DIG 17 \ No newline at end of file diff --git a/zig/lib/libc/include/powerpc64-linux-musl/bits/syscall.h b/zig/lib/libc/include/powerpc64-linux-musl/bits/syscall.h index 4e7c41165b..0a904333aa 100644 --- a/zig/lib/libc/include/powerpc64-linux-musl/bits/syscall.h +++ b/zig/lib/libc/include/powerpc64-linux-musl/bits/syscall.h @@ -397,6 +397,11 @@ #define __NR_landlock_create_ruleset 444 #define __NR_landlock_add_rule 445 #define __NR_landlock_restrict_self 446 +#define __NR_process_mrelease 448 +#define __NR_futex_waitv 449 +#define __NR_set_mempolicy_home_node 450 +#define __NR_cachestat 451 +#define __NR_fchmodat2 452 #define SYS_restart_syscall 0 #define SYS_exit 1 @@ -796,4 +801,9 @@ #define SYS_mount_setattr 442 #define SYS_landlock_create_ruleset 444 #define SYS_landlock_add_rule 445 -#define SYS_landlock_restrict_self 446 \ No newline at end of file +#define SYS_landlock_restrict_self 446 +#define SYS_process_mrelease 448 +#define SYS_futex_waitv 449 +#define SYS_set_mempolicy_home_node 450 +#define SYS_cachestat 451 +#define SYS_fchmodat2 452 \ No newline at end of file diff --git a/zig/lib/libc/include/riscv64-linux-musl/bits/signal.h b/zig/lib/libc/include/riscv64-linux-musl/bits/signal.h index 01861df671..bd8e3ffce4 100644 --- a/zig/lib/libc/include/riscv64-linux-musl/bits/signal.h +++ b/zig/lib/libc/include/riscv64-linux-musl/bits/signal.h @@ -41,7 +41,9 @@ typedef struct mcontext_t { #define REG_SP 2 #define REG_TP 4 #define REG_S0 8 +#define REG_S1 9 #define REG_A0 10 +#define REG_S2 18 #endif #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) diff --git a/zig/lib/libc/include/riscv64-linux-musl/bits/syscall.h b/zig/lib/libc/include/riscv64-linux-musl/bits/syscall.h index a19c2a5806..63c6dd8006 100644 --- a/zig/lib/libc/include/riscv64-linux-musl/bits/syscall.h +++ b/zig/lib/libc/include/riscv64-linux-musl/bits/syscall.h @@ -299,6 +299,11 @@ #define __NR_landlock_create_ruleset 444 #define __NR_landlock_add_rule 445 #define __NR_landlock_restrict_self 446 +#define __NR_process_mrelease 448 +#define __NR_futex_waitv 449 +#define __NR_set_mempolicy_home_node 450 +#define __NR_cachestat 451 +#define __NR_fchmodat2 452 #define __NR_sysriscv __NR_arch_specific_syscall #define __NR_riscv_flush_icache (__NR_sysriscv + 15) @@ -603,5 +608,10 @@ #define SYS_landlock_create_ruleset 444 #define SYS_landlock_add_rule 445 #define SYS_landlock_restrict_self 446 +#define SYS_process_mrelease 448 +#define SYS_futex_waitv 449 +#define SYS_set_mempolicy_home_node 450 +#define SYS_cachestat 451 +#define SYS_fchmodat2 452 #define SYS_sysriscv __NR_arch_specific_syscall #define SYS_riscv_flush_icache (__NR_sysriscv + 15) \ No newline at end of file diff --git a/zig/lib/libc/include/s390x-linux-musl/bits/syscall.h b/zig/lib/libc/include/s390x-linux-musl/bits/syscall.h index 90e978a74b..7e26564bda 100644 --- a/zig/lib/libc/include/s390x-linux-musl/bits/syscall.h +++ b/zig/lib/libc/include/s390x-linux-musl/bits/syscall.h @@ -362,6 +362,12 @@ #define __NR_landlock_create_ruleset 444 #define __NR_landlock_add_rule 445 #define __NR_landlock_restrict_self 446 +#define __NR_memfd_secret 447 +#define __NR_process_mrelease 448 +#define __NR_futex_waitv 449 +#define __NR_set_mempolicy_home_node 450 +#define __NR_cachestat 451 +#define __NR_fchmodat2 452 #define SYS_exit 1 #define SYS_fork 2 @@ -726,4 +732,10 @@ #define SYS_mount_setattr 442 #define SYS_landlock_create_ruleset 444 #define SYS_landlock_add_rule 445 -#define SYS_landlock_restrict_self 446 \ No newline at end of file +#define SYS_landlock_restrict_self 446 +#define SYS_memfd_secret 447 +#define SYS_process_mrelease 448 +#define SYS_futex_waitv 449 +#define SYS_set_mempolicy_home_node 450 +#define SYS_cachestat 451 +#define SYS_fchmodat2 452 \ No newline at end of file diff --git a/zig/lib/libc/include/x86-linux-musl/bits/syscall.h b/zig/lib/libc/include/x86-linux-musl/bits/syscall.h index 37130cf3f0..66f529038d 100644 --- a/zig/lib/libc/include/x86-linux-musl/bits/syscall.h +++ b/zig/lib/libc/include/x86-linux-musl/bits/syscall.h @@ -436,6 +436,12 @@ #define __NR_landlock_create_ruleset 444 #define __NR_landlock_add_rule 445 #define __NR_landlock_restrict_self 446 +#define __NR_memfd_secret 447 +#define __NR_process_mrelease 448 +#define __NR_futex_waitv 449 +#define __NR_set_mempolicy_home_node 450 +#define __NR_cachestat 451 +#define __NR_fchmodat2 452 #define SYS_restart_syscall 0 #define SYS_exit 1 @@ -872,4 +878,10 @@ #define SYS_mount_setattr 442 #define SYS_landlock_create_ruleset 444 #define SYS_landlock_add_rule 445 -#define SYS_landlock_restrict_self 446 \ No newline at end of file +#define SYS_landlock_restrict_self 446 +#define SYS_memfd_secret 447 +#define SYS_process_mrelease 448 +#define SYS_futex_waitv 449 +#define SYS_set_mempolicy_home_node 450 +#define SYS_cachestat 451 +#define SYS_fchmodat2 452 \ No newline at end of file diff --git a/zig/lib/libc/include/x86_64-linux-musl/bits/syscall.h b/zig/lib/libc/include/x86_64-linux-musl/bits/syscall.h index f9dbc02026..1aaf4efc79 100644 --- a/zig/lib/libc/include/x86_64-linux-musl/bits/syscall.h +++ b/zig/lib/libc/include/x86_64-linux-musl/bits/syscall.h @@ -355,6 +355,12 @@ #define __NR_landlock_create_ruleset 444 #define __NR_landlock_add_rule 445 #define __NR_landlock_restrict_self 446 +#define __NR_memfd_secret 447 +#define __NR_process_mrelease 448 +#define __NR_futex_waitv 449 +#define __NR_set_mempolicy_home_node 450 +#define __NR_cachestat 451 +#define __NR_fchmodat2 452 #define SYS_read 0 #define SYS_write 1 @@ -712,4 +718,10 @@ #define SYS_mount_setattr 442 #define SYS_landlock_create_ruleset 444 #define SYS_landlock_add_rule 445 -#define SYS_landlock_restrict_self 446 \ No newline at end of file +#define SYS_landlock_restrict_self 446 +#define SYS_memfd_secret 447 +#define SYS_process_mrelease 448 +#define SYS_futex_waitv 449 +#define SYS_set_mempolicy_home_node 450 +#define SYS_cachestat 451 +#define SYS_fchmodat2 452 \ No newline at end of file diff --git a/zig/lib/std/Target.zig b/zig/lib/std/Target.zig index f8ce63b37f..d5c0e53506 100644 --- a/zig/lib/std/Target.zig +++ b/zig/lib/std/Target.zig @@ -91,10 +91,10 @@ pub const Os = struct { } } - pub fn defaultVersionRange(tag: Tag, arch: Cpu.Arch) Os { + pub fn defaultVersionRange(tag: Tag) Os { return .{ .tag = tag, - .version_range = VersionRange.default(tag, arch), + .version_range = VersionRange.default(tag), }; } }; @@ -238,7 +238,7 @@ pub const Os = struct { /// The default `VersionRange` represents the range that the Zig Standard Library /// bases its abstractions on. - pub fn default(tag: Tag, arch: Cpu.Arch) VersionRange { + pub fn default(tag: Tag) VersionRange { switch (tag) { .freestanding, .ananas, @@ -283,20 +283,11 @@ pub const Os = struct { .max = .{ .major = 14, .minor = 0, .patch = 0 }, }, }, - .macos => return switch (arch) { - .aarch64 => VersionRange{ - .semver = .{ - .min = .{ .major = 11, .minor = 7, .patch = 1 }, - .max = .{ .major = 14, .minor = 1, .patch = 0 }, - }, - }, - .x86_64 => VersionRange{ - .semver = .{ - .min = .{ .major = 11, .minor = 7, .patch = 1 }, - .max = .{ .major = 14, .minor = 1, .patch = 0 }, - }, + .macos => return .{ + .semver = .{ + .min = .{ .major = 11, .minor = 7, .patch = 1 }, + .max = .{ .major = 14, .minor = 1, .patch = 0 }, }, - else => unreachable, }, .ios => return .{ .semver = .{ @@ -345,9 +336,9 @@ pub const Os = struct { .linux = .{ .range = .{ .min = .{ .major = 4, .minor = 19, .patch = 0 }, - .max = .{ .major = 6, .minor = 5, .patch = 7 }, + .max = .{ .major = 6, .minor = 7, .patch = 5 }, }, - .glibc = .{ .major = 2, .minor = 28, .patch = 0 }, + .glibc = .{ .major = 2, .minor = 38, .patch = 0 }, }, }, @@ -529,6 +520,10 @@ pub const Abi = enum { if (arch.isWasm()) { return .musl; } + if (arch.isLoongArch()) { + // FIXME: loongarch does not have musl support yet + return .gnu; + } switch (target_os.tag) { .freestanding, .ananas, @@ -1002,6 +997,13 @@ pub const Cpu = struct { }; } + pub inline fn isLoongArch(arch: Arch) bool { + return switch (arch) { + .loongarch32, .loongarch64 => true, + else => false, + }; + } + pub fn parseCpuModel(arch: Arch, cpu_name: []const u8) !*const Cpu.Model { for (arch.allCpuModels()) |cpu| { if (std.mem.eql(u8, cpu_name, cpu.name)) { @@ -1071,8 +1073,8 @@ pub const Cpu = struct { .spu_2 => .SPU_2, .spirv32 => .NONE, .spirv64 => .NONE, - .loongarch32 => .NONE, - .loongarch64 => .NONE, + .loongarch32 => .LOONGARCH, + .loongarch64 => .LOONGARCH, }; } @@ -1136,8 +1138,8 @@ pub const Cpu = struct { .spu_2 => .Unknown, .spirv32 => .Unknown, .spirv64 => .Unknown, - .loongarch32 => .Unknown, - .loongarch64 => .Unknown, + .loongarch32 => .LOONGARCH32, + .loongarch64 => .LOONGARCH64, }; } @@ -1381,6 +1383,7 @@ pub const Cpu = struct { .x86 => &x86.cpu.pentium4, .nvptx, .nvptx64 => &nvptx.cpu.sm_20, .sparc, .sparcel => &sparc.cpu.v8, + .loongarch64 => &loongarch.cpu.loongarch64, else => generic(arch), }; @@ -1673,6 +1676,8 @@ pub fn standardDynamicLinkerPath_cpu_os_abi(cpu: Cpu, os_tag: Os.Tag, abi: Abi) .riscv32 => return copy(&result, "/lib/ld-linux-riscv32-ilp32.so.1"), .riscv64 => return copy(&result, "/lib/ld-linux-riscv64-lp64.so.1"), + .loongarch64 => return copy(&result, "/lib/ld-linux-loongarch-lp64d.so.1"), + // Architectures in this list have been verified as not having a standard // dynamic linker path. .wasm32, @@ -1715,7 +1720,6 @@ pub fn standardDynamicLinkerPath_cpu_os_abi(cpu: Cpu, os_tag: Os.Tag, abi: Abi) .ve, .dxil, .loongarch32, - .loongarch64, .xtensa, => return result, }, @@ -2154,6 +2158,7 @@ pub fn c_type_bit_size(target: Target, c_type: CType) u16 { .sparcel, .wasm32, .wasm64, + .loongarch64, => return 128, else => return 64, @@ -2266,6 +2271,7 @@ pub fn c_type_bit_size(target: Target, c_type: CType) u16 { .sparcel, .wasm32, .wasm64, + .loongarch64, => return 128, else => return 64, diff --git a/zig/lib/std/Thread.zig b/zig/lib/std/Thread.zig index ccb9af55a2..a1be1c09c3 100644 --- a/zig/lib/std/Thread.zig +++ b/zig/lib/std/Thread.zig @@ -1186,6 +1186,20 @@ const LinuxThreadImpl = struct { [len] "r" (self.mapped.len), : "memory" ), + .loongarch64 => asm volatile ( + \\ or $a0, $zero, %[ptr] + \\ or $a1, $zero, %[len] + \\ ori $a7, $zero, 215 + \\ syscall 0 # call munmap + \\ ori $a0, $zero, 0 + \\ ori $a7, $zero, 93 + \\ syscall 0 # call exit + \\ + : + : [ptr] "r" (@intFromPtr(self.mapped.ptr)), + [len] "r" (self.mapped.len), + : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory" + ), else => |cpu_arch| @compileError("Unsupported linux arch: " ++ @tagName(cpu_arch)), } unreachable; diff --git a/zig/lib/std/coff.zig b/zig/lib/std/coff.zig index e9214cbd79..a3d17acb73 100644 --- a/zig/lib/std/coff.zig +++ b/zig/lib/std/coff.zig @@ -983,6 +983,10 @@ pub const MachineType = enum(u16) { I386 = 0x14c, /// Intel Itanium processor family IA64 = 0x200, + /// LoongArch32 + LOONGARCH32 = 0x6232, + /// LoongArch64 + LOONGARCH64 = 0x6264, /// Mitsubishi M32R little endian M32R = 0x9041, /// MIPS16 @@ -1026,6 +1030,8 @@ pub const MachineType = enum(u16) { .aarch64 => .ARM64, .riscv64 => .RISCV64, .x86_64 => .X64, + .loongarch32 => .LOONGARCH32, + .loongarch64 => .LOONGARCH64, // there's cases we don't (yet) handle else => unreachable, }; @@ -1041,6 +1047,8 @@ pub const MachineType = enum(u16) { .ARM64 => .aarch64, .RISCV64 => .riscv64, .X64 => .x86_64, + .LOONGARCH32 => .loongarch32, + .LOONGARCH64 => .loongarch64, // there's cases we don't (yet) handle else => null, }; diff --git a/zig/lib/std/elf.zig b/zig/lib/std/elf.zig index a72c96c51e..d97d1f38db 100644 --- a/zig/lib/std/elf.zig +++ b/zig/lib/std/elf.zig @@ -1628,6 +1628,9 @@ pub const EM = enum(u16) { /// C-SKY CSKY = 252, + /// LoongArch + LOONGARCH = 258, + /// Fujitsu FR-V FRV = 0x5441, @@ -1657,6 +1660,7 @@ pub const EM = enum(u16) { .SPARCV9 => .sparc64, .S390 => .s390x, .SPU_2 => .spu_2, + .LOONGARCH => .loongarch64, // FIXME: Is this correct? // there's many cases we don't (yet) handle, or will never have a // zig target cpu arch equivalent (such as null). else => null, diff --git a/zig/lib/std/mem.zig b/zig/lib/std/mem.zig index 10ddd55ca6..ec32a9fb4b 100644 --- a/zig/lib/std/mem.zig +++ b/zig/lib/std/mem.zig @@ -17,6 +17,7 @@ pub const page_size = switch (builtin.cpu.arch) { else => 4 * 1024, }, .sparc64 => 8 * 1024, + .loongarch64 => 16 * 1024, else => 4 * 1024, }; diff --git a/zig/lib/std/os/linux.zig b/zig/lib/std/os/linux.zig index 597922e0c4..68e0d176e4 100644 --- a/zig/lib/std/os/linux.zig +++ b/zig/lib/std/os/linux.zig @@ -43,6 +43,7 @@ const arch_bits = switch (native_arch) { .mips64, .mips64el => @import("linux/mips64.zig"), .powerpc, .powerpcle => @import("linux/powerpc.zig"), .powerpc64, .powerpc64le => @import("linux/powerpc64.zig"), + .loongarch64 => @import("linux/loongarch64.zig"), else => struct {}, }; pub const syscall0 = syscall_bits.syscall0; @@ -106,6 +107,7 @@ pub const SYS = switch (@import("builtin").cpu.arch) { .mips64, .mips64el => syscalls.Mips64, .powerpc, .powerpcle => syscalls.PowerPC, .powerpc64, .powerpc64le => syscalls.PowerPC64, + .loongarch64 => syscalls.LoongArch64, else => @compileError("The Zig Standard Library is missing syscall definitions for the target CPU architecture"), }; @@ -1451,9 +1453,10 @@ pub fn accept4(fd: i32, noalias addr: ?*sockaddr, noalias len: ?*socklen_t, flag pub fn fstat(fd: i32, stat_buf: *Stat) usize { if (@hasField(SYS, "fstat64")) { return syscall2(.fstat64, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(stat_buf)); - } else { + } else if (@hasField(SYS, "fstat")) { return syscall2(.fstat, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(stat_buf)); } + return fstatat(fd, "", stat_buf, AT.EMPTY_PATH); } pub fn stat(pathname: [*:0]const u8, statbuf: *Stat) usize { @@ -1475,9 +1478,41 @@ pub fn lstat(pathname: [*:0]const u8, statbuf: *Stat) usize { pub fn fstatat(dirfd: i32, path: [*:0]const u8, stat_buf: *Stat, flags: u32) usize { if (@hasField(SYS, "fstatat64")) { return syscall4(.fstatat64, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), @intFromPtr(stat_buf), flags); - } else { + } else if (@hasField(SYS, "fstatat")) { return syscall4(.fstatat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), @intFromPtr(stat_buf), flags); + } else if (@hasField(SYS, "statx")) { + var statx_buf: Statx = undefined; + const rc = syscall5( + .statx, + @as(usize, @bitCast(@as(isize, dirfd))), + @intFromPtr(path), + AT.NO_AUTOMOUNT | flags, + STATX_BASIC_STATS, + @intFromPtr(&statx_buf), + ); + if (rc != 0) { + return rc; + } + + // fill in stat_buf with statx_buf + stat_buf.dev = makedev(statx_buf.dev_major, statx_buf.dev_minor); + stat_buf.ino = @as(ino_t, statx_buf.ino); + stat_buf.mode = @as(mode_t, statx_buf.mode); + stat_buf.nlink = statx_buf.nlink; + stat_buf.uid = statx_buf.uid; + stat_buf.gid = statx_buf.gid; + stat_buf.rdev = makedev(statx_buf.rdev_major, statx_buf.rdev_minor); + // + stat_buf.size = @as(off_t, @bitCast(statx_buf.size)); + stat_buf.blksize = @as(blksize_t, @bitCast(statx_buf.blksize)); + stat_buf.blocks = @as(blkcnt_t, @bitCast(statx_buf.blocks)); + stat_buf.atim = timespecFrom(statx_buf.atime); + stat_buf.mtim = timespecFrom(statx_buf.mtime); + stat_buf.ctim = timespecFrom(statx_buf.ctime); + + return 0; } + return @as(usize, @bitCast(-@as(isize, @intFromEnum(E.NOSYS)))); } pub fn statx(dirfd: i32, path: [*]const u8, flags: u32, mask: u32, statx_buf: *Statx) usize { @@ -3658,12 +3693,13 @@ pub fn CPU_COUNT(set: cpu_set_t) cpu_count_t { pub const MINSIGSTKSZ = switch (native_arch) { .x86, .x86_64, .arm, .mipsel => 2048, + .loongarch64 => 4096, .aarch64 => 5120, else => @compileError("MINSIGSTKSZ not defined for this architecture"), }; pub const SIGSTKSZ = switch (native_arch) { .x86, .x86_64, .arm, .mipsel => 8192, - .aarch64 => 16384, + .aarch64, .loongarch64 => 16384, else => @compileError("SIGSTKSZ not defined for this architecture"), }; @@ -4432,6 +4468,21 @@ pub const Statx = extern struct { __pad2: [14]u64, }; +fn makedev(major: u32, minor: u32) dev_t { + const majorH: dev_t = @as(dev_t, major >> 12); + const majorL: dev_t = @as(dev_t, major & 0xfff); + const minorH: dev_t = @as(dev_t, minor >> 8); + const minorL: dev_t = @as(dev_t, minor & 0xff); + return (majorH << 44) | (minorH << 20) | (majorL << 8) | minorL; +} + +fn timespecFrom(ts: statx_timestamp) timespec { + return timespec{ + .tv_sec = @as(isize, @bitCast(ts.tv_sec)), + .tv_nsec = @as(isize, ts.tv_nsec), + }; +} + pub const addrinfo = extern struct { flags: i32, family: i32, @@ -6006,6 +6057,7 @@ pub const AUDIT = struct { .arm, .thumb => .ARM, .riscv64 => .RISCV64, .sparc64 => .SPARC64, + .loongarch64 => .LOONGARCH64, .mips => .MIPS, .mipsel => .MIPSEL, .powerpc => .PPC, @@ -6020,6 +6072,7 @@ pub const AUDIT = struct { CSKY = toAudit(.csky), HEXAGON = @intFromEnum(std.elf.EM.HEXAGON), X86 = toAudit(.x86), + LOONGARCH64 = toAudit(.loongarch64), M68K = toAudit(.m68k), MIPS = toAudit(.mips), MIPSEL = toAudit(.mips) | LE, @@ -6047,6 +6100,7 @@ pub const AUDIT = struct { .riscv64, .sparc64, .x86_64, + .loongarch64, => res |= @"64BIT", else => {}, } diff --git a/zig/lib/std/os/linux/loongarch64.zig b/zig/lib/std/os/linux/loongarch64.zig new file mode 100644 index 0000000000..8c1a4155b1 --- /dev/null +++ b/zig/lib/std/os/linux/loongarch64.zig @@ -0,0 +1,257 @@ +const std = @import("../../std.zig"); +const linux = std.os.linux; +const SYS = linux.SYS; +const socklen_t = linux.socklen_t; +const sockaddr = linux.sockaddr; +const iovec = std.os.iovec; +const iovec_const = std.os.iovec_const; +const uid_t = linux.uid_t; +const gid_t = linux.gid_t; +const pid_t = linux.pid_t; +const stack_t = linux.stack_t; +const sigset_t = linux.sigset_t; +const timespec = std.os.linux.timespec; + +pub fn syscall0(number: SYS) usize { + return asm volatile ( + \\ syscall 0 + : [ret] "={$r4}" (-> usize), + : [number] "{$r11}" (@intFromEnum(number)), + : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory" + ); +} + +pub fn syscall1(number: SYS, arg1: usize) usize { + return asm volatile ( + \\ syscall 0 + : [ret] "={$r4}" (-> usize), + : [number] "{$r11}" (@intFromEnum(number)), + [arg1] "{$r4}" (arg1), + : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory" + ); +} + +pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize { + return asm volatile ( + \\ syscall 0 + : [ret] "={$r4}" (-> usize), + : [number] "{$r11}" (@intFromEnum(number)), + [arg1] "{$r4}" (arg1), + [arg2] "{$r5}" (arg2), + : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory" + ); +} + +pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize { + return asm volatile ( + \\ syscall 0 + : [ret] "={$r4}" (-> usize), + : [number] "{$r11}" (@intFromEnum(number)), + [arg1] "{$r4}" (arg1), + [arg2] "{$r5}" (arg2), + [arg3] "{$r6}" (arg3), + : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory" + ); +} + +pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { + return asm volatile ( + \\ syscall 0 + : [ret] "={$r4}" (-> usize), + : [number] "{$r11}" (@intFromEnum(number)), + [arg1] "{$r4}" (arg1), + [arg2] "{$r5}" (arg2), + [arg3] "{$r6}" (arg3), + [arg4] "{$r7}" (arg4), + : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory" + ); +} + +pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { + return asm volatile ( + \\ syscall 0 + : [ret] "={$r4}" (-> usize), + : [number] "{$r11}" (@intFromEnum(number)), + [arg1] "{$r4}" (arg1), + [arg2] "{$r5}" (arg2), + [arg3] "{$r6}" (arg3), + [arg4] "{$r7}" (arg4), + [arg5] "{$r8}" (arg5), + : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory" + ); +} + +pub fn syscall6( + number: SYS, + arg1: usize, + arg2: usize, + arg3: usize, + arg4: usize, + arg5: usize, + arg6: usize, +) usize { + return asm volatile ( + \\ syscall 0 + : [ret] "={$r4}" (-> usize), + : [number] "{$r11}" (@intFromEnum(number)), + [arg1] "{$r4}" (arg1), + [arg2] "{$r5}" (arg2), + [arg3] "{$r6}" (arg3), + [arg4] "{$r7}" (arg4), + [arg5] "{$r8}" (arg5), + [arg6] "{$r9}" (arg6), + : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory" + ); +} + +const CloneFn = *const fn (arg: usize) callconv(.C) u8; + +pub extern fn clone(func: CloneFn, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; + +pub const restore = restore_rt; + +pub fn restore_rt() callconv(.Naked) noreturn { + asm volatile ( + \\ or $a7, $zero, %[number] + \\ syscall 0 + \\ + : + : [number] "r" (@intFromEnum(SYS.rt_sigreturn)), + : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory" + ); +} + +pub const LOCK = struct { + pub const SH = 1; + pub const EX = 2; + pub const UN = 8; + pub const NB = 4; +}; + +pub const blksize_t = i32; +pub const nlink_t = u32; +pub const time_t = isize; +pub const mode_t = u32; +pub const off_t = isize; +pub const ino_t = usize; +pub const dev_t = usize; +pub const blkcnt_t = isize; + +pub const timeval = extern struct { + tv_sec: time_t, + tv_usec: i64, +}; + +pub const O = struct { + pub const CREAT = 0o100; + pub const EXCL = 0o200; + pub const NOCTTY = 0o400; + pub const TRUNC = 0o1000; + pub const APPEND = 0o2000; + pub const NONBLOCK = 0o4000; + pub const DSYNC = 0o10000; + pub const SYNC = 0o4010000; + pub const RSYNC = 0o4010000; + pub const DIRECTORY = 0o200000; + pub const NOFOLLOW = 0o400000; + pub const CLOEXEC = 0o2000000; + + pub const ASYNC = 0o20000; + pub const DIRECT = 0o40000; + pub const LARGEFILE = 0o100000; + pub const NOATIME = 0o1000000; + pub const PATH = 0o10000000; + pub const TMPFILE = 0o20200000; + pub const NDELAY = NONBLOCK; +}; + +pub const F = struct { + pub const DUPFD = 0; + pub const GETFD = 1; + pub const SETFD = 2; + pub const GETFL = 3; + pub const SETFL = 4; + pub const GETLK = 5; + pub const SETLK = 6; + pub const SETLKW = 7; + pub const SETOWN = 8; + pub const GETOWN = 9; + pub const SETSIG = 10; + pub const GETSIG = 11; + + pub const RDLCK = 0; + pub const WRLCK = 1; + pub const UNLCK = 2; + + pub const SETOWN_EX = 15; + pub const GETOWN_EX = 16; + + pub const GETOWNER_UIDS = 17; +}; + +pub const MAP = struct { + /// stack-like segment + pub const GROWSDOWN = 0x0100; + /// ETXTBSY + pub const DENYWRITE = 0x0800; + /// mark it as an executable + pub const EXECUTABLE = 0x1000; + /// pages are locked + pub const LOCKED = 0x2000; + /// don't check for reservations + pub const NORESERVE = 0x4000; +}; + +pub const VDSO = struct { + pub const CGT_SYM = "__kernel_clock_gettime"; + pub const CGT_VER = "LINUX_5.10"; +}; + +// loongarch64 actually does not support fstat/fstatat syscall. +// This struct is here just for compatibility. +pub const Stat = extern struct { + dev: dev_t, + ino: ino_t, + mode: mode_t, + nlink: nlink_t, + uid: uid_t, + gid: gid_t, + rdev: dev_t, + __pad: usize, + size: off_t, + blksize: blksize_t, + __pad2: i32, + blocks: blkcnt_t, + atim: timespec, + mtim: timespec, + ctim: timespec, + __unused: [2]u32, + + pub fn atime(self: @This()) timespec { + return self.atim; + } + + pub fn mtime(self: @This()) timespec { + return self.mtim; + } + + pub fn ctime(self: @This()) timespec { + return self.ctim; + } +}; + +pub const mcontext_t = extern struct { + pc: usize, + regs: [32]usize, + flags: u32, +}; + +pub const ucontext_t = extern struct { + flags: usize, + link: ?*ucontext_t, + stack: stack_t, + sigmask: sigset_t, + mcontext: mcontext_t, +}; + +pub const Elf_Symndx = u32; diff --git a/zig/lib/std/os/linux/start_pie.zig b/zig/lib/std/os/linux/start_pie.zig index cf557f9d66..513d7f9ab0 100644 --- a/zig/lib/std/os/linux/start_pie.zig +++ b/zig/lib/std/os/linux/start_pie.zig @@ -7,6 +7,7 @@ const R_AMD64_RELATIVE = 8; const R_386_RELATIVE = 8; const R_ARM_RELATIVE = 23; const R_AARCH64_RELATIVE = 1027; +const R_LOONGARCH_RELATIVE = 3; const R_RISCV_RELATIVE = 3; const R_SPARC_RELATIVE = 22; @@ -16,6 +17,7 @@ const R_RELATIVE = switch (builtin.cpu.arch) { .arm => R_ARM_RELATIVE, .aarch64 => R_AARCH64_RELATIVE, .riscv64 => R_RISCV_RELATIVE, + .loongarch64 => R_LOONGARCH_RELATIVE, else => @compileError("Missing R_RELATIVE definition for this target"), }; @@ -63,6 +65,12 @@ fn getDynamicSymbol() [*]elf.Dyn { \\ lla %[ret], _DYNAMIC : [ret] "=r" (-> [*]elf.Dyn), ), + .loongarch64 => asm volatile ( + \\ .weak _DYNAMIC + \\ .hidden _DYNAMIC + \\ la.local %[ret], _DYNAMIC + : [ret] "=r" (-> [*]elf.Dyn), + ), else => { @compileError("PIE startup is not yet supported for this target!"); }, diff --git a/zig/lib/std/os/linux/syscalls.zig b/zig/lib/std/os/linux/syscalls.zig index b919c354c2..811fd7f8f5 100644 --- a/zig/lib/std/os/linux/syscalls.zig +++ b/zig/lib/std/os/linux/syscalls.zig @@ -3861,3 +3861,322 @@ pub const RiscV64 = enum(usize) { riscv_flush_icache = arch_specific_syscall + 15, }; + +pub const LoongArch64 = enum(usize) { + io_setup = 0, + io_destroy = 1, + io_submit = 2, + io_cancel = 3, + io_getevents = 4, + setxattr = 5, + lsetxattr = 6, + fsetxattr = 7, + getxattr = 8, + lgetxattr = 9, + fgetxattr = 10, + listxattr = 11, + llistxattr = 12, + flistxattr = 13, + removexattr = 14, + lremovexattr = 15, + fremovexattr = 16, + getcwd = 17, + lookup_dcookie = 18, + eventfd2 = 19, + epoll_create1 = 20, + epoll_ctl = 21, + epoll_pwait = 22, + dup = 23, + dup3 = 24, + fcntl = 25, + inotify_init1 = 26, + inotify_add_watch = 27, + inotify_rm_watch = 28, + ioctl = 29, + ioprio_set = 30, + ioprio_get = 31, + flock = 32, + mknodat = 33, + mkdirat = 34, + unlinkat = 35, + symlinkat = 36, + linkat = 37, + /// + umount2 = 39, + mount = 40, + pivot_root = 41, + nfsservctl = 42, + statfs = 43, + fstatfs = 44, + truncate = 45, + ftruncate = 46, + fallocate = 47, + faccessat = 48, + chdir = 49, + fchdir = 50, + chroot = 51, + fchmod = 52, + fchmodat = 53, + fchownat = 54, + fchown = 55, + openat = 56, + close = 57, + vhangup = 58, + pipe2 = 59, + quotactl = 60, + getdents64 = 61, + lseek = 62, + read = 63, + write = 64, + readv = 65, + writev = 66, + pread64 = 67, + pwrite64 = 68, + preadv = 69, + pwritev = 70, + sendfile = 71, + pselect6 = 72, + ppoll = 73, + signalfd4 = 74, + vmsplice = 75, + splice = 76, + tee = 77, + readlinkat = 78, + /// fstatat = 79, + /// fstat = 80, + sync = 81, + fsync = 82, + fdatasync = 83, + sync_file_range = 84, + timerfd_create = 85, + timerfd_settime = 86, + timerfd_gettime = 87, + utimensat = 88, + acct = 89, + capget = 90, + capset = 91, + personality = 92, + exit = 93, + exit_group = 94, + waitid = 95, + set_tid_address = 96, + unshare = 97, + futex = 98, + set_robust_list = 99, + get_robust_list = 100, + nanosleep = 101, + getitimer = 102, + setitimer = 103, + kexec_load = 104, + init_module = 105, + delete_module = 106, + timer_create = 107, + timer_gettime = 108, + timer_getoverrun = 109, + timer_settime = 110, + timer_delete = 111, + clock_settime = 112, + clock_gettime = 113, + clock_getres = 114, + clock_nanosleep = 115, + syslog = 116, + ptrace = 117, + sched_setparam = 118, + sched_setscheduler = 119, + sched_getscheduler = 120, + sched_getparam = 121, + sched_setaffinity = 122, + sched_getaffinity = 123, + sched_yield = 124, + sched_get_priority_max = 125, + sched_get_priority_min = 126, + sched_rr_get_interval = 127, + restart_syscall = 128, + kill = 129, + tkill = 130, + tgkill = 131, + sigaltstack = 132, + rt_sigsuspend = 133, + rt_sigaction = 134, + rt_sigprocmask = 135, + rt_sigpending = 136, + rt_sigtimedwait = 137, + rt_sigqueueinfo = 138, + rt_sigreturn = 139, + setpriority = 140, + getpriority = 141, + reboot = 142, + setregid = 143, + setgid = 144, + setreuid = 145, + setuid = 146, + setresuid = 147, + getresuid = 148, + setresgid = 149, + getresgid = 150, + setfsuid = 151, + setfsgid = 152, + times = 153, + setpgid = 154, + getpgid = 155, + getsid = 156, + setsid = 157, + getgroups = 158, + setgroups = 159, + uname = 160, + sethostname = 161, + setdomainname = 162, + /// getrlimit = 163, + /// setrlimit = 164, + getrusage = 165, + umask = 166, + prctl = 167, + getcpu = 168, + gettimeofday = 169, + settimeofday = 170, + adjtimex = 171, + getpid = 172, + getppid = 173, + getuid = 174, + geteuid = 175, + getgid = 176, + getegid = 177, + gettid = 178, + sysinfo = 179, + mq_open = 180, + mq_unlink = 181, + mq_timedsend = 182, + mq_timedreceive = 183, + mq_notify = 184, + mq_getsetattr = 185, + msgget = 186, + msgctl = 187, + msgrcv = 188, + msgsnd = 189, + semget = 190, + semctl = 191, + semtimedop = 192, + semop = 193, + shmget = 194, + shmctl = 195, + shmat = 196, + shmdt = 197, + socket = 198, + socketpair = 199, + bind = 200, + listen = 201, + accept = 202, + connect = 203, + getsockname = 204, + getpeername = 205, + sendto = 206, + recvfrom = 207, + setsockopt = 208, + getsockopt = 209, + shutdown = 210, + sendmsg = 211, + recvmsg = 212, + readahead = 213, + brk = 214, + munmap = 215, + mremap = 216, + add_key = 217, + request_key = 218, + keyctl = 219, + clone = 220, + execve = 221, + mmap = 222, + fadvise64 = 223, + swapon = 224, + swapoff = 225, + mprotect = 226, + msync = 227, + mlock = 228, + munlock = 229, + mlockall = 230, + munlockall = 231, + mincore = 232, + madvise = 233, + remap_file_pages = 234, + mbind = 235, + get_mempolicy = 236, + set_mempolicy = 237, + migrate_pages = 238, + move_pages = 239, + rt_tgsigqueueinfo = 240, + perf_event_open = 241, + accept4 = 242, + recvmmsg = 243, + wait4 = 260, + prlimit64 = 261, + fanotify_init = 262, + fanotify_mark = 263, + name_to_handle_at = 264, + open_by_handle_at = 265, + clock_adjtime = 266, + syncfs = 267, + setns = 268, + sendmmsg = 269, + process_vm_readv = 270, + process_vm_writev = 271, + kcmp = 272, + finit_module = 273, + sched_setattr = 274, + sched_getattr = 275, + renameat2 = 276, + seccomp = 277, + getrandom = 278, + memfd_create = 279, + bpf = 280, + execveat = 281, + userfaultfd = 282, + membarrier = 283, + mlock2 = 284, + copy_file_range = 285, + preadv2 = 286, + pwritev2 = 287, + pkey_mprotect = 288, + pkey_alloc = 289, + pkey_free = 290, + statx = 291, + io_pgetevents = 292, + rseq = 293, + kexec_file_load = 294, + pidfd_send_signal = 424, + io_uring_setup = 425, + io_uring_enter = 426, + io_uring_register = 427, + open_tree = 428, + move_mount = 429, + fsopen = 430, + fsconfig = 431, + fsmount = 432, + fspick = 433, + pidfd_open = 434, + clone3 = 435, + close_range = 436, + openat2 = 437, + pidfd_getfd = 438, + faccessat2 = 439, + process_madvise = 440, + epoll_pwait2 = 441, + mount_setattr = 442, + quotactl_fd = 443, + landlock_create_ruleset = 444, + landlock_add_rule = 445, + landlock_restrict_self = 446, + /// memfd_secret = 447, + process_mrelease = 448, + futex_waitv = 449, + set_mempolicy_home_node = 450, + cachestat = 451, + fchmodat2 = 452, + futex_wake = 454, + futex_wait = 455, + futex_requeue = 456, + statmount = 457, + listmount = 458, + lsm_get_self_attr = 459, + lsm_set_self_attr = 460, + lsm_list_modules = 461, +}; diff --git a/zig/lib/std/os/linux/tls.zig b/zig/lib/std/os/linux/tls.zig index dfd5200d45..3a226be146 100644 --- a/zig/lib/std/os/linux/tls.zig +++ b/zig/lib/std/os/linux/tls.zig @@ -48,8 +48,29 @@ const TLSVariant = enum { }; const tls_variant = switch (native_arch) { - .arm, .armeb, .thumb, .aarch64, .aarch64_be, .riscv32, .riscv64, .mips, .mipsel, .mips64, .mips64el, .powerpc, .powerpcle, .powerpc64, .powerpc64le => TLSVariant.VariantI, - .x86_64, .x86, .sparc64 => TLSVariant.VariantII, + .arm, + .armeb, + .thumb, + .aarch64, + .aarch64_be, + .riscv32, + .riscv64, + .mips, + .mipsel, + .mips64, + .mips64el, + .powerpc, + .powerpcle, + .powerpc64, + .powerpc64le, + .loongarch64, + => TLSVariant.VariantI, + + .x86_64, + .x86, + .sparc64, + => TLSVariant.VariantII, + else => @compileError("undefined tls_variant for this architecture"), }; @@ -64,7 +85,17 @@ const tls_tcb_size = switch (native_arch) { // Controls if the TP points to the end of the TCB instead of its beginning const tls_tp_points_past_tcb = switch (native_arch) { - .riscv32, .riscv64, .mips, .mipsel, .mips64, .mips64el, .powerpc, .powerpc64, .powerpc64le => true, + .riscv32, + .riscv64, + .mips, + .mipsel, + .mips64, + .mips64el, + .powerpc, + .powerpc64, + .powerpc64le, + .loongarch64, + => true, else => false, }; @@ -183,6 +214,13 @@ pub fn setThreadPointer(addr: usize) void { : [addr] "r" (addr), ); }, + .loongarch64 => { + asm volatile ( + \\ or $tp, $zero, %[addr] + : + : [addr] "r" (addr), + ); + }, else => @compileError("Unsupported architecture"), } } diff --git a/zig/lib/std/start.zig b/zig/lib/std/start.zig index ff21ed8187..1d446e1337 100644 --- a/zig/lib/std/start.zig +++ b/zig/lib/std/start.zig @@ -332,6 +332,12 @@ fn _start() callconv(.Naked) noreturn { \\ ba %[posixCallMainAndExit] \\ stx %%l0, %[argc_argv_ptr] , + .loongarch64 => + \\ or $fp, $zero, $zero + \\ st.d $sp, %[argc_argv_ptr] + \\ bstrins.d $sp, $zero, 3, 0 + \\ b %[posixCallMainAndExit] + , else => @compileError("unsupported arch"), } : [argc_argv_ptr] "=m" (argc_argv_ptr), diff --git a/zig/lib/std/zig/system.zig b/zig/lib/std/zig/system.zig index c2a9fa4f9f..629f9f63f8 100644 --- a/zig/lib/std/zig/system.zig +++ b/zig/lib/std/zig/system.zig @@ -87,6 +87,7 @@ pub fn getExternalExecutor( .armeb => Executor{ .qemu = "qemu-armeb" }, .hexagon => Executor{ .qemu = "qemu-hexagon" }, .x86 => Executor{ .qemu = "qemu-i386" }, + .loongarch64 => Executor{ .qemu = "qemu-loongarch64" }, .m68k => Executor{ .qemu = "qemu-m68k" }, .mips => Executor{ .qemu = "qemu-mips" }, .mipsel => Executor{ .qemu = "qemu-mipsel" }, @@ -164,7 +165,7 @@ pub const DetectError = error{ /// standard/default parts relative to that. pub fn resolveTargetQuery(query: Target.Query) DetectError!Target { const query_os_tag = query.os_tag orelse builtin.os.tag; - var os = query_os_tag.defaultVersionRange(query.cpu_arch orelse builtin.cpu.arch); + var os = query_os_tag.defaultVersionRange(); if (query.os_tag == null) { switch (builtin.target.os.tag) { .linux => { diff --git a/zig/lib/std/zig/system/linux.zig b/zig/lib/std/zig/system/linux.zig index d2d31b4079..c8abaaa4bb 100644 --- a/zig/lib/std/zig/system/linux.zig +++ b/zig/lib/std/zig/system/linux.zig @@ -344,6 +344,9 @@ pub fn detectNativeCpuAndFeatures() ?Target.Cpu { .powerpc, .powerpcle, .powerpc64, .powerpc64le => { return PowerpcCpuinfoParser.parse(current_arch, f.reader()) catch null; }, + .loongarch64 => { + return std.Target.Cpu.baseline(current_arch); + }, else => {}, } diff --git a/zig/src/Compilation.zig b/zig/src/Compilation.zig index 9347644381..d726cd4772 100644 --- a/zig/src/Compilation.zig +++ b/zig/src/Compilation.zig @@ -5366,6 +5366,12 @@ pub fn addCCArgs( try argv.append("-msoft-float"); } }, + .loongarch64 => { + if (target.cpu.model.llvm_name) |llvm_name| { + try argv.append(try std.fmt.allocPrint(arena, "-march={s}", .{llvm_name})); + } + // TODO + }, else => { // TODO }, @@ -6153,14 +6159,17 @@ pub fn lockAndSetMiscFailure( return setMiscFailure(comp, tag, format, args); } -fn parseLldStderr(comp: *Compilation, comptime prefix: []const u8, stderr: []const u8) Allocator.Error!void { +fn parseLldStderr(comp: *Compilation, prefix: []const u8, stderr: []const u8) Allocator.Error!void { var context_lines = std.ArrayList([]const u8).init(comp.gpa); defer context_lines.deinit(); + const prefix_with_colon = try std.fmt.allocPrint(comp.gpa, "{s}:", .{prefix}); + defer comp.gpa.free(prefix_with_colon); + var current_err: ?*LldError = null; var lines = mem.splitSequence(u8, stderr, if (builtin.os.tag == .windows) "\r\n" else "\n"); while (lines.next()) |line| { - if (mem.startsWith(u8, line, prefix ++ ":")) { + if (mem.startsWith(u8, line, prefix_with_colon)) { if (current_err) |err| { err.context_lines = try context_lines.toOwnedSlice(); } @@ -6192,7 +6201,7 @@ fn parseLldStderr(comp: *Compilation, comptime prefix: []const u8, stderr: []con } } -pub fn lockAndParseLldStderr(comp: *Compilation, comptime prefix: []const u8, stderr: []const u8) void { +pub fn lockAndParseLldStderr(comp: *Compilation, prefix: []const u8, stderr: []const u8) void { comp.mutex.lock(); defer comp.mutex.unlock(); diff --git a/zig/src/Compilation/Config.zig b/zig/src/Compilation/Config.zig index 78273f66e4..a6a5741432 100644 --- a/zig/src/Compilation/Config.zig +++ b/zig/src/Compilation/Config.zig @@ -294,6 +294,11 @@ pub fn resolve(options: Options) ResolveError!Config { break :b false; } + if (target.cpu.arch.isLoongArch()) { + // FIXME loongarch LTO might have problem + break :b false; + } + break :b switch (options.output_mode) { .Lib, .Obj => false, .Exe => switch (root_optimize_mode) { diff --git a/zig/src/codegen/llvm.zig b/zig/src/codegen/llvm.zig index 91c4faffcc..c4113ffcdf 100644 --- a/zig/src/codegen/llvm.zig +++ b/zig/src/codegen/llvm.zig @@ -11607,6 +11607,8 @@ fn backendSupportsF16(target: std.Target) bool { .mipsel, .mips64, .mips64el, + .loongarch32, + .loongarch64, => false, .aarch64 => std.Target.aarch64.featureSetHas(target.cpu.features, .fp_armv8), else => true, diff --git a/zig/src/codegen/llvm/Builder.zig b/zig/src/codegen/llvm/Builder.zig index b3c39f3362..d4a94b91ac 100644 --- a/zig/src/codegen/llvm/Builder.zig +++ b/zig/src/codegen/llvm/Builder.zig @@ -8288,6 +8288,13 @@ pub fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void { // There is no LLVMInitializeARCAsmParser function. } }, + .loongarch32, .loongarch64 => { + llvm.LLVMInitializeLoongArchTarget(); + llvm.LLVMInitializeLoongArchTargetInfo(); + llvm.LLVMInitializeLoongArchTargetMC(); + llvm.LLVMInitializeLoongArchAsmPrinter(); + llvm.LLVMInitializeLoongArchAsmParser(); + }, // LLVM backends that have no initialization functions. .tce, @@ -8306,8 +8313,6 @@ pub fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void { .renderscript32, .renderscript64, .dxil, - .loongarch32, - .loongarch64, => {}, .spu_2 => unreachable, // LLVM does not support this backend diff --git a/zig/src/codegen/llvm/bindings.zig b/zig/src/codegen/llvm/bindings.zig index d7144b36ce..b361a80810 100644 --- a/zig/src/codegen/llvm/bindings.zig +++ b/zig/src/codegen/llvm/bindings.zig @@ -1032,6 +1032,7 @@ pub extern fn LLVMInitializeM68kTargetInfo() void; pub extern fn LLVMInitializeCSKYTargetInfo() void; pub extern fn LLVMInitializeVETargetInfo() void; pub extern fn LLVMInitializeARCTargetInfo() void; +pub extern fn LLVMInitializeLoongArchTargetInfo() void; pub extern fn LLVMInitializeAArch64Target() void; pub extern fn LLVMInitializeAMDGPUTarget() void; @@ -1055,6 +1056,7 @@ pub extern fn LLVMInitializeM68kTarget() void; pub extern fn LLVMInitializeVETarget() void; pub extern fn LLVMInitializeCSKYTarget() void; pub extern fn LLVMInitializeARCTarget() void; +pub extern fn LLVMInitializeLoongArchTarget() void; pub extern fn LLVMInitializeAArch64TargetMC() void; pub extern fn LLVMInitializeAMDGPUTargetMC() void; @@ -1078,6 +1080,7 @@ pub extern fn LLVMInitializeM68kTargetMC() void; pub extern fn LLVMInitializeCSKYTargetMC() void; pub extern fn LLVMInitializeVETargetMC() void; pub extern fn LLVMInitializeARCTargetMC() void; +pub extern fn LLVMInitializeLoongArchTargetMC() void; pub extern fn LLVMInitializeAArch64AsmPrinter() void; pub extern fn LLVMInitializeAMDGPUAsmPrinter() void; @@ -1099,6 +1102,7 @@ pub extern fn LLVMInitializeXCoreAsmPrinter() void; pub extern fn LLVMInitializeM68kAsmPrinter() void; pub extern fn LLVMInitializeVEAsmPrinter() void; pub extern fn LLVMInitializeARCAsmPrinter() void; +pub extern fn LLVMInitializeLoongArchAsmPrinter() void; pub extern fn LLVMInitializeAArch64AsmParser() void; pub extern fn LLVMInitializeAMDGPUAsmParser() void; @@ -1119,6 +1123,7 @@ pub extern fn LLVMInitializeXtensaAsmParser() void; pub extern fn LLVMInitializeM68kAsmParser() void; pub extern fn LLVMInitializeCSKYAsmParser() void; pub extern fn LLVMInitializeVEAsmParser() void; +pub extern fn LLVMInitializeLoongArchAsmParser() void; extern fn ZigLLDLinkCOFF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool, disable_output: bool) bool; extern fn ZigLLDLinkELF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool, disable_output: bool) bool; diff --git a/zig/src/glibc.zig b/zig/src/glibc.zig index b7483b7012..c8e05c5d8b 100644 --- a/zig/src/glibc.zig +++ b/zig/src/glibc.zig @@ -444,6 +444,8 @@ fn start_asm_path(comp: *Compilation, arena: Allocator, basename: []const u8) ![ } else { try result.appendSlice("powerpc" ++ s ++ "powerpc32"); } + } else if (arch.isLoongArch()) { + try result.appendSlice("loongarch"); } try result.appendSlice(s); @@ -1163,7 +1165,7 @@ fn buildSharedLib( // Return true if glibc has crti/crtn sources for that architecture. pub fn needsCrtiCrtn(target: std.Target) bool { return switch (target.cpu.arch) { - .riscv32, .riscv64 => false, + .riscv32, .riscv64, .loongarch64 => false, else => true, }; } diff --git a/zig/src/link/Elf.zig b/zig/src/link/Elf.zig index 2f1d5703f9..3295297c85 100644 --- a/zig/src/link/Elf.zig +++ b/zig/src/link/Elf.zig @@ -2538,13 +2538,21 @@ fn linkWithLLD(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node) !voi // We will invoke ourselves as a child process to gain access to LLD. // This is necessary because LLD does not behave properly as a library - // it calls exit() and does not reset all global data between invocations. - const linker_command = "ld.lld"; + const linker_command = switch (target.cpu.arch) { + std.Target.Cpu.Arch.loongarch64 => "mold", // FIXME + else => "ld.lld", + }; + const use_ld_lld = mem.eql(u8, linker_command, "ld.lld"); + const use_ld_bfd = mem.eql(u8, linker_command, "ld.bfd"); + try argv.appendSlice(&[_][]const u8{ comp.self_exe_path.?, linker_command }); if (is_obj) { try argv.append("-r"); } - try argv.append("--error-limit=0"); + if (use_ld_lld) { + try argv.append("--error-limit=0"); + } if (comp.sysroot) |sysroot| { try argv.append(try std.fmt.allocPrint(arena, "--sysroot={s}", .{sysroot})); @@ -2599,7 +2607,9 @@ fn linkWithLLD(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node) !voi } } - try argv.append(try std.fmt.allocPrint(arena, "--image-base={d}", .{self.image_base})); + if (!use_ld_bfd) { + try argv.append(try std.fmt.allocPrint(arena, "--image-base={d}", .{self.image_base})); + } if (self.linker_script) |linker_script| { try argv.append("-T"); @@ -2945,7 +2955,8 @@ fn linkWithLLD(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node) !voi // behave properly as a library, unfortunately. // https://github.com/ziglang/zig/issues/3825 var child = std.ChildProcess.init(argv.items, arena); - if (comp.clang_passthrough_mode) { + + if (comp.clang_passthrough_mode or !use_ld_lld) { child.stdin_behavior = .Inherit; child.stdout_behavior = .Inherit; child.stderr_behavior = .Inherit; @@ -5445,6 +5456,8 @@ fn getLDMOption(target: std.Target) ?[]const u8 { .powerpc64le => return "elf64lppc", .sparc, .sparcel => return "elf32_sparc", .sparc64 => return "elf64_sparc", + .loongarch32 => return "elf32loongarch", + .loongarch64 => return "elf64loongarch", .mips => return "elf32btsmip", .mipsel => return "elf32ltsmip", .mips64 => { diff --git a/zig/src/main.zig b/zig/src/main.zig index 4442234bd2..488209eb17 100644 --- a/zig/src/main.zig +++ b/zig/src/main.zig @@ -296,6 +296,8 @@ pub fn mainArgs(gpa: Allocator, arena: Allocator, args: []const []const u8) !voi { return process.exit(try clangMain(arena, args)); } else if (mem.eql(u8, cmd, "ld.lld") or + mem.eql(u8, cmd, "ld.bfd") or + mem.eql(u8, cmd, "mold") or mem.eql(u8, cmd, "lld-link") or mem.eql(u8, cmd, "wasm-ld")) { @@ -6113,6 +6115,8 @@ pub fn llvmArMain(alloc: Allocator, args: []const []const u8) error{OutOfMemory} /// The first argument determines which backend is invoked. The options are: /// * `ld.lld` - ELF +/// * `ld.bfd` - FIXME ELF for loongarch64 +/// * `mold` - FIXME ELF for loongarch64 /// * `lld-link` - COFF /// * `wasm-ld` - WebAssembly pub fn lldMain( @@ -6147,6 +6151,25 @@ pub fn lldMain( const argc = @as(c_int, @intCast(argv.len)); if (mem.eql(u8, args[1], "ld.lld")) { break :rc llvm.LinkELF(argc, argv.ptr, can_exit_early, false); + } else if (mem.eql(u8, args[1], "mold") or mem.eql(u8, args[1], "ld.bfd")) { + if (!std.process.can_spawn) { + unreachable; + } + + var child = std.ChildProcess.init(args[1..], arena); + child.stdin_behavior = .Inherit; + child.stdout_behavior = .Inherit; + child.stderr_behavior = .Inherit; + + const term = child.spawnAndWait() catch |err| { + fatal("failed to launch {s}: {s}", .{args[1], @errorName(err)}); + }; + switch (term) { + .Exited => |code| { + return code; + }, + else => break :rc false, + } } else if (mem.eql(u8, args[1], "lld-link")) { break :rc llvm.LinkCOFF(argc, argv.ptr, can_exit_early, false); } else if (mem.eql(u8, args[1], "wasm-ld")) { diff --git a/zig/src/musl.zig b/zig/src/musl.zig index c244257a70..9949491505 100644 --- a/zig/src/musl.zig +++ b/zig/src/musl.zig @@ -336,6 +336,7 @@ fn isMuslArchName(name: []const u8) bool { "arm", "generic", "i386", + "loongarch64", "m68k", "microblaze", "mips", diff --git a/zig/src/target.zig b/zig/src/target.zig index 8c66017e79..7362e21fc7 100644 --- a/zig/src/target.zig +++ b/zig/src/target.zig @@ -46,6 +46,8 @@ pub const available_libcs = [_]ArchOsAbi{ .{ .arch = .x86, .os = .linux, .abi = .gnu }, .{ .arch = .x86, .os = .linux, .abi = .musl }, .{ .arch = .x86, .os = .windows, .abi = .gnu }, + .{ .arch = .loongarch64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 } }, + .{ .arch = .loongarch64, .os = .linux, .abi = .musl }, .{ .arch = .m68k, .os = .linux, .abi = .gnu }, .{ .arch = .m68k, .os = .linux, .abi = .musl }, .{ .arch = .mips64el, .os = .linux, .abi = .gnuabi64 }, @@ -145,6 +147,7 @@ pub fn osArchName(target: std.Target) [:0]const u8 { .linux => switch (target.cpu.arch) { .arm, .armeb, .thumb, .thumbeb => "arm", .aarch64, .aarch64_be, .aarch64_32 => "aarch64", + .loongarch32, .loongarch64 => "loongarch", .mips, .mipsel, .mips64, .mips64el => "mips", .powerpc, .powerpcle, .powerpc64, .powerpc64le => "powerpc", .riscv32, .riscv64 => "riscv", diff --git a/zig/test/link.zig b/zig/test/link.zig index 93ccb3c640..552d237313 100644 --- a/zig/test/link.zig +++ b/zig/test/link.zig @@ -91,112 +91,112 @@ pub const cases = [_]Case{ }, // Mach-O Cases - .{ - .build_root = "test/link/macho/bugs/13056", - .import = @import("link/macho/bugs/13056/build.zig"), - }, - .{ - .build_root = "test/link/macho/bugs/13457", - .import = @import("link/macho/bugs/13457/build.zig"), - }, - .{ - .build_root = "test/link/macho/bugs/16308", - .import = @import("link/macho/bugs/16308/build.zig"), - }, - .{ - .build_root = "test/link/macho/bugs/16628", - .import = @import("link/macho/bugs/16628/build.zig"), - }, - .{ - .build_root = "test/link/macho/dead_strip", - .import = @import("link/macho/dead_strip/build.zig"), - }, - .{ - .build_root = "test/link/macho/dead_strip_dylibs", - .import = @import("link/macho/dead_strip_dylibs/build.zig"), - }, - .{ - .build_root = "test/link/macho/dylib", - .import = @import("link/macho/dylib/build.zig"), - }, - .{ - .build_root = "test/link/macho/empty", - .import = @import("link/macho/empty/build.zig"), - }, - .{ - .build_root = "test/link/macho/entry", - .import = @import("link/macho/entry/build.zig"), - }, - .{ - .build_root = "test/link/macho/entry_in_archive", - .import = @import("link/macho/entry_in_archive/build.zig"), - }, - .{ - .build_root = "test/link/macho/entry_in_dylib", - .import = @import("link/macho/entry_in_dylib/build.zig"), - }, - .{ - .build_root = "test/link/macho/headerpad", - .import = @import("link/macho/headerpad/build.zig"), - }, - .{ - .build_root = "test/link/macho/linksection", - .import = @import("link/macho/linksection/build.zig"), - }, - .{ - .build_root = "test/link/macho/needed_framework", - .import = @import("link/macho/needed_framework/build.zig"), - }, - .{ - .build_root = "test/link/macho/needed_library", - .import = @import("link/macho/needed_library/build.zig"), - }, - .{ - .build_root = "test/link/macho/objc", - .import = @import("link/macho/objc/build.zig"), - }, - .{ - .build_root = "test/link/macho/objcpp", - .import = @import("link/macho/objcpp/build.zig"), - }, - .{ - .build_root = "test/link/macho/pagezero", - .import = @import("link/macho/pagezero/build.zig"), - }, - .{ - .build_root = "test/link/macho/reexports", - .import = @import("link/macho/reexports/build.zig"), - }, - .{ - .build_root = "test/link/macho/search_strategy", - .import = @import("link/macho/search_strategy/build.zig"), - }, - .{ - .build_root = "test/link/macho/stack_size", - .import = @import("link/macho/stack_size/build.zig"), - }, - .{ - .build_root = "test/link/macho/strict_validation", - .import = @import("link/macho/strict_validation/build.zig"), - }, - .{ - .build_root = "test/link/macho/tbdv3", - .import = @import("link/macho/tbdv3/build.zig"), - }, - .{ - .build_root = "test/link/macho/tls", - .import = @import("link/macho/tls/build.zig"), - }, - .{ - .build_root = "test/link/macho/unwind_info", - .import = @import("link/macho/unwind_info/build.zig"), - }, - .{ - .build_root = "test/link/macho/weak_library", - .import = @import("link/macho/weak_library/build.zig"), - }, - .{ - .build_root = "test/link/macho/weak_framework", - .import = @import("link/macho/weak_framework/build.zig"), - }, + // .{ + // .build_root = "test/link/macho/bugs/13056", + // .import = @import("link/macho/bugs/13056/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/bugs/13457", + // .import = @import("link/macho/bugs/13457/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/bugs/16308", + // .import = @import("link/macho/bugs/16308/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/bugs/16628", + // .import = @import("link/macho/bugs/16628/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/dead_strip", + // .import = @import("link/macho/dead_strip/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/dead_strip_dylibs", + // .import = @import("link/macho/dead_strip_dylibs/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/dylib", + // .import = @import("link/macho/dylib/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/empty", + // .import = @import("link/macho/empty/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/entry", + // .import = @import("link/macho/entry/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/entry_in_archive", + // .import = @import("link/macho/entry_in_archive/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/entry_in_dylib", + // .import = @import("link/macho/entry_in_dylib/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/headerpad", + // .import = @import("link/macho/headerpad/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/linksection", + // .import = @import("link/macho/linksection/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/needed_framework", + // .import = @import("link/macho/needed_framework/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/needed_library", + // .import = @import("link/macho/needed_library/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/objc", + // .import = @import("link/macho/objc/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/objcpp", + // .import = @import("link/macho/objcpp/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/pagezero", + // .import = @import("link/macho/pagezero/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/reexports", + // .import = @import("link/macho/reexports/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/search_strategy", + // .import = @import("link/macho/search_strategy/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/stack_size", + // .import = @import("link/macho/stack_size/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/strict_validation", + // .import = @import("link/macho/strict_validation/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/tbdv3", + // .import = @import("link/macho/tbdv3/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/tls", + // .import = @import("link/macho/tls/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/unwind_info", + // .import = @import("link/macho/unwind_info/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/weak_library", + // .import = @import("link/macho/weak_library/build.zig"), + // }, + // .{ + // .build_root = "test/link/macho/weak_framework", + // .import = @import("link/macho/weak_framework/build.zig"), + // }, }; diff --git a/zig/test/llvm_targets.zig b/zig/test/llvm_targets.zig index 99eb161a58..0d485e9be6 100644 --- a/zig/test/llvm_targets.zig +++ b/zig/test/llvm_targets.zig @@ -35,6 +35,8 @@ const targets = [_]std.Target.Query{ .{ .cpu_arch = .csky, .os_tag = .freestanding, .abi = .none }, .{ .cpu_arch = .csky, .os_tag = .linux, .abi = .none }, .{ .cpu_arch = .hexagon, .os_tag = .linux, .abi = .none }, + .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .gnu }, + .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .musl }, .{ .cpu_arch = .m68k, .os_tag = .freestanding, .abi = .none }, .{ .cpu_arch = .m68k, .os_tag = .linux, .abi = .none }, .{ .cpu_arch = .mips, .os_tag = .linux, .abi = .gnueabihf }, diff --git a/zig/tools/gen_stubs.zig b/zig/tools/gen_stubs.zig index b603213566..e015a253ec 100644 --- a/zig/tools/gen_stubs.zig +++ b/zig/tools/gen_stubs.zig @@ -2,7 +2,7 @@ //! ./gen_stubs /path/to/musl/build-all >libc.S //! //! The directory 'build-all' is expected to contain these subdirectories: -//! arm x86 mips mips64 powerpc powerpc64 riscv64 x86_64 +//! arm x86 mips mips64 powerpc powerpc64 riscv64 x86_64 loongarch64 //! //! ...each with 'lib/libc.so' inside of them. //! @@ -17,6 +17,7 @@ //! - `-DARCH_powerpc` //! - `-DARCH_powerpc64` //! - `-DARCH_aarch64` +//! - `-DARCH_loongarch64` // TODO: pick the best index to put them into instead of at the end // - e.g. find a common previous symbol and put it after that one @@ -38,6 +39,7 @@ const inputs = .{ .powerpc, .powerpc64, .aarch64, + .loongarch64, }; const arches: [inputs.len]std.Target.Cpu.Arch = blk: { @@ -73,7 +75,8 @@ const MultiSym = struct { ms.present[archIndex(.x86_64)] == false and ms.present[archIndex(.powerpc)] == true and ms.present[archIndex(.powerpc64)] == false and - ms.present[archIndex(.aarch64)] == false; + ms.present[archIndex(.aarch64)] == false and + ms.present[archIndex(.loongarch64)] == false; } fn commonSize(ms: MultiSym) ?u64 { @@ -116,6 +119,7 @@ const MultiSym = struct { .{ .powerpc, 4 }, .{ .powerpc64, 8 }, .{ .aarch64, 8 }, + .{ .loongarch64, 8 }, }; inline for (map) |item| { const arch = item[0]; @@ -138,6 +142,7 @@ const MultiSym = struct { .{ .powerpc, 8 }, .{ .powerpc64, 16 }, .{ .aarch64, 16 }, + .{ .loongarch64, 16 }, }; inline for (map) |item| { const arch = item[0]; @@ -160,6 +165,7 @@ const MultiSym = struct { .{ .powerpc, 1 }, .{ .powerpc64, 2 }, .{ .aarch64, 2 }, + .{ .loongarch64, 2 }, }; inline for (map) |item| { const arch = item[0]; @@ -581,15 +587,16 @@ fn parseElf(parse: Parse, comptime is_64: bool, comptime endian: builtin.Endian) fn archIndex(arch: std.Target.Cpu.Arch) u8 { return switch (arch) { // zig fmt: off - .riscv64 => 0, - .mips => 1, - .mips64 => 2, - .x86 => 3, - .x86_64 => 4, - .powerpc => 5, - .powerpc64 => 6, - .aarch64 => 7, - else => unreachable, + .riscv64 => 0, + .mips => 1, + .mips64 => 2, + .x86 => 3, + .x86_64 => 4, + .powerpc => 5, + .powerpc64 => 6, + .aarch64 => 7, + .loongarch64 => 8, + else => unreachable, // zig fmt: on }; } @@ -597,15 +604,16 @@ fn archIndex(arch: std.Target.Cpu.Arch) u8 { fn archMuslName(arch: std.Target.Cpu.Arch) []const u8 { return switch (arch) { // zig fmt: off - .riscv64 => "riscv64", - .mips => "mips", - .mips64 => "mips64", - .x86 => "i386", - .x86_64 => "x86_64", - .powerpc => "powerpc", - .powerpc64 => "powerpc64", - .aarch64 => "aarch64", - else => unreachable, + .riscv64 => "riscv64", + .mips => "mips", + .mips64 => "mips64", + .x86 => "i386", + .x86_64 => "x86_64", + .powerpc => "powerpc", + .powerpc64 => "powerpc64", + .aarch64 => "aarch64", + .loongarch64 => "loongarch64", + else => unreachable, // zig fmt: on }; } diff --git a/zig/tools/process_headers.zig b/zig/tools/process_headers.zig index 576e894f98..401d3d6327 100644 --- a/zig/tools/process_headers.zig +++ b/zig/tools/process_headers.zig @@ -195,6 +195,11 @@ const glibc_targets = [_]LibCTarget{ .arch = MultiArch{ .specific = Arch.m68k }, .abi = MultiAbi{ .specific = Abi.gnu }, }, + LibCTarget{ + .name = "loongarch64-linux-gnu-lp64d", + .arch = MultiArch{ .specific = Arch.loongarch64 }, + .abi = MultiAbi{ .specific = Abi.gnu }, + }, }; const musl_targets = [_]LibCTarget{ @@ -253,6 +258,11 @@ const musl_targets = [_]LibCTarget{ .arch = MultiArch{ .specific = .m68k }, .abi = MultiAbi{ .specific = .musl }, }, + LibCTarget{ + .name = "loongarch64", + .arch = MultiArch{ .specific = .loongarch64 }, + .abi = MultiAbi{ .specific = .musl }, + }, }; const DestTarget = struct {