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

137

我对ARM有兴趣,尤其是iPhone/Android目标。但我想更多地了解clang,因为它在未来几年中扮演重要角色。

我尝试过。

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/任何其他系统),那么我该如何获得支持更多平台的目标?
如果我像这样SVN最新的clang:
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang

我会获得大多数平台吗?

看起来 Clang 最初并不是为交叉编译而构建的,但由于它基于 LLVM,理论上应该非常适合跨平台。


10
不是完整答案,但llc --version会给出目标。 - old_timer
1
我认为你需要查看源代码才能看到三元组。据我所知,Clang 的默认构建将包含基本的跨平台编译支持。仅具备基本支持功能只会将代码转换为目标文件(只要集成的汇编器支持三元组,否则您将不得不使用 .s 文件)。您将需要提供头文件、库、链接器(直到 lld 起作用)等。 - bames53
1
尽管默认安装只有clang和clang++可执行文件,但与其他平台一样,您可以使用三元组和四元组编码在名称中创建副本或硬链接。 clang++和clang实际上只是彼此的副本,它检查可执行文件的名称以确定如何处理输入。 - LB--
1
相关 - Clang支持哪些目标? - Royi
14个回答

73
据我所知,目前没有命令行选项可以列出给定的 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特性的巨大数组会更有助于您的研究。

祝您研究顺利!


52
从Clang 11(trunk)开始,可以方便地使用新添加的-print-targets标志打印支持的目标架构列表。
$ 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

参考资料:LLVM PRLLVM commitClang 11 documentation

arm 是32位的吗? - user3064538

42

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

8
三重性的第二部分和第三部分怎么样? - osgx
实际将架构名称解析为ArchType的解析器位于http://code.metager.de/source/xref/llvm/llvm/lib/Support/Triple.cpp#221 - llvm/lib/Support/Triple.cpp函数static Triple::ArchType parseArch(StringRef ArchName)中。 - osgx
clang的可用二进制文件并不意味着用户是从源代码编译得来的。 - Colin LeMahieu
2
一些关于clang目标和三元组的描述:http://llvm.org/devmtg/2014-04/PDFs/LightningTalks/2014-3-31_ClangTargetSupport_LighteningTalk.pdf,该文档于2014年提出:“目标三元组:<arch><sub>-<vendor>-<sys>-<abi>; --print-supported-archs --print-supported-vendors --print-supported-systems --print-supported-abis --print-multi-libs --print-available-targets”,以及http://clang.llvm.org/UniversalDriver.html。 - osgx

24

一个提示是:如果你正在尝试查找特定的目标三元组,可以在该系统上安装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

当它说 mingw32 时,是否意味着它不能与MinGW64一起使用?是否有与MSVC兼容的东西? - Royi
@Royi https://dev59.com/Q1kS5IYBdhLWcg3wb2Ts 可能会有所帮助,祝你好运! - rogerdpack
为什么有win32,却没有win64呢? - ar2015
1
我认为i686-w64-mingw32是32位的,但是针对“mingw w64”工具链。该工具链本身也有一个32位版本。想想看... - rogerdpack

15

根据Jonathan Roelofs在这个演讲中所说“Which targets does Clang support?”

$ 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可能提供以下功能,目前仅作为“建议”列出,至少在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 

6
似乎在更新的Clang版本上无法运行。 - Royi

7

同样也可以尝试

> 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
1
似乎LLC通常与Clang一起安装,但是如果您的软件包管理器中没有它,您可以安装它,然后应该能够对齐。不过,这个列表似乎是针对特定CPU的目标,而不是像OP所想的那样不同的“三元”架构。 - rogerdpack
5
若要列出其他体系结构的选项,你可以使用-mtriple选项,例如llc -mtriple=arm -mattr=help。该选项可帮助你完成翻译。 - Lekensteyn
llc: 错误: 无法获取目标 'unknown',请查看 --version 和 --triple。 - Max Base
use $ llc --version - Max Base

