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


94

目前,我对ARM感兴趣,尤其是对iphone / android目标感兴趣。但我只想了解更多有关c的知识,因为它在未来几年中将发挥重要作用。

我试过了

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)

我知道clang具有-triplet参数,但是如何列出所有可能的值?我发现clang与gcc在交叉编译方面有很大不同,在GCC世界中,您应该为所有内容使用单独的二进制文件,例如PLATFORM_make或PLATFORM_ld(i * 86-pc-cygwin i * 86-*-linux-gnu等。http ://git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS

在clang世界中,它只是一个二进制文件(正如我在某些论坛上所读到的)。但是,如何获得受支持目标的列表?如果我的发行版(linux / windows / macos / whatever)不支持我的目标,我该如何获得支持更多平台的目标呢?

如果我是这样的SVN最新的clang:

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

我将获得大部分平台吗?看起来Clang并不是马上就考虑到交叉编译而构建的,但是由于它是基于llvm的,因此在理论上应该是非常交叉友好的?谢谢!


8
不是一个完整的答案,但llc --version将为您提供目标
old_timer 2013年

1
我认为您必须查看源代码才能看到三元组。据我了解,默认的clang构建将包括对交叉编译的基本支持。基本支持仅将代码转换为目标文件(只要集成汇编程序支持三元组,否则就必须获取.s文件)。您将必须提供标头,库,链接器(直到lld正常工作,等等)
bames53

1
尽管默认安装仅包含clang和clang ++可执行文件,但与其他平台一样,您可以使用名称中编码的三元组和四元组创建它们的副本或硬链接。clang ++和clang实际上只是彼此的副本,它检查可执行文件的名称以查看如何处理输入。
LB-- 2013年

Answers:


52

据我所知,没有命令行选项可以列出给定clang二进制文件支持的体系结构,即使strings在其上运行也无济于事。Clang本质上只是C到LLVM的转换程序,而LLVM本身处理生成实际机器代码的细节,因此Clang并没有对底层架构给予过多关注就不足为奇了。

正如其他人已经指出的那样,您可以询问llc它支持哪种架构。这并不是全部有用,不仅因为可能未安装这些LLVM组件,而且由于搜索路径和打包系统的种类繁多,您的llcclang二进制文件可能不对应于同一版本的LLVM。

但是,出于争论的目的,假设您自己编译了LLVM和Clang,或者您很乐意接受足够好的LLVM二进制文件:

  • llc --version将提供其支持的所有架构的列表。默认情况下,它被编译为支持所有体系结构。您可能会想到像ARM这样的单一体系结构,可能会有几种LLVM体系结构,例如常规ARM,Thumb和AArch64。这主要是为了实现方便,因为不同的执行模式具有非常不同的指令编码和语义。
  • 对于列出的每种体系结构,llc -march=ARCH -mattr=help将列出“可用的CPU”和“可用的功能”。通常,CPU只是设置默认功能集合的一种简便方法。

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

但是,最终,“三元组”主要是向后兼容的功能,可以使Clang成为GCC的替代产品,因此,除非将Clang或LLVM移植到新平台上,否则通常不需要过多地关注它。或建筑。相反,您可能会发现llc -march=arm -mattr=help大量不同的ARM功能并陷入僵局,这对您的研究更加有用。

祝您研究顺利!


34

我正在使用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);
}

5
三部曲的第二和第三部分呢?
osgx 2014年

实际的将Arch名称解析为ArchType的代码在code.metager.de/source/xref/llvm/llvm/lib/Support/…-llvm / lib / Support / Triple.cpp函数 static Triple::ArchType parseArch(StringRef ArchName)
osgx 2014年

可用的clang二进制文件并不意味着用户从源代码编译了它。
Colin LeMahieu,2015年

有关clang目标和三元组的一些描述:llvm.org/devmtg/2014-04/PDFs/LightningTalks/…,于2014年提出:“目标三元组:<arch> <sub>-<vendor>-<sys>-<abi> ; --print-supported-archs --print-supported-vendors --print-supported-systems --print-supported-abis --print-multi-libs --print-available-targets“和clang.llvm.org /UniversalDriver.html
osgx

18

您可以做的一个提示:如果要查找特定的目标三元组,请在该系统上安装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

然后,您知道了如何在交叉编译时将其作为目标。

显然,这里有很多目标,这是一个列表,可以随意添加,社区Wiki风格:

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

什么时候说mingw32这意味着它不能与MinGW64一起使用?是否有与MSVC兼容的产品?
罗伊

@Royi stackoverflow.com/q/39871656/32453可能有用,祝您好运!
rogerdpack '18

12

根据乔纳森·罗洛夫斯(Jonathan Roelofs)的演讲,“ C支持哪些目标?”

$ 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版本可能会提供以下内容。它们被列为“提议的”,尽管至少从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 

似乎在较新的Clang版本上不起作用。
罗伊,

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

6
clang可用并不意味着llc可用。
Colin LeMahieu,2015年

1
似乎llc通常与clang一起安装,但是...如果您不从软件包管理器安装它,则可以安装它,并且它应该排列起来,我想...但是,如果您想定位特定的cpu,不一定是OP想要的不同的“三重”架构...
rogerdpack

5
要列出其他体系结构的-mtriple选项,可以使用如下所示的选项llc -mtriple=arm -mattr=help
Lekensteyn'2

2

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

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

将至少列出所有CPU。


1
这将仅列出可以应用于当前(默认)目标的选项。
osgx

1

从Clang 11(主干)开始,可以使用新添加的-print-targets标记方便地打印受支持的目标体系结构的列表:

$ clang-11 -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

参考资料:LLVM PRLLVM commitClang 11文档


0

如果您对支持从源构建LLVM或Clang的目标(的值-DLLVM_TARGETS_TO_BUILD)感兴趣,请llvm/lib/Target在源分发的文件夹中查找子目录列表。自9.0.1版起:

AArch64
AMDGPU
ARC
ARM
AVR
BPF
Hexagon
Lanai
MSP430
Mips
NVPTX
PowerPC
RISCV
Sparc
SystemZ
WebAssembly
X86
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.