铛:如何列出支持的目标架构?

目前我一般对ARM有兴趣,特别是iphone / android目标。 但是我只想更多地了解铿锵声,因为它感觉在未来几年发挥重要作用。

我试过了

clang -cc1 --help|grep -i list clang -cc1 --help|grep arch|grep -v search clang -cc1 --help|grep target -triple <value> Specify target triple (eg i686-apple-darwin9) 

我知道铿有三元参数,但我怎么能列出所有可能的值? 我发现clang与gcc在交叉编译方面有很大的不同,在GCC世界里,你应该为每个东西都分开二进制文件,比如PLATFORM_make或者PLATFORM_ld(我* 86-pc-cygwin我* 86 – * – linux-gnu等等http ://git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS )

在叮当世界,这只是一个二进制(正如我在一些论坛上看到的)。 但是,如何获得支持的目标列表? 如果我的目标不支持我的发行版(linux / windows / macos /其他),我怎么能得到支持更多平台的?

如果我SVN最新的铿锵这样的:

 svn co http://llvm.org/svn/llvm-project/cfe/trunk clang 

我会获得大部分的平台吗? 看起来Clang并不是立刻用交叉编译来构build的,但是因为它是基于llvm的,理论上应该是非常交叉友好的? 谢谢!

我使用的是Clang 3.3,我认为得到答案的最好方法是阅读源代码。 在llvm / ADT / Triple.h中( http://llvm.org/doxygen/Triple_8h_source.html ):

  enum ArchType { UnknownArch, arm, // ARM: arm, armv.*, xscale aarch64, // AArch64: aarch64 hexagon, // Hexagon: hexagon mips, // MIPS: mips, mipsallegrex mipsel, // MIPSEL: mipsel, mipsallegrexel mips64, // MIPS64: mips64 mips64el,// MIPS64EL: mips64el msp430, // MSP430: msp430 ppc, // PPC: powerpc ppc64, // PPC64: powerpc64, ppu r600, // R600: AMD GPUs HD2XXX - HD6XXX sparc, // Sparc: sparc sparcv9, // Sparcv9: Sparcv9 systemz, // SystemZ: s390x tce, // TCE (http://tce.cs.tut.fi/): tce thumb, // Thumb: thumb, thumbv.* x86, // X86: i[3-9]86 x86_64, // X86-64: amd64, x86_64 xcore, // XCore: xcore mblaze, // MBlaze: mblaze nvptx, // NVPTX: 32-bit nvptx64, // NVPTX: 64-bit le32, // le32: generic little-endian 32-bit CPU (PNaCl / Emscripten) amdil, // amdil: amd IL spir, // SPIR: standard portable IR for OpenCL 32-bit version spir64 // SPIR: standard portable IR for OpenCL 64-bit version }; 

在clang / lib / Driver / ToolChains.cpp中有关于arm的信息。

 static const char *GetArmArchForMArch(StringRef Value) { return llvm::StringSwitch<const char*>(Value) .Case("armv6k", "armv6") .Case("armv6m", "armv6m") .Case("armv5tej", "armv5") .Case("xscale", "xscale") .Case("armv4t", "armv4t") .Case("armv7", "armv7") .Cases("armv7a", "armv7-a", "armv7") .Cases("armv7r", "armv7-r", "armv7") .Cases("armv7em", "armv7e-m", "armv7em") .Cases("armv7f", "armv7-f", "armv7f") .Cases("armv7k", "armv7-k", "armv7k") .Cases("armv7m", "armv7-m", "armv7m") .Cases("armv7s", "armv7-s", "armv7s") .Default(0); } static const char *GetArmArchForMCpu(StringRef Value) { return llvm::StringSwitch<const char *>(Value) .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5") .Cases("arm10e", "arm10tdmi", "armv5") .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5") .Case("xscale", "xscale") .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "arm1176jzf-s", "armv6") .Case("cortex-m0", "armv6m") .Cases("cortex-a8", "cortex-r4", "cortex-a9", "cortex-a15", "armv7") .Case("cortex-a9-mp", "armv7f") .Case("cortex-m3", "armv7m") .Case("cortex-m4", "armv7em") .Case("swift", "armv7s") .Default(0); } 

据我所知,没有命令行选项来列出给定的clang二进制文件支持哪些体系结构,甚至在其上运行strings也没有什么帮助。 Clang本质上只是一个C到LLVM的翻译器,LLVM本身就是处理生成实际机器代码的本质,所以Clang不太关注底层架构。

正如其他人已经指出的那样,你可以询问一下它所支持的体系结构。 这不仅仅是因为这些LLVM组件可能没有安装,而是因为searchpath和打包系统的变幻莫测,你的llcclang二进制文件可能不对应于同一版本的LLVM。

然而,为了辩论起见,假设你自己编译了LLVM和Clang,否则你很乐意接受你的LLVM二进制文件:

  • llc --version将列出它支持的所有体系结构。 默认情况下,它被编译为支持所有体系结构。 你可能认为像ARM这样的单一体系结构可能有几种LLVM体系结构,比如常规的ARM,Thumb和AArch64。 这主要是为了实现方便,因为不同的执行模式有很不相同的指令编码和语义。
  • 对于列出的每个体系结构, llc -march=ARCH -mattr=help将列出“可用CPU”和“可用function”。 CPU通常只是设置默认function集合的便捷方式。

但是现在这个坏消息。 由于特定于体系结构的后端可以将三元stringparsing为一个llvm::Triple对象(在include / llvm / ADT / Triple.h中定义),因此Clang或LLVM中没有可方便转储的三元组表格。 。 换句话说,转储所有可用的三元组需要解决停机问题。 例如,请参阅llvm::ARM_MC::ParseARMTriple(...)哪些特殊情况parsingstring"generic"

但最终,“三联”主要是一个向后兼容的function,使Clang成为GCC的替代品,所以除非将Clang或LLVM移植到新的平台,否则通常不需要太多的关注或架构。 相反,您可能会发现llv -march=arm -mattr=help的输出,并且在大量不同的ARMfunction上llv -march=arm -mattr=help ,对您的调查更加有用。

祝你好运!

根据Jonathan Roelofs的讲话: “Clang支持哪些目标?” :

 $ llc --version LLVM (http://llvm.org/): LLVM version 3.6.0 Optimized build with assertions. Built Apr 2 2015 (01:25:22). Default target: x86_64-apple-darwin12.6.0 Host CPU: corei7-avx Registered Targets: aarch64 - AArch64 (little endian) aarch64_be - AArch64 (big endian) amdgcn - AMD GCN GPUs arm - ARM arm64 - ARM64 (little endian) armeb - ARM (big endian) cpp - C++ backend hexagon - Hexagon mips - Mips mips64 - Mips64 [experimental] mips64el - Mips64el [experimental] mipsel - Mipsel 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 sparc - Sparc sparcv9 - Sparc V9 systemz - SystemZ thumb - Thumb thumbeb - Thumb (big endian) x86 - 32-bit X86: Pentium-Pro and above x86-64 - 64-bit X86: EM64T and AMD64 xcore - XCore 

未来版本的Clang可能会提供以下内容。 它们被列为“提议”,至less在3.9.0版本还没有提供:

 $ clang -target <target_from_list_above> --print-multi-libs $ clang -print-supported-archs $ clang -march x86 -print-supported-systems $ clang -march x86 -print-available-systems 

也试试

 > llc -mattr=help Available CPUs for this target: amdfam10 - Select the amdfam10 processor. athlon - Select the athlon processor. athlon-4 - Select the athlon-4 processor. athlon-fx - Select the athlon-fx processor. athlon-mp - Select the athlon-mp processor. athlon-tbird - Select the athlon-tbird processor. athlon-xp - Select the athlon-xp processor. athlon64 - Select the athlon64 processor. athlon64-sse3 - Select the athlon64-sse3 processor. atom - Select the atom processor. ... Available features for this target: 16bit-mode - 16-bit mode (i8086). 32bit-mode - 32-bit mode (80386). 3dnow - Enable 3DNow! instructions. 3dnowa - Enable 3DNow! Athlon instructions. 64bit - Support 64-bit instructions. 64bit-mode - 64-bit mode (x86_64). adx - Support ADX instructions. ... 

你可以做的一个提示:如果你想find一个特定的目标三倍,是在该系统上安装llvm然后做一个

 $ llc --version | grep Default Default target: x86_64-apple-darwin16.1.0 

或者可选地:

 $ llvm-config --host-target x86_64-apple-darwin16.0.0 or $ clang -v 2>&1 | grep Target Target: x86_64-apple-darwin16.1.0 

然后你知道如何在交叉编译的时候把它作为目标。

显然有很多的目标在这里,这里有一个列表,随意添加到它,社区维基风格:

 arm-none-eabi armv7a-none-eabi arm-linux-gnueabihf arm-none-linux-gnueabi i386-pc-linux-gnu x86_64-apple-darwin10 i686-w64-windows-gnu # same as i686-w64-mingw32 x86_64-pc-linux-gnu # from ubuntu 64 bit x86_64-unknown-windows-cygnus # cygwin 64-bit x86_64-w64-windows-gnu # same as x86_64-w64-mingw32 

这里是文档列表(显然这是一个四倍(或五倍),而不是三倍这些天):

 The triple has the general format <arch><sub>-<vendor>-<sys>-<abi>, where: arch = x86, arm, thumb, mips, etc. sub = for ex. on ARM: v5, v6m, v7a, v7m, etc. vendor = pc, apple, nvidia, ibm, etc. sys = none, linux, win32, darwin, cuda, etc. abi = eabi, gnu, android, macho, elf, etc. 

你甚至可以微调指定一个目标CPU超出这个,虽然它使用一个合理的默认目标CPU基于三重。

有时候目标会“解决”到同样的事情上,所以要看看目标实际上是怎样被对待的:

  $ clang -target x86_64-w64-mingw32 -v 2>&1 | grep Target Target: x86_64-w64-windows-gnu 

它不会列出所有的三元组,但是

 llvm-as < /dev/null | llc -mcpu=help 

至less会列出所有的CPU。