3
我不知道用标准的clangllc命令获取所有可用三元组的方法。最接近的方法是来自Lekensteyn评论中的llc -mtriple=ARCH -mattr=help,但它不起作用。它只会打印出大量的CPU和功能列表。
然而,如果您有rust,那么使用 rustc --print target-list 就很容易实现。目前我看到了181个不同的三元组列表。
$ rustc --print target-list | column
aarch64-apple-darwin                    aarch64_be-unknown-linux-gnu            armv7-unknown-linux-uclibceabi          i686-pc-windows-msvc                    mipsel-unknown-linux-uclibc             riscv32gc-unknown-linux-gnu             thumbv7em-none-eabi                     x86_64-pc-windows-msvc
aarch64-apple-ios                       aarch64_be-unknown-linux-gnu_ilp32      armv7-unknown-linux-uclibceabihf        i686-unknown-freebsd                    mipsel-unknown-none                     riscv32gc-unknown-linux-musl            thumbv7em-none-eabihf                   x86_64-sun-solaris
aarch64-apple-ios-macabi                arm-linux-androideabi                   armv7-unknown-netbsd-eabihf             i686-unknown-haiku                      mipsisa32r6-unknown-linux-gnu           riscv32i-unknown-none-elf               thumbv7m-none-eabi                      x86_64-unknown-dragonfly
aarch64-apple-ios-sim                   arm-unknown-linux-gnueabi               armv7-wrs-vxworks-eabihf                i686-unknown-linux-gnu                  mipsisa32r6el-unknown-linux-gnu         riscv32im-unknown-none-elf              thumbv7neon-linux-androideabi           x86_64-unknown-freebsd
aarch64-apple-tvos                      arm-unknown-linux-gnueabihf             armv7a-kmc-solid_asp3-eabi              i686-unknown-linux-musl                 mipsisa64r6-unknown-linux-gnuabi64      riscv32imac-unknown-none-elf            thumbv7neon-unknown-linux-gnueabihf     x86_64-unknown-haiku
aarch64-fuchsia                         arm-unknown-linux-musleabi              armv7a-kmc-solid_asp3-eabihf            i686-unknown-netbsd                     mipsisa64r6el-unknown-linux-gnuabi64    riscv32imc-esp-espidf                   thumbv7neon-unknown-linux-musleabihf    x86_64-unknown-hermit
aarch64-kmc-solid_asp3                  arm-unknown-linux-musleabihf            armv7a-none-eabi                        i686-unknown-openbsd                    msp430-none-elf                         riscv32imc-unknown-none-elf             thumbv8m.base-none-eabi                 x86_64-unknown-illumos
aarch64-linux-android                   armebv7r-none-eabi                      armv7a-none-eabihf                      i686-unknown-uefi                       nvptx64-nvidia-cuda                     riscv64gc-unknown-freebsd               thumbv8m.main-none-eabi                 x86_64-unknown-l4re-uclibc
aarch64-pc-windows-gnullvm              armebv7r-none-eabihf                    armv7r-none-eabi                        i686-uwp-windows-gnu                    powerpc-unknown-freebsd                 riscv64gc-unknown-linux-gnu             thumbv8m.main-none-eabihf               x86_64-unknown-linux-gnu
aarch64-pc-windows-msvc                 armv4t-unknown-linux-gnueabi            armv7r-none-eabihf                      i686-uwp-windows-msvc                   powerpc-unknown-linux-gnu               riscv64gc-unknown-linux-musl            wasm32-unknown-emscripten               x86_64-unknown-linux-gnux32
aarch64-unknown-freebsd                 armv5te-unknown-linux-gnueabi           armv7s-apple-ios                        i686-wrs-vxworks                        powerpc-unknown-linux-gnuspe            riscv64gc-unknown-none-elf              wasm32-unknown-unknown                  x86_64-unknown-linux-musl
aarch64-unknown-hermit                  armv5te-unknown-linux-musleabi          asmjs-unknown-emscripten                m68k-unknown-linux-gnu                  powerpc-unknown-linux-musl              riscv64imac-unknown-none-elf            wasm32-wasi                             x86_64-unknown-netbsd
aarch64-unknown-linux-gnu               armv5te-unknown-linux-uclibceabi        avr-unknown-gnu-atmega328               mips-unknown-linux-gnu                  powerpc-unknown-netbsd                  s390x-unknown-linux-gnu                 wasm64-unknown-unknown                  x86_64-unknown-none
aarch64-unknown-linux-gnu_ilp32         armv6-unknown-freebsd                   bpfeb-unknown-none                      mips-unknown-linux-musl                 powerpc-unknown-openbsd                 s390x-unknown-linux-musl                x86_64-apple-darwin                     x86_64-unknown-none-linuxkernel
aarch64-unknown-linux-musl              armv6-unknown-netbsd-eabihf             bpfel-unknown-none                      mips-unknown-linux-uclibc               powerpc-wrs-vxworks                     sparc-unknown-linux-gnu                 x86_64-apple-ios                        x86_64-unknown-openbsd
aarch64-unknown-netbsd                  armv6k-nintendo-3ds                     hexagon-unknown-linux-musl              mips64-openwrt-linux-musl               powerpc-wrs-vxworks-spe                 sparc64-unknown-linux-gnu               x86_64-apple-ios-macabi                 x86_64-unknown-redox
aarch64-unknown-none                    armv7-apple-ios                         i386-apple-ios                          mips64-unknown-linux-gnuabi64           powerpc64-unknown-freebsd               sparc64-unknown-netbsd                  x86_64-apple-tvos                       x86_64-unknown-uefi
aarch64-unknown-none-softfloat          armv7-linux-androideabi                 i586-pc-windows-msvc                    mips64-unknown-linux-muslabi64          powerpc64-unknown-linux-gnu             sparc64-unknown-openbsd                 x86_64-fortanix-unknown-sgx             x86_64-uwp-windows-gnu
aarch64-unknown-openbsd                 armv7-unknown-freebsd                   i586-unknown-linux-gnu                  mips64el-unknown-linux-gnuabi64         powerpc64-unknown-linux-musl            sparcv9-sun-solaris                     x86_64-fuchsia                          x86_64-uwp-windows-msvc
aarch64-unknown-redox                   armv7-unknown-linux-gnueabi             i586-unknown-linux-musl                 mips64el-unknown-linux-muslabi64        powerpc64-wrs-vxworks                   thumbv4t-none-eabi                      x86_64-linux-android                    x86_64-wrs-vxworks
aarch64-unknown-uefi                    armv7-unknown-linux-gnueabihf           i686-apple-darwin                       mipsel-sony-psp                         powerpc64le-unknown-freebsd             thumbv6m-none-eabi                      x86_64-pc-solaris
aarch64-uwp-windows-msvc                armv7-unknown-linux-musleabi            i686-linux-android                      mipsel-unknown-linux-gnu                powerpc64le-unknown-linux-gnu           thumbv7a-pc-windows-msvc                x86_64-pc-windows-gnu
aarch64-wrs-vxworks                     armv7-unknown-linux-musleabihf          i686-pc-windows-gnu                     mipsel-unknown-linux-musl               powerpc64le-unknown-linux-musl          thumbv7a-uwp-windows-msvc               x86_64-pc-windows-gnullvm

