AArch64 ILP32 strcmp bug

Richard Earnshaw Richard.Earnshaw@foss.arm.com
Thu Nov 26 19:02:45 GMT 2020


On 26/11/2020 18:41, Keith Packard wrote:
> Joel Sherrill via Newlib <newlib@sourceware.org> writes:
> 
>> In the meantime, would you think a patch to disable the optimized
>> method when ilp32 is appropriate for newlib? There is still the risk of
>> other methods having bugs. The alternative I see is to completely
>> PREFER_SIZE_OVER_SPEED for aarch64 and disable all of the
>> aarch64 assembly which seems worse.
> 
> There's also setjmp/longjmp, which are only available in assembly form.
> 
> Here's a completely untested patch (I'm afraid I don't have an ilp32
> aarch64 compiler available today) which may help with that:
> 
> diff --git a/newlib/libc/machine/aarch64/setjmp.S b/newlib/libc/machine/aarch64/setjmp.S
> index 0856145bf..df94eebd1 100644
> --- a/newlib/libc/machine/aarch64/setjmp.S
> +++ b/newlib/libc/machine/aarch64/setjmp.S
> @@ -45,6 +45,9 @@
>  	.global	setjmp
>  	.type	setjmp, %function
>  setjmp:
> +#ifndef __LP64__
> +	mov	w0, w0
> +#endif
>  	mov	x16, sp
>  #define REG_PAIR(REG1, REG2, OFFS)	stp REG1, REG2, [x0, OFFS]
>  #define REG_ONE(REG1, OFFS)		str REG1, [x0, OFFS]
> @@ -60,6 +63,10 @@ setjmp:
>  	.global	longjmp
>  	.type	longjmp, %function
>  longjmp:
> +#ifndef __LP64__
> +	mov	w0, w0
> +#endif
> +	
>  #define REG_PAIR(REG1, REG2, OFFS)	ldp REG1, REG2, [x0, OFFS]
>  #define REG_ONE(REG1, OFFS)		ldr REG1, [x0, OFFS]
>  	GPR_LAYOUT
> 

AFAICT gcc doesn't define __LP64__, so I don't think this will work;
it's also backwards - you shouldn't assume that because __LP64__ isn't
defined that we have a 32-bit pointer.  GCC does, however, define
__ILP32__ when building for that ABI.

The right way to do this is to create a new header file,
machine/aarch64/machine/asm.h, which contains a gas macro called, lets
say `ptr_param', that takes the *number* of register argument and is
then conditionally defined to either nothing or an assembly statement
that narrows the register with that number.  In the main function code
you can then write simply

	ptr_param 0

and avoid all conditional assembly in the main source files.

R.


More information about the Newlib mailing list