[PATCH v5 0/6] Add support for LoongArch32
mengqinggang
mengqinggang@loongson.cn
Wed Mar 4 06:46:44 GMT 2026
在 2026/3/4 09:52, mengqinggang 写道:
>
> 在 2026/3/4 00:33, Xi Ruoyao 写道:
>> On Tue, 2026-03-03 at 19:28 +0800, mengqinggang wrote:
>>> 在 2026/3/3 18:11, Xi Ruoyao 写道:
>>>> On Tue, 2026-03-03 at 17:54 +0800, mengqinggang wrote:
>>>>> LoongArch64 gcc generates call memset to fully zero-filling the
>>>>> struct.
>>>>> But LoongArch32 gcc not generate call memset.
>>>>> Maybe we can fix LoongArch32 gcc to resolve this problem.
>>>> This is not a compiler bug so there's nothing to be fixed in the
>>>> compiler. In C using = {...} to initialize a struct with automatic
>>>> storage duration will leave the padding bits unspecified, unless the
>>>> initializer is empty.
>>>>
>>>> See https://gcc.gnu.org/PR104607 which has been resolved as invalid
>>>> years ago.
>>> According to what you said, loongarch64 gcc should not generate call
>>> memset assembly code?
>> I don't think it should. This seems a missed-optimization on almost all
>> GCC ports (GCC r16-7721 actually emits the memset for LA32...)
>>
> Only loongarch64 gcc generate call memset for the following code.
>
> 1 #include <errno.h>
> 2 #include <fcntl.h>
> 3 #include <limits.h>
> 4 #include <sys/pidfd.h>
> 5 #include <sys/wait.h>
> 6 #include <stdlib.h>
> 7 #include <stdio.h>
> 8 #include <unistd.h>
> 9
> 10 static pid_t ppid;
> 11 static uid_t puid;
> 12
> 13 int
> 14 main (void)
> 15 {
> 16 ppid = getpid ();
> 17 puid = getuid ();
> 18 pid_t pid = fork ();
> 19 if (pid != 0)
> 20 {
> 21 int pidfd = pidfd_open (pid, 0);
> 22 printf("pidfd %d\n", pidfd);
> 23 {
> 24 siginfo_t info =
> 25 {
> 26 .si_signo = SIGUSR2,
> 27 .si_errno = EAGAIN,
> 28 .si_code = -10,
> 29 .si_pid = ppid,
> 30 .si_uid = puid
> 31 };
> 32 int r = pidfd_send_signal (pidfd, SIGUSR2, &info, 0);
> 33 printf("pidfd r = %d\n", r);
> 34 }
> 35 }
> 36 return 0;
> 37 }
>
If wordsize is 64, there is an int __pad0.
Maybe this difference causes the loongarch64 gcc to generate call memset,
while the loongarch32 gcc does not.
sysdeps/unix/sysv/linux/bits/types/siginfo_t.h:
36 typedef struct
37 {
38 int si_signo; /* Signal number. */
39 #if __SI_ERRNO_THEN_CODE
40 int si_errno; /* If non-zero, an errno value
associated with
41 this signal, as defined in
<errno.h>. */
42 int si_code; /* Signal code. */
43 #else
44 int si_code;
45 int si_errno;
46 #endif
47 #if __WORDSIZE == 64
48 int __pad0; /* Explicit padding. */
49 #endif
50
51 union
52 {
53 int _pad[__SI_PAD_SIZE];
54
55 /* kill(). */
56 struct
57 {
58 __pid_t si_pid; /* Sending process ID. */
59 __uid_t si_uid; /* Real user ID of sending
process. */
60 } _kill;
More information about the Libc-alpha
mailing list