2007-08-06 17:23:41

by Olaf Hering

[permalink] [raw]
Subject: [PATCH] remove strict ansi check from __u64 in asm/types.h


Up to now SuSE used its own version if /usr/include/{asm,linux},
which provided 64bit types for applications.
Recently we switched to a tree generated by make headers_install_all.
This lead to a few fixable compile errors in applications, and reduced
diskspace requirements by the linux-kernel-headers.noarch.rpm

KDE is compiled with -ansi for some reason. All KDE apps get this flag
via the KDE build system.
Kaffeine includes /usr/include/linux/dvb/dmx.h. This header uses __u64.
Kaffeine fails to compile because __u64 is not available.

Remove the __STRICT_ANSI__ check from the __u64/__s64 declaration on
32bit targets.

Here is the reason why we think the check should be relaxed:

....
> > > One thing for example is the -ansi flag in KDE. From what I heard, this
> > > disables all 64bit types on 32bit targets because ANSI has no long long.
> >
> > This is wrong. long long is supported with -ansi just fine.
>
> So is the __STRICT_ANSI__ check in asm/types.h wrong and should be
> removed?

Well, GCC can be made to warn about usage of long long types with ISO C90
(-ansi), but only with -pedantic. You can write this in a way that even
then it doesn't cause warnings, namely by:

#ifdef __GNUC__
__extension__ typedef __signed__ long long __s64;
__extension__ typedef unsigned long long __u64;
#endif

The __extension__ keyword in front of this switches off any pedantic
warnings for this expression.
....

sparc does not wrap __u64 defines for some reason.

(Currently) untested patch below.

Signed-off-by: Olaf Hering <[email protected]>
---
include/asm-arm/types.h | 6 +++---
include/asm-avr32/types.h | 6 +++---
include/asm-blackfin/types.h | 6 +++---
include/asm-cris/types.h | 6 +++---
include/asm-frv/types.h | 6 +++---
include/asm-h8300/types.h | 6 +++---
include/asm-i386/types.h | 6 +++---
include/asm-m32r/types.h | 6 +++---
include/asm-m68k/types.h | 6 +++---
include/asm-mips/types.h | 6 +++---
include/asm-parisc/types.h | 6 +++---
include/asm-powerpc/types.h | 6 +++---
include/asm-s390/types.h | 6 +++---
include/asm-sh/types.h | 6 +++---
include/asm-sh64/types.h | 6 +++---
include/asm-v850/types.h | 6 +++---
include/asm-xtensa/types.h | 6 +++---
17 files changed, 51 insertions(+), 51 deletions(-)

--- a/include/asm-arm/types.h
+++ b/include/asm-arm/types.h
@@ -19,9 +19,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif /* __ASSEMBLY__ */
--- a/include/asm-avr32/types.h
+++ b/include/asm-avr32/types.h
@@ -25,9 +25,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif /* __ASSEMBLY__ */
--- a/include/asm-blackfin/types.h
+++ b/include/asm-blackfin/types.h
@@ -27,9 +27,9 @@ typedef __signed__ int __s32;
typedef unsigned int __u32;

/* HK0617 -- Changes to unsigned long temporarily */
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif /* __ASSEMBLY__ */
--- a/include/asm-cris/types.h
+++ b/include/asm-cris/types.h
@@ -19,9 +19,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif /* __ASSEMBLY__ */
--- a/include/asm-frv/types.h
+++ b/include/asm-frv/types.h
@@ -30,9 +30,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif /* __ASSEMBLY__ */
--- a/include/asm-h8300/types.h
+++ b/include/asm-h8300/types.h
@@ -27,9 +27,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

/*
--- a/include/asm-i386/types.h
+++ b/include/asm-i386/types.h
@@ -19,9 +19,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif /* __ASSEMBLY__ */
--- a/include/asm-m32r/types.h
+++ b/include/asm-m32r/types.h
@@ -19,9 +19,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif
#endif /* __ASSEMBLY__ */

--- a/include/asm-m68k/types.h
+++ b/include/asm-m68k/types.h
@@ -27,9 +27,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif /* __ASSEMBLY__ */
--- a/include/asm-mips/types.h
+++ b/include/asm-mips/types.h
@@ -34,9 +34,9 @@ typedef unsigned long __u64;

#else

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif
--- a/include/asm-parisc/types.h
+++ b/include/asm-parisc/types.h
@@ -19,9 +19,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif /* __ASSEMBLY__ */
--- a/include/asm-powerpc/types.h
+++ b/include/asm-powerpc/types.h
@@ -40,9 +40,9 @@ typedef unsigned int __u32;
typedef __signed__ long __s64;
typedef unsigned long __u64;
#else
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif
#endif /* __powerpc64__ */

--- a/include/asm-s390/types.h
+++ b/include/asm-s390/types.h
@@ -28,9 +28,9 @@ typedef __signed__ int __s32;
typedef unsigned int __u32;

