How to list supported target architectures in clang?

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 --version will 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=help will 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!

Leave a Comment