You can pass -DLLVM_TARGETS_TO_BUILD=X86 to the initial cmake invocation.
compilation - How to compile LLVM with a specific target - Stack Overflow
Help with Values of LLVM_TARGETS_TO_BUILD
How to list supported target architectures in clang? - Stack Overflow
build of clang with LLVM_TARGETS_TO_BUILD set to X86 breaks when building clang shared library
Videos
I found the stable instruction sets yet can't find any additional info on them, which one does x64 fall under? Or can I just pass "x64" to "LLVM_TARGETS_TO_BUILD" and magic will happen? I Only want to compile what is needed for the target.
The list I found; AArch64, AMDGPU, ARM, AVR, BPF, Hexagon, Lanai, Mips, MSP430, NVPTX, PowerPC, RISCV, Sparc, SystemZ, WebAssembly, X86, XCore.
Starting with Clang 11 (trunk), the list of supported target architectures could be handily printed using the newly added -print-targets flag:
$ clang -print-targets
Registered Targets:
aarch64 - AArch64 (little endian)
aarch64_32 - AArch64 (little endian ILP32)
aarch64_be - AArch64 (big endian)
amdgcn - AMD GCN GPUs
arm - ARM
arm64 - ARM64 (little endian)
arm64_32 - ARM64 (little endian ILP32)
armeb - ARM (big endian)
avr - Atmel AVR Microcontroller
bpf - BPF (host endian)
bpfeb - BPF (big endian)
bpfel - BPF (little endian)
hexagon - Hexagon
lanai - Lanai
mips - MIPS (32-bit big endian)
mips64 - MIPS (64-bit big endian)
mips64el - MIPS (64-bit little endian)
mipsel - MIPS (32-bit little endian)
msp430 - MSP430 [experimental]
nvptx - NVIDIA PTX 32-bit
nvptx64 - NVIDIA PTX 64-bit
ppc32 - PowerPC 32
ppc64 - PowerPC 64
ppc64le - PowerPC 64 LE
r600 - AMD GPUs HD2XXX-HD6XXX
riscv32 - 32-bit RISC-V
riscv64 - 64-bit RISC-V
sparc - Sparc
sparcel - Sparc LE
sparcv9 - Sparc V9
systemz - SystemZ
thumb - Thumb
thumbeb - Thumb (big endian)
wasm32 - WebAssembly 32-bit
wasm64 - WebAssembly 64-bit
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
xcore - XCore
References: LLVM PR, LLVM commit, Clang 11 documentation.
So far as I can tell, there is no command-line option to list which architectures a given clang binary supports, and even running strings on it doesn't really help. Clang is essentially just a C to LLVM translator, and it's LLVM itself that deals with the nitty-gritty of generating actual machine code, so it's not entirely surprising that Clang isn't paying much attention to the underlying architecture.
As others have already noted, you can ask llc which architectures it supports. This isn't all that helpful not just because these LLVM components might not be installed, but because of the vagaries of search paths and packaging systems, your llc and clang binaries may not correspond to the same version of LLVM.
However, for the sake of argument, let's say that you compiled both LLVM and Clang yourself or that you're otherwise happy to accept your LLVM binaries as good enough:
llc --versionwill give a list of all architectures it supports. By default, it is compiled to support all architectures. What you may think of as a single architecture such as ARM may have several LLVM architectures such as regular ARM, Thumb and AArch64. This is mainly for implementation convenience because the different execution modes have very different instruction encodings and semantics.- For each of the architectures listed,
llc -march=ARCH -mattr=helpwill list "available CPUs" and "available features". The CPUs are generally just a convenient way of setting a default collection of features.
But now for the bad news. There is no convenient table of triples in Clang or LLVM that can be dumped, because the architecture-specific backends have the option of parsing the triple string into an llvm::Triple object (defined in include/llvm/ADT/Triple.h). In other words, to dump all available triples requires solving the Halting Problem. See, for example, llvm::ARM_MC::ParseARMTriple(...) which special-cases parsing the string "generic".
Ultimately, though, the "triple" is mostly a backwards-compatibility feature to make Clang a drop-in replacement for GCC, so you generally don't need to pay much attention to it unless you are porting Clang or LLVM to a new platform or architecture. Instead, you will probably find the output of llc -march=arm -mattr=help and boggling at the huge array of different ARM features to be more useful in your investigations.
Good luck with your research!
Try setting:
export CFLAGS="-m32"
export LDFLAGS="-m32"
before compiling...
Could you try this series of commands and see if it works? Theoretically if you provided llvm-gcc with the -m32 option these steps should be taken by llvm-gcc, but maybe it's not working correctly, so let's make all the steps explicit:
llvm-gcc -m32 -emit-llvm test.c -c -o test.bc
llc test.bc -march=x86 -o test.S
gcc test.S -m32 -o test
This should be the sequence of steps (or something similar) that llvm-gcc performs implicitly, but it looks like in your case it's emitting 64bit assembly for some reason, then trying to assemble and link it for 32bit.