Re: Broken RISC-V code in newlib

Eric Salem <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
Hi Jeff,

On 3/25/25 8:40 AM, Jeff Law wrote:
> 
> You recently put a typedef into libc/machine/riscv/sys/asm.h as well as including stdint.h.
> 
> That breaks code such as strcmp.S which includes sys/asm.h, but is processed by the assembler after pre-processing:
> 
>>   CPPAS    libc/machine/riscv/libc_a-strcmp.o
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h: Assembler messages:
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h:41: Error: unrecognized opcode `typedef signed char __int8_t'
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h:43: Error: unrecognized opcode `typedef unsigned char __uint8_t'
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h:55: Error: unrecognized opcode `typedef short int __int16_t'
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h:57: Error: unrecognized opcode `typedef short unsigned int __uint16_t'
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h:77: Error: unrecognized opcode `typedef int __int32_t'
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h:79: Error: unrecognized opcode `typedef unsigned int __uint32_t'
> [ ... ]
> 
>>   CPPAS    libc/machine/riscv/libc_a-setjmp.o
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h: Assembler messages:
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h:41: Error: unrecognized opcode `typedef signed char __int8_t'
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h:43: Error: unrecognized opcode `typedef unsigned char __uint8_t'
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h:55: Error: unrecognized opcode `typedef short int __int16_t'
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h:57: Error: unrecognized opcode `typedef short unsigned int __uint16_t'
>> /home/jlaw/jenkins/workspace/riscv64-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h:77: Error: unrecognized opcode `typedef int __int32_t'
> 
> 
> 
> Those two failures make it appear that this change has not been tested at all.

That's strange because I compiled everything during testing and didn't get any errors. I'll send an updated patch for it.

> 
> And it looks like you busted strcpy as well.  This probably only fails with gcc-15 as gcc-15 defaults to c23 where implicit declarations are flagged as hard errors:
> 
>>  CC       libc/machine/riscv/libc_a-strcpy.o
>> ../../../..//newlib-cygwin/newlib/libc/machine/riscv/strcpy.c: In function 'strcpy':
>> ../../../..//newlib-cygwin/newlib/libc/machine/riscv/strcpy.c:17:10: error: implicit declaration of function '__libc_strcpy'; did you mean '__builtin_strcpy'? [-Wimplicit-function-declaration]
>>    17 |   return __libc_strcpy(dst, src, true);
>>       |          ^~~~~~~~~~~~~
>>       |          __builtin_strcpy
>> ../../../..//newlib-cygwin/newlib/libc/machine/riscv/strcpy.c:17:10: error: returning 'int' from a function with return type 'char *' makes pointer from integer without a cast [-Wint-conversion]
>>    17 |   return __libc_strcpy(dst, src, true);
>>       |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
> And stpcpy:
>>   CC       libc/machine/riscv/libc_a-stpcpy.o
>> ../../../..//newlib-cygwin/newlib/libc/machine/riscv/stpcpy.c: In function 'stpcpy':
>> ../../../..//newlib-cygwin/newlib/libc/machine/riscv/stpcpy.c:6:10: error: implicit declaration of function '__libc_strcpy'; did you mean '__builtin_strcpy'? [-Wimplicit-function-declaration]
>>     6 |   return __libc_strcpy(dst, src, false);
>>       |          ^~~~~~~~~~~~~
>>       |          __builtin_strcpy
>> ../../../..//newlib-cygwin/newlib/libc/machine/riscv/stpcpy.c:6:10: error: returning 'int' from a function with return type 'char *' makes pointer from integer without a cast [-Wint-conversion]
>>     6 |   return __libc_strcpy(dst, src, false);
>>       |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> make[1]: *** [Makefile:34809: libc/machine/riscv/libc_a-stpcpy.o] Error 1

Those files are including string.h but it maybe in this case it included the system header instead of the local one. I'll take a look.

Thanks for the heads up.

> 
> 
> 
> Jeff
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.