您也可以使用rustup target list打印出所有rustup支持的三元组。
$ rustup target list | column
aarch64-apple-darwin                    arm-unknown-linux-gnueabi               armv7-unknown-linux-musleabi            i686-pc-windows-msvc                    mipsel-unknown-linux-musl               s390x-unknown-linux-gnu                 thumbv8m.main-none-eabihf               x86_64-pc-windows-msvc
aarch64-apple-ios                       arm-unknown-linux-gnueabihf             armv7-unknown-linux-musleabihf          i686-unknown-freebsd                    nvptx64-nvidia-cuda                     sparc64-unknown-linux-gnu               wasm32-unknown-emscripten               x86_64-sun-solaris
aarch64-apple-ios-sim                   arm-unknown-linux-musleabi              armv7a-none-eabi                        i686-unknown-linux-gnu                  powerpc-unknown-linux-gnu               sparcv9-sun-solaris                     wasm32-unknown-unknown                  x86_64-unknown-freebsd
aarch64-fuchsia                         arm-unknown-linux-musleabihf            armv7r-none-eabi                        i686-unknown-linux-musl                 powerpc64-unknown-linux-gnu             thumbv6m-none-eabi                      wasm32-wasi                             x86_64-unknown-illumos
aarch64-linux-android                   armebv7r-none-eabi                      armv7r-none-eabihf                      mips-unknown-linux-gnu                  powerpc64le-unknown-linux-gnu           thumbv7em-none-eabi                     x86_64-apple-darwin (installed)         x86_64-unknown-linux-gnu
aarch64-pc-windows-msvc                 armebv7r-none-eabihf                    asmjs-unknown-emscripten                mips-unknown-linux-musl                 riscv32i-unknown-none-elf               thumbv7em-none-eabihf                   x86_64-apple-ios                        x86_64-unknown-linux-gnux32
aarch64-unknown-linux-gnu               armv5te-unknown-linux-gnueabi           i586-pc-windows-msvc                    mips64-unknown-linux-gnuabi64           riscv32imac-unknown-none-elf            thumbv7m-none-eabi                      x86_64-fortanix-unknown-sgx             x86_64-unknown-linux-musl
aarch64-unknown-linux-musl              armv5te-unknown-linux-musleabi          i586-unknown-linux-gnu                  mips64-unknown-linux-muslabi64          riscv32imc-unknown-none-elf             thumbv7neon-linux-androideabi           x86_64-fuchsia                          x86_64-unknown-netbsd
aarch64-unknown-none                    armv7-linux-androideabi                 i586-unknown-linux-musl                 mips64el-unknown-linux-gnuabi64         riscv64gc-unknown-linux-gnu             thumbv7neon-unknown-linux-gnueabihf     x86_64-linux-android                    x86_64-unknown-none
aarch64-unknown-none-softfloat          armv7-unknown-linux-gnueabi             i686-linux-android                      mips64el-unknown-linux-muslabi64        riscv64gc-unknown-none-elf              thumbv8m.base-none-eabi                 x86_64-pc-solaris                       x86_64-unknown-redox
arm-linux-androideabi                   armv7-unknown-linux-gnueabihf           i686-pc-windows-gnu                     mipsel-unknown-linux-gnu                riscv64imac-unknown-none-elf            thumbv8m.main-none-eabi                 x86_64-pc-windows-gnu

