diff mbox series

add arch-specific predefines

Message ID 20190202235354.36905-1-luc.vanoostenryck@gmail.com (mailing list archive)
State Superseded, archived
Headers show
Series add arch-specific predefines | expand

Commit Message

Luc Van Oostenryck Feb. 2, 2019, 11:53 p.m. UTC
Predefined macros like '__x86_64__', '__arm__', ... are used
in systems headers (and surely at other places too).

So, add them for all archs known to sparse.

Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---

Note: from what I see in glic's code, at least part of these
      are needed for recent versions.
Note: these  are only tested on i386, x86-64, arm, arm64,
      mips64 (ABI O32), ppc, ppc64 (power7), ppc64el (power8)
      and sparc64.

 lib.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 54 insertions(+), 7 deletions(-)

Comments

Ramsay Jones Feb. 3, 2019, 1:55 a.m. UTC | #1
On 02/02/2019 23:53, Luc Van Oostenryck wrote:
> Predefined macros like '__x86_64__', '__arm__', ... are used
> in systems headers (and surely at other places too).
> 
> So, add them for all archs known to sparse.
> 
> Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
> ---
> 
> Note: from what I see in glic's code, at least part of these
>       are needed for recent versions.
> Note: these  are only tested on i386, x86-64, arm, arm64,
>       mips64 (ABI O32), ppc, ppc64 (power7), ppc64el (power8)
>       and sparc64.
> 
>  lib.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 54 insertions(+), 7 deletions(-)
> 
> diff --git a/lib.c b/lib.c
> index ee439b5b9..b8c0e8a5a 100644
> --- a/lib.c
> +++ b/lib.c
> @@ -1314,20 +1314,67 @@ static void predefined_macros(void)
>  		break;
>  	}
>  
> -	if (arch_m64 != ARCH_LP32) {
> -#if defined(__x86_64__) || defined(__x86_64)
> -		predefine("__x86_64__", 1, "1");
> -		predefine("__x86_64", 1, "1");
> -#endif
> -	}
> -
>  	switch (arch_mach) {
> +	case MACH_ARM64:
> +		predefine("__aarch64__", 1, "1");
> +		break;
> +	case MACH_ARM:
> +		predefine("__arm__", 1, "1");
> +		break;
> +	case MACH_M68K:
> +		predefine("__m68k__", 1, "1");
> +		break;
>  	case MACH_MIPS64:
> +		if (arch_m64 == ARCH_LP64)
> +			predefine("__mips64", 1, "64");
> +		/* fall-through */
>  	case MACH_MIPS32:
> +		predefine("__mips", 1, "%d", ptr_ctype.bit_size);
>  		predefine("_MIPS_SZINT", 1, "%d", int_ctype.bit_size);
>  		predefine("_MIPS_SZLONG", 1, "%d", long_ctype.bit_size);
>  		predefine("_MIPS_SZPTR", 1, "%d", ptr_ctype.bit_size);
>  		break;
> +	case MACH_PPC64:
> +		if (arch_m64 == ARCH_LP64) {
> +			predefine("__powerpc64__", 1, "1");
> +			predefine("__ppc64__", 1, "1");
> +		}
> +		/* fall-through */
> +	case MACH_PPC32:
> +		predefine("__powerpc__", 1, "1");
> +		predefine("__powerpc", 1, "1");
> +		predefine("__ppc__", 1, "1");
> +		break;
> +	case MACH_RISCV64:
> +	case MACH_RISCV32:
> +		predefine("__riscv", 1, "1");
> +		predefine("__riscv_xlen", 1, "%d", ptr_ctype.bit_size);
> +		break;
> +	case MACH_S390X:
> +		predefine("__s390x__", 1, "1");
> +		predefine("__zarch__", 1, "1");
> +		break;
> +	case MACH_SPARC64:
> +		if (arch_m64 == ARCH_LP64) {
> +			predefine("__sparc_v9__", 1, "1");
> +			predefine("__arch64__", 1, "1");
> +		}
> +		/* fall-through */
> +	case MACH_SPARC32:
> +		predefine("__sparc__", 1, "1");
> +		predefine("__sparc", 1, "1");
> +		break;
> +	case MACH_X86_64:
> +		if (arch_m64 != ARCH_LP32) {
> +			predefine("__x86_64__", 1, "1");
> +			predefine("__x86_64", 1, "1");
> +			break;
> +		}
> +		/* fall-through */
> +	case MACH_I386:
> +		predefine("__i386__", 1, "1");
> +		predefine("__i386", 1, "1");
> +		break;
>  	}
>  }

