铛:如何列出支持的目标架构?(clang: how to list supported target

2019-07-20 09:46发布

目前我感兴趣的一般和具体的iPhone / Android的目标ARM。 但我只是想知道更多关于铛,因为它认为在未来的几年里发挥重要的作用。

我试过了

clang -cc1 --help|grep -i list
clang -cc1 --help|grep arch|grep -v search
clang -cc1 --help|grep target

 -triple <value>         Specify target triple (e.g. i686-apple-darwin9)

我知道铛具有三重峰参数,但我怎么能列出所有可能的值呢? 我发现,铛是关于交叉编译GCC的非常不同,在GCC世界里,你应该有一切单独的二进制,像PLATFORM_make或PLATFORM_ld(I * 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

我会得到大多数的平台? 它看起来像锵并没有充分考虑交叉编译建向右走,但由于它是基于LLVM它理论上应该是非常交叉友好? 谢谢!

Answer 1:

到目前为止,我所知道的,没有命令行选项列出该架构给定的clang二进制支持,甚至跑strings上它并没有真正的帮助。 锵本质上只是一个C到LLVM翻译,这是LLVM本身与产生实际的机器代码的基本事实的交易,所以它不是完全不足为奇锵并不十分重视底层架构。

正如其他人已经指出的那样,你可以问llc该架构支持。 这是不是所有的有用的不只是因为可能没有安装这些组件LLVM但由于搜索路径和包装系统变幻莫测的,你的llcclang的二进制文件可能不对应于同一版本LLVM的。

然而,争论的缘故,让我们说,你既编译LLVM以及锵自己或你是另有愉快地接受你的LLVM二进制文件不够好:

  • llc --version会给它支持所有架构的列表。 默认情况下,它被编译为支持所有架构。 你可能觉得作为一个单一的架构,如ARM可能有几个LLVM架构如定期的ARM,Thumb和AArch64。 这主要是为了方便执行,因为不同的执行方式有很大不同的指令编码和语义。
  • 对于每个列出的架构中, llc -march=ARCH -mattr=help会列出“可用CPU”和“可用的功能”。 CPU的一般设定功能默认集合的一种简便方法。

但是,现在的坏消息。 有在铛或LLVM三元组可被倾倒的没有方便的表,因为特定体系结构的后端具有解析三重串入一个的选项llvm::Triple对象(定义在包括/ LLVM / ADT / Triple.h ) 。 换句话说,倾倒所有可用的三元组需要解决停机问题。 见,例如, llvm::ARM_MC::ParseARMTriple(...)这特殊情况下解析字符串"generic"

不过说到底,“三联”主要是一个向后兼容的功能,使锵一个简易替换为GCC,所以你一般不需要太注意它,除非你正在移植锵或LLVM到一个新的平台,或架构。 相反,你可能会发现的输出llc -march=arm -mattr=help ,并在不同的ARM功能的巨大的数组令人难以置信的在你的调查更加有用。

祝你好运与你的研究!



Answer 2:

我使用铛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
  };

在铿锵/ lib目录/驱动器/ 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);
}


Answer 3:

一个提示,你可以这样做:如果你想找到一个特定的目标三倍,是该系统上安装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
i686-pc-windows-gnu # MSVC
x86_64-pc-windows-gnu # MSVC 64-BIT

下面介绍一下文档列表反正(显然这是一个四,而不是三,这些天[或五元组?):

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


Answer 4:

据乔纳森罗洛夫斯在这次谈话“哪些目标呢铛支持?” :

$ 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

锵的未来版本可能提供以下。 他们被列为“建议”,虽然尚未公布至少为v 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 


Answer 5:

也可以尝试

> 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.
  ...


Answer 6:

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

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

至少会列出所有CPU。



文章来源: clang: how to list supported target architectures?
标签: clang llvm