[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