3
$ aarch64-linux-android30-clang++ -print-targets
  Registered Targets:
    aarch64    - AArch64 (little endian)
    aarch64_32 - AArch64 (little endian ILP32)
    aarch64_be - AArch64 (big endian)
    arm        - ARM
    arm64      - ARM64 (little endian)
    arm64_32   - ARM64 (little endian ILP32)
    armeb      - ARM (big endian)
    bpf        - BPF (host endian)
    bpfeb      - BPF (big endian)
    bpfel      - BPF (little endian)
    thumb      - Thumb
    thumbeb    - Thumb (big endian)
    x86        - 32-bit X86: Pentium-Pro and above
    x86-64     - 64-bit X86: EM64T and AMD64

$ aarch64-linux-android30-clang++ -print-supported-cpus
Android (8490178, based on r450784d) clang version 14.0.6 (https://android.googlesource.com/toolchain/llvm-project 4c603efb0cca074e9238af8b4106c30add4418f6)
Target: aarch64-unknown-linux-android30
Thread model: posix
InstalledDir: /opt/android-ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64/bin
Available CPUs for this target:

        a64fx
        apple-a10
        apple-a11
        apple-a12
        apple-a13
        apple-a14
        apple-a7
        apple-a8
        apple-a9
        apple-latest
        apple-m1
        apple-s4
        apple-s5
        carmel
        cortex-a34
        cortex-a35
        cortex-a510
        cortex-a53
        cortex-a55
        cortex-a57
        cortex-a65
        cortex-a65ae
        cortex-a710
        cortex-a72
        cortex-a73
        cortex-a75
        cortex-a76
        cortex-a76ae
        cortex-a77
        cortex-a78
        cortex-a78c
        cortex-r82
        cortex-x1
        cortex-x2
        cyclone
        exynos-m3
        exynos-m4
        exynos-m5
        falkor
        generic
        kryo
        neoverse-512tvb
        neoverse-e1
        neoverse-n1
        neoverse-n2
        neoverse-v1
        saphira
        thunderx
        thunderx2t99
        thunderx3t110
        thunderxt81
        thunderxt83
        thunderxt88
        tsv110

3
错误:未知目标 CPU 'dont-know' 提示:有效的目标 CPU 值为:nocona、core2、penryn、bonnell、atom、silvermont、slm、goldmont、goldmont-plus、tremont、nehalem、corei7、westmere、sandybridge、corei7-avx、ivybridge、core-avx-i、haswell、core-avx2、broadwell、skylake、skylake-avx512、skx、cascadelake、cooperlake、cannonlake、icelake-client、icelake-server、tigerlake、knl、knm、k8、athlon64、athlon-fx、opteron、k8-sse3、athlon64-sse3、opteron-sse3、amdfam10、barcelona、btver1、btver2、bdver1、bdver2、bdver3、bdver4、znver1、znver2、x86-64

至少在Apple clang版本14.0.0(clang-1400.0.29.102)中不再支持:“clang:错误:clang编译器不支持'-march = dont-know'”。 - Flash Sheridan
它可以与最新的开源clang-16一起工作,不确定是否适用于Apple clang。 - DTharun
问题是列出所有的-triplets或至少列出所有的体系结构,而不是x86微体系结构。 - undefined

3
它不会列出所有三元组,但是:
llvm-as < /dev/null | llc -mcpu=help

至少会列出所有的CPU。


1
这将列出仅适用于当前(默认)目标的选项。 - osgx
1
llc: 错误: 无法获取 'unknown' 的目标,请参阅 --version 和 --triple。 - Max Base

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接