#ifndef __s390x__
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif
#else /* __s390x__ */
typedef __signed__ long __s64;
--- a/include/asm-sh/types.h
+++ b/include/asm-sh/types.h
@@ -19,9 +19,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif /* __ASSEMBLY__ */
--- a/include/asm-sh64/types.h
+++ b/include/asm-sh64/types.h
@@ -30,9 +30,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif /* __ASSEMBLY__ */
--- a/include/asm-v850/types.h
+++ b/include/asm-v850/types.h
@@ -27,9 +27,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

#endif /* !__ASSEMBLY__ */
--- a/include/asm-xtensa/types.h
+++ b/include/asm-xtensa/types.h
@@ -29,9 +29,9 @@ typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;

-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
+#if defined(__GNUC__)
+__extension__ typedef __signed__ long long __s64;
+__extension__ typedef unsigned long long __u64;
#endif

/*


2007-08-06 17:41:30

by H. Peter Anvin

[permalink] [raw]
Subject: Re: [PATCH] remove strict ansi check from __u64 in asm/types.h

Olaf Hering wrote:
>
> Remove the __STRICT_ANSI__ check from the __u64/__s64 declaration on
> 32bit targets.
>
> Here is the reason why we think the check should be relaxed:
>

I think the fact that "long long" was made official C in C99 is good
enough. Flagging them as __extension__ is okay, I guess, but something
like this should definitely go in.

-hpa

2007-08-07 00:13:40

by Mike Frysinger

[permalink] [raw]
Subject: Re: [PATCH] remove strict ansi check from __u64 in asm/types.h

On 8/6/07, H. Peter Anvin <[email protected]> wrote:
> Olaf Hering wrote:
> >
> > Remove the __STRICT_ANSI__ check from the __u64/__s64 declaration on
> > 32bit targets.
> >
> > Here is the reason why we think the check should be relaxed:
>
> I think the fact that "long long" was made official C in C99 is good
> enough. Flagging them as __extension__ is okay, I guess, but something
> like this should definitely go in.

the patch we (Gentoo) tried posting a while ago never saw any response:
http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo/src/patchsets/gentoo-headers/2.6.22/35_all_c99-types.patch?rev=1.2
-mike

2007-08-07 13:57:49

by Michael Matz

[permalink] [raw]
Subject: Re: [PATCH] remove strict ansi check from __u64 in asm/types.h

Hi,

On Mon, 6 Aug 2007, Mike Frysinger wrote:

> On 8/6/07, H. Peter Anvin <[email protected]> wrote:
> > Olaf Hering wrote:
> > >
> > > Remove the __STRICT_ANSI__ check from the __u64/__s64 declaration on
> > > 32bit targets.
> > >
> > > Here is the reason why we think the check should be relaxed:
> >
> > I think the fact that "long long" was made official C in C99 is good
> > enough. Flagging them as __extension__ is okay, I guess, but something
> > like this should definitely go in.
>
> the patch we (Gentoo) tried posting a while ago never saw any response:
> http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo/src/patchsets/gentoo-headers/2.6.22/35_all_c99-types.patch?rev=1.2

That would still make it not work with programs compiled with just -ansi
or -std=c90 (both being equivalent) with -pedantic added. There still are
such. Only for that case is the __extension__ prefix necessary.


Ciao,
Michael.

2007-08-10 08:27:43

by Olaf Hering

[permalink] [raw]
Subject: Re: [PATCH] remove strict ansi check from __u64 in asm/types.h

On Mon, Aug 06, Olaf Hering wrote:

> Remove the __STRICT_ANSI__ check from the __u64/__s64 declaration on
> 32bit targets.

> (Currently) untested patch below.

We tested this now, and it did not cause failures.

Andrew, will you pick this up?

2007-08-10 08:35:46

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] remove strict ansi check from __u64 in asm/types.h

On Fri, 10 Aug 2007 10:27:26 +0200 Olaf Hering <[email protected]> wrote:

> On Mon, Aug 06, Olaf Hering wrote:
>
> > Remove the __STRICT_ANSI__ check from the __u64/__s64 declaration on
> > 32bit targets.
>
> > (Currently) untested patch below.
>
> We tested this now, and it did not cause failures.
>
> Andrew, will you pick this up?

can take a look, sure. Can you send a version with a less scruffy-looking
changelog please?

2007-08-12 18:07:30

by Mike Frysinger

[permalink] [raw]
Subject: Re: [PATCH] remove strict ansi check from __u64 in asm/types.h

On 8/7/07, Michael Matz <[email protected]> wrote:
> That would still make it not work with programs compiled with just -ansi
> or -std=c90 (both being equivalent) with -pedantic added. There still are
> such. Only for that case is the __extension__ prefix necessary.

i thought the point was it's supposed to fail with just -ansi and the
default standard (c89)

at any rate, as long as your changes account for all the files in the
patch i posted, that's fine by me
-mike