__x86_64__ not defined

On my Debian X86_64 some tests fail because clang searches for stubs-32.h when it should be searching for stubs-64.h, and that's because __x86_64__ is not defined, so "# define __WORDSIZE 32" is chosen instead of "# define __WORDSIZE 64".

In answer to your specific problem, please try passing "-arch x86_64" to clang.

There is a bigger answer here though. Right now, clang is overly mac-specific and the target handling code is basically hacked in. What we really want is for clang to transparently support cross compilation and architecture switching. Specifically, we want to be able to do things like:

$ clang -arch ppc -os linux ...
$ clang -target-triple powerpc-apple-darwin8 ...
$ clang -arch x86_64 ...

The idea is that clang can support cross compiling very easily, by linking in any or all of the LLVM backends that are interesting for a person, or dynamically load them from the disk if needed. If you build a "maximal" clang with support for all backends, you should be able to select any supported target with the -target-triple option. This would allow you to pick your os and architecture in one step.

If the target triple is not specific, clang should default to matching the architecture and os that it is running on. To tweak that, the -arch option can be used to change just the architecture, independently of the os. On a darwin ppc box, for example "clang -arch x86_64" would produce code for darwin/x86-64.

Right now, the major framework for supporting multiple targets is in place, but not multiple OS's. Also, there is not really any good code for detecting and specifying OS-specific #defines etc.

Any help with this would be appreciated, the relevant code is very simple and lives in Driver/Targets.cpp.