Non-gcc compilers

Alexander Leidinger Alexander at Leidinger.net
Mon Nov 17 02:58:33 PST 2003


On Sun, 16 Nov 2003 14:40:02 -0800 (PST)
Matthew Dillon <dillon at xxxxxxxxxxxxxxxxxxxx> wrote:

(CCing Marius Strobl, as he contributed parts of the patchset)

> :Please check if you have the patch with the in_cksum.c diff (using the 
> :asm version doesn't work with icc, ATM I don't know if this is a bug in 
> :the asm or in icc).
> 
>     Yes, I've got that, though I am horrified!  Horrified by the in_cksum
>     code, that is, not the patch :-).  Holy cow!

The first time I looked at it I was a little bit irritated too. I've
first seen the short asm version in in_cksum.h and then was pointed to
the huge C version. As I just wanted to get it working, I've just copied
the bits from sys/alpha/alpha/in_cksum.c and tested the resulting
kernel.

If someone decides to improve the C version, he should also have a look
at the asm version (I'm interested to see the final diff). In an
discussions on the developers list David O'Brien told us:
---snip---
> Of course, there are other possibilities.  For instance, it could
> be an icc bug...

No it is our code bug.  This is now one of the biggest reasons we can't
build i386 kernels with -O2.  The GCC bugs that bit us before are
[mostly] gone.
---snip---

>     I am augmenting the mk/*.mk files by adding a CC_CLASS variable which
>     classifies the compiler as "icc" or "gcc".  This way the CC variable
>     can be set to a particular version of an icc or gcc compiler without
>     messing up the conditionals (e.g. 'gcc33').

Sounds good in principle, but I wait for the actual implementation
before I comment further.

>     I am adjusting the cdefs.h.  This is what I have for cdefs.h so far.
>     It's a little messy at the moment, but what it comes down to is that I
>     am removing all __GNUC__ tests from the rest of the kernel codebase and
>     replacing those tests with __COMPILER_XXX_SUPPORTED__ tests.   This way
>     we will be able to work on compiler support entirely within the .mk and
>     cdefs.h files once the rest of the system source is conforming.

Looks good so far, I'm commenting more inline. You have to increase the
__DragonFly_version if you import the cdehs.h changes, the icc ports
doesn't have to install the cdefs.h replacement header and needs a way
to know about it.

[parts of cdefs.h]
> #if defined(__GNUC__) || defined(__INTEL_COMPILER)
> #define __COMPILER_GNULIKE__
> #define __COMPILER_DOTDOT_MACROS_SUPPORTED__
> #define __COMPILER_INLINES_SUPPORTED__
> #define __COMPILER_GNULIKE_ATTRIBUTE_SUPPORTED__
> #define __COMPILER_GNULIKE_ASM_SUPPORTED__
> #endif

FreeBSD (and dragonfly) have an additional attribute which isn't in the
original gcc version and therefore isn't suported in icc.
__COMPILER_GNULIKE_ATTRIBUTE_SUPPORTED__ is not enough for this (or you
have to special case the FreeBSD specific attribute).

Do you want to include cdefs.h in every file which uses inline assembly?

> #if defined(__GNUC__) && (__GNUC__ == 2 && __GNUC_MINOR__ > 95 || __GNUC__ >= 3)
> #define __COMPILER_GNULIKE_VALIST__
> #elif defined(__INTEL_COMPILER)
> /*#define __COMPILER_GNULIKE_VALIST__ NOT YET */
> #endif
> 
> #if (defined(__GNUC__) && __GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ > 9)
> #define __COMPILER_GNULIKE_ASM_SUPPORTED2__
> #elif defined(__ICC)
> #define __COMPILER_GNULIKE_ASM_SUPPORTED2__
> #endif
> 
> #if defined(__GNUC__)
> #if __GNUC__ >= 2
> #define __COMPILER_PRAGMA_PACK_SUPPORTED__
> #endif
> #elif defined(__INTEL_COMPILER)
> #define __COMPILER_PRAGMA_PACK_SUPPORTED__
> #endif

Why don't you merge them together (defined(__GNUC__) ||
defined(__INTEL_COMPILER)), do you want a strict separation?

> #if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7
> #define __dead2		__attribute__((__noreturn__))
> #define __pure2		__attribute__((__const__))
> #define __unused
> #elif __GNUC_PREREQ__(2, 7)
> #define __dead2		__attribute__((__noreturn__))
> #define __pure2		__attribute__((__const__))
> #define __unused	__attribute__((__unused__))
> #define __packed        __attribute__((__packed__))
> #define __aligned(x)    __attribute__((__aligned__(x)))
> #define __section(x)    __attribute__((__section__(x)))
> #elif defined(__INTEL_COMPILER)
> #define __dead2		__attribute__((__noreturn__))
> #define __pure2		__attribute__((__const__))
> #define __unused	__attribute__((__unused__))
> #define __packed	__attribute__((__packed__))
> #define __aligned(x)	__attribute__((__aligned__(x)))
> #define __section(x)	__attribute__((__section__(x)))
> #elif !defined(__COMPILER_GNULIKE__)
> #define __dead2
> #define __pure2
> #define __unused
> #endif

Do you intent to use the __COMPILER_GNULIKE_ATTRIBUTE_SUPPORTED__ define
here?

> /* XXX: should use `#if __STDC_VERSION__ < 199901'. */
> #if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER)
> #define __func__        NULL
> #endif
> 
> #endif	/* LINT */
> 
> /* XXX: should use `#if __STDC_VERSION__ < 199901'. */
> #if !(__GNUC__ == 2 && __GNUC_MINOR__ >= 7 || __GNUC__ >= 3)
> #define	__func__	NULL
> #endif

I assume this isn't intended.

> /*
>  * Compiler-dependent macros to declare that functions take printf-like
>  * or scanf-like arguments.  They are null except for versions of gcc
>  * that are known to support the features properly (old versions of gcc-2
>  * didn't permit keeping the keywords out of the application namespace).
>  */
> #if __GNUC__ < 2 || __GNUC__ == 2 && __GNUC_MINOR__ < 7
> #define	__printflike(fmtarg, firstvararg)
> #define	__scanflike(fmtarg, firstvararg)
> #else
> #define	__printflike(fmtarg, firstvararg) \
> 	    __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
> #define	__scanflike(fmtarg, firstvararg) \
> 	    __attribute__((__format__ (__scanf__, fmtarg, firstvararg)))
> #endif
> 
> /* Compiler-dependent macros that rely on FreeBSD-specific extensions. */
> #if __FreeBSD_cc_version >= 300001
> #define	__printf0like(fmtarg, firstvararg) \
> 	    __attribute__((__format__ (__printf0__, fmtarg, firstvararg)))
> #else
> #define	__printf0like(fmtarg, firstvararg)
> #endif

I have to test if those are supported in a recent icc...

> #if defined(__GNUC__) || defined(__ICC)
> #ifndef __INTEL_COMPILER
> #define __strong_reference(sym,aliassym)	\
> 	extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym)));
> #endif

. ..and this too.

Bye,
Alexander.

-- 
      ...and that is how we know the Earth to be banana-shaped.

http://www.Leidinger.net                       Alexander @ Leidinger.net
  GPG fingerprint = C518 BC70 E67F 143F BE91  3365 79E2 9C60 B006 3FE7





More information about the Kernel mailing list