[PATCH v2 04/14] LoongArch: ABI Implementation
Adhemerval Zanella
adhemerval.zanella@linaro.org
Tue Jan 4 13:46:42 GMT 2022
On 31/12/2021 03:44, caiyinyu wrote:
> diff --git a/sysdeps/loongarch/bits/wordsize.h b/sysdeps/loongarch/bits/wordsize.h
> new file mode 100644
> index 0000000000..0a83454b08
> --- /dev/null
> +++ b/sysdeps/loongarch/bits/wordsize.h
> @@ -0,0 +1,25 @@
> +/* Determine the wordsize from the preprocessor defines.
> + Copyright (C) 2021 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
> + <https://www.gnu.org/licenses/>. */
> +
> +#ifdef __LP64__
> +#define __WORDSIZE 64
> +#else
> +#define __WORDSIZE 32
> +#endif
> +
> +#define __WORDSIZE_TIME64_COMPAT32 0
You stated you only supported 64-bit ABI and it should imply in wordsize-64,
so why do you need to provide an arch-specific wordsize.h?
> +END (_dl_runtime_resolve)
> diff --git a/sysdeps/loongarch/gccframe.h b/sysdeps/loongarch/gccframe.h
> new file mode 100644
> index 0000000000..19996f3ce3
> --- /dev/null
> +++ b/sysdeps/loongarch/gccframe.h
> @@ -0,0 +1,21 @@
> +/* Definition of object in frame unwind info.
> + Copyright (C) 2021 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
> + <https://www.gnu.org/licenses/>. */
> +
> +#define FIRST_PSEUDO_REGISTER 74
> +
> +#include <sysdeps/generic/gccframe.h>
Why do you need to add it? It is used solely on unwind code used only for
compat code on old ABIs.
> diff --git a/sysdeps/loongarch/memusage.h b/sysdeps/loongarch/memusage.h
> new file mode 100644
> index 0000000000..bdf24bb276
> --- /dev/null
> +++ b/sysdeps/loongarch/memusage.h
> @@ -0,0 +1,25 @@
> +/* Machine-specific definitions for memory usage profiling.
> + Copyright (C) 2021 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
> + <https://www.gnu.org/licenses/>. */
> +
> +#define GETSP() \
> + ({ \
> + register uintptr_t stack_ptr asm("$sp"); \
> + stack_ptr; \
> + })
> +
> +#include <sysdeps/generic/memusage.h>
There is no need to add this header.
> diff --git a/sysdeps/unix/sysv/linux/loongarch/ldconfig.h b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
> new file mode 100644
> index 0000000000..126f0860e9
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
> @@ -0,0 +1,30 @@
> +/* ldconfig default paths and libraries.
> + Copyright (C) 2001-2021 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <sysdeps/generic/ldconfig.h>
> +
> +#ifdef __loongarch_lp64
> +#define SYSDEP_KNOWN_INTERPRETER_NAMES \
> + { "/lib64/ld-linux-loongarch-lp64d.so.1", FLAG_ELF_LIBC6 },
> +#else
> +#error cannot determine ABI
> +#endif
> +
Do you plan to support multilib with different ABIs in the same system? Otherwise
I think adding another SYSDEP_KNOWN_INTERPRETER_NAMES does not add much.
> +#define SYSDEP_KNOWN_LIBRARY_NAMES \
> + { "libc.so.6", FLAG_ELF_LIBC6 }, \
> + { "libm.so.6", FLAG_ELF_LIBC6 },
> diff --git a/sysdeps/unix/sysv/linux/loongarch/localplt.data b/sysdeps/unix/sysv/linux/loongarch/localplt.data
> new file mode 100644
> index 0000000000..817ab2659a
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/localplt.data
> @@ -0,0 +1,12 @@
> +# See scripts/check-localplt.awk for how this file is processed.
> +# PLT use is required for the malloc family and for matherr because
> +# users can define their own functions and have library internals call them.
> +libc.so: calloc
> +libc.so: free
> +libc.so: malloc
> +libc.so: realloc
> +# The TLS-enabled version of these functions is interposed from libc.so.
> +ld.so: _dl_signal_error
> +ld.so: _dl_catch_error
> +ld.so: _dl_signal_exception
> +ld.so: _dl_catch_exception
I think this file should be moved to the Linux ABI patch.
> diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/fpu/jmp_buf-macros.h b/sysdeps/unix/sysv/linux/loongarch/lp64/fpu/jmp_buf-macros.h
> new file mode 100644
> index 0000000000..a02865b4a5
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/fpu/jmp_buf-macros.h
> @@ -0,0 +1,44 @@
> +/* jump buffer constants for LoongArch.
> + Copyright (C) 2021 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
> + <https://www.gnu.org/licenses/>. */
> +
> +/* Produced by this program:
> +
> + #include <stdio.h>
> + #include <unistd.h>
> + #include <setjmp.h>
> + #include <stddef.h>
> +
> + int main (int argc, char **argv)
> + {
> + printf ("#define JMP_BUF_SIZE %d\n", sizeof (jmp_buf));
> + printf ("#define JMP_BUF_ALIGN %d\n", __alignof__ (jmp_buf));
> + printf ("#define SIGJMP_BUF_SIZE %d\n", sizeof (sigjmp_buf));
> + printf ("#define SIGJMP_BUF_ALIGN %d\n", __alignof__ (sigjmp_buf));
> + printf ("#define MASK_WAS_SAVED_OFFSET %d\n",
> + offsetof (struct __jmp_buf_tag, __mask_was_saved));
> + printf ("#define SAVED_MASK_OFFSET %d\n",
> + offsetof (struct __jmp_buf_tag, __saved_mask));
> + } */
> +
> +#define JMP_BUF_SIZE 304
> +#define JMP_BUF_ALIGN 8
> +#define SIGJMP_BUF_SIZE 304
> +#define SIGJMP_BUF_ALIGN 8
> +#define MASK_WAS_SAVED_OFFSET 168
> +#define SAVED_MASK_OFFSET 176
Same as before.
> diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/jmp_buf-macros.h b/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/jmp_buf-macros.h
> new file mode 100644
> index 0000000000..835df05ce5
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/jmp_buf-macros.h
> @@ -0,0 +1,41 @@
> +/* Copyright (C) 2020-2021 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
> + <https://www.gnu.org/licenses/>. */
> +
> +/* Produced by this program:
> +
> + #include <stdio.h>
> + #include <unistd.h>
> + #include <setjmp.h>
> + #include <stddef.h>
> +
> + int main (int argc, char **argv)
> + {
> + printf ("#define JMP_BUF_SIZE %d\n", sizeof (jmp_buf));
> + printf ("#define JMP_BUF_ALIGN %d\n", __alignof__ (jmp_buf));
> + printf ("#define SIGJMP_BUF_SIZE %d\n", sizeof (sigjmp_buf));
> + printf ("#define SIGJMP_BUF_ALIGN %d\n", __alignof__ (sigjmp_buf));
> + printf ("#define MASK_WAS_SAVED_OFFSET %d\n", offsetof (struct __jmp_buf_tag, __mask_was_saved));
> + printf ("#define SAVED_MASK_OFFSET %d\n", offsetof (struct __jmp_buf_tag, __saved_mask));
> + } */
> +
> +# define JMP_BUF_SIZE 240
> +# define JMP_BUF_ALIGN 8
> +# define SIGJMP_BUF_SIZE 240
> +# define SIGJMP_BUF_ALIGN 8
> +# define MASK_WAS_SAVED_OFFSET 104
> +# define SAVED_MASK_OFFSET 112
Same as before.
More information about the Libc-alpha
mailing list