Builtin defines from gcc are useful - they give you some information about your arch.
__amd64__ and so on.
sparc is a little wierd - here's a quick list
Now, FreeBSD only supports Sparc64 and has lots of checks using
#ifdef __sparc64__. At first glance, this looks OK and there appears to be nothing wrong with it. However, gcc likes to define
__sparc64__ as a CPU type (as I understand it) and is no guarantee of 64-bit code. As such, if you use
-mcpu=ultrasparc (which is valid) then it drops the
__sparc64__ define as we're targeting a specific CPU model - namely the v9. A FreeBSD developer submitted a gcc patch to always define
__sparc64__ but this was rejected, and looks like for good reasons too.
Of course, we can always say "dude, don't use -mcpu in your CFLAGS" and the issue magically goes away. Not so! In gcc-4, FreeBSD defaults to using -mcpu=ultrasparc which means that it never defines
__sparc64__ which in turn means a vanilla gcc cannot compile FreeBSD code! Which explains why the default compiler on FreeBSD is gcc-3.4.6. Interesting we cannot use that version in Gentoo as our 3.4.6 never exports the
__arch64__ define (or any other 64-bit defines) but still compiles 64-bit code. Weird. Anyway, our gcc-4.1.1 is fine for us.
So I'm busy writing patches to change
__sparc__ as most of the time the code isn't 64-bit specific anyway. If it is, then it becomes
__arch64__ which works fine 😃
I dunno if upsteam will accept it, but I'll email it to them anyway when I'm done 😛