These are usually set by cgcc (no reason why sparse can't, of course),
but there are some missing/slightly different values in cgcc. It may
be as well to 'harmonize' the 'specs' used by cgcc and sparse.

ATB,
Ramsay Jones
Luc Van Oostenryck Feb. 3, 2019, 11:40 a.m. UTC | #2
On Sun, Feb 03, 2019 at 01:55:06AM +0000, Ramsay Jones wrote:
> On 02/02/2019 23:53, Luc Van Oostenryck wrote:

...

> > +		/* fall-through */
> > +	case MACH_I386:
> > +		predefine("__i386__", 1, "1");
> > +		predefine("__i386", 1, "1");
> > +		break;
> >  	}
> >  }
> 
> These are usually set by cgcc (no reason why sparse can't, of course),
> but there are some missing/slightly different values in cgcc. It may
> be as well to 'harmonize' the 'specs' used by cgcc and sparse.

Indeed, thanks for noticing this.

-- Luc
diff mbox series

Patch

diff --git a/lib.c b/lib.c
index ee439b5b9..b8c0e8a5a 100644
--- a/lib.c
+++ b/lib.c
@@ -1314,20 +1314,67 @@  static void predefined_macros(void)
 		break;
 	}
 
-	if (arch_m64 != ARCH_LP32) {
-#if defined(__x86_64__) || defined(__x86_64)
-		predefine("__x86_64__", 1, "1");
-		predefine("__x86_64", 1, "1");
-#endif
-	}
-
 	switch (arch_mach) {
+	case MACH_ARM64:
+		predefine("__aarch64__", 1, "1");
+		break;
+	case MACH_ARM:
+		predefine("__arm__", 1, "1");
+		break;
+	case MACH_M68K:
+		predefine("__m68k__", 1, "1");
+		break;
 	case MACH_MIPS64:
+		if (arch_m64 == ARCH_LP64)
+			predefine("__mips64", 1, "64");
+		/* fall-through */
 	case MACH_MIPS32:
+		predefine("__mips", 1, "%d", ptr_ctype.bit_size);
 		predefine("_MIPS_SZINT", 1, "%d", int_ctype.bit_size);
 		predefine("_MIPS_SZLONG", 1, "%d", long_ctype.bit_size);
 		predefine("_MIPS_SZPTR", 1, "%d", ptr_ctype.bit_size);
 		break;
+	case MACH_PPC64:
+		if (arch_m64 == ARCH_LP64) {
+			predefine("__powerpc64__", 1, "1");
+			predefine("__ppc64__", 1, "1");
+		}
+		/* fall-through */
+	case MACH_PPC32:
+		predefine("__powerpc__", 1, "1");
+		predefine("__powerpc", 1, "1");
+		predefine("__ppc__", 1, "1");
+		break;
+	case MACH_RISCV64:
+	case MACH_RISCV32:
+		predefine("__riscv", 1, "1");
+		predefine("__riscv_xlen", 1, "%d", ptr_ctype.bit_size);
+		break;
+	case MACH_S390X:
+		predefine("__s390x__", 1, "1");
+		predefine("__zarch__", 1, "1");
+		break;
+	case MACH_SPARC64:
+		if (arch_m64 == ARCH_LP64) {
+			predefine("__sparc_v9__", 1, "1");
+			predefine("__arch64__", 1, "1");
+		}
+		/* fall-through */
+	case MACH_SPARC32:
+		predefine("__sparc__", 1, "1");
+		predefine("__sparc", 1, "1");
+		break;
+	case MACH_X86_64:
+		if (arch_m64 != ARCH_LP32) {
+			predefine("__x86_64__", 1, "1");
+			predefine("__x86_64", 1, "1");
+			break;
+		}
+		/* fall-through */
+	case MACH_I386:
+		predefine("__i386__", 1, "1");
+		predefine("__i386", 1, "1");
+		break;
 	}
 }