On Tue, 2022-08-02 at 11:10 +0000, YunQiang Su wrote:

> If we cannot get info from options and cpuinfo, we try to get from:
>   1. getauxval(AT_BASE_PLATFORM), introduced since Linux 5.7
>   2. _MIPS_ARCH from host compiler.
> 
> This can fix the wrong loader usage on r5/r6 platform with
>  -march=native.

/* snip */

>    if (argc < 1)
> -    return NULL;
> +    goto fallback_cpu;

I don't think this should be changed, if argc < 1 it means the spec
(disambiguation: the thing printed by "gcc -dumpspecs", hard coded in
gnu-user.h) is wrong.  It cannot happen with the built-in spec, but if a
user specifies a bad custom spec with "-spec", we shouldn't be tricked.

>    arch = strcmp (argv[0], "arch") == 0;
>    if (!arch && strcmp (argv[0], "tune"))
> -    return NULL;
> +    goto fallback_cpu;

Likewise.

>    f = fopen ("/proc/cpuinfo", "r");
>    if (f == NULL)
> -    return NULL;
> +    goto fallback_cpu;

OK.

> +fallback_cpu:
> +/*FIXME: how about other OSes, like FreeBSD? */

https://reviews.freebsd.org/D12743 added elf_aux_info as a counterpart
of getauxinfo, but it looks like FreeBSD does not have AT_BASE_PLATFORM.

> +#ifdef __linux__
> +  /*Note: getauxval may return NULL as:
> +   * AT_BASE_PLATFORM is supported since Linux 5.7
> +   * Or from older version of qemu-user
> +   * */
> +  if (cpu == NULL)
> +    cpu = (const char *) getauxval (AT_BASE_PLATFORM);

getauxval is added in Glibc-2.16 so it will fail to build on hosts with
old glibc or other libc implementation.  Check if getauxval and
AT_BASE_PLATFORM are available (in gcc/configure.ac) instead of an
inaccurate "#ifdef __linux__".

> +#endif
> +
>    if (cpu == NULL)
> +#if defined (_MIPS_ARCH)
> +    cpu = _MIPS_ARCH;
> +#else

Ok.

>      return NULL;
> +#endif
>  
>    return concat ("-m", argv[0], "=", cpu, NULL);
>  }

Reply via email to