当前位置: 首页 > 知识库问答 >
问题:

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

卢皓轩
2023-03-14

目前,我对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 (e.g. i686-apple-darwin9)

我知道clang有-三元组参数,但我如何列出它的所有可能值?

我发现 clang 在交叉编译方面与 gcc 非常不同,在 GCC 世界中,您应该为所有内容提供单独的二进制文件,例如 PLATFORM_makePLATFORM_ld(i*86-pc-cygwin i*86-*-linux-gnu 等 http://git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS)

在clang world里,只有一个二进制(我在一些论坛上读到的)。但是我如何获得受支持目标的列表呢?如果我的目标在我的发行版(Linux/Windows/MAC OS/无论什么)上不被支持,我怎样才能得到一个支持更多平台的?

如果我SVN最近这样铿锵:

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

我会获得大多数平台吗?

看起来Clang并没有马上考虑交叉编译,但既然它是基于LLVM的,理论上应该是非常友好的交叉编译?

共有3个答案

仉宸
2023-03-14

从 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 PR,LLVM commit,Clang 11文档。

符国安
2023-03-14

我正在使用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 的 sth。

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);
}
武功
2023-03-14

据我所知,没有命令行选项可以列出给定的< code>clang二进制文件支持哪些体系结构,甚至在其上运行< code>strings也没有真正的帮助。Clang本质上只是一个C到LLVM的翻译器,而LLVM本身处理生成实际机器代码的细节,所以Clang不太关注底层架构并不完全令人惊讶。

正如其他人已经指出的,您可以询问llc它支持哪些架构。这并不是很有用,不仅因为这些LLVM组件可能没有安装,而且因为搜索路径和打包系统的变化无常,您的llcclang二进制文件可能与同一版本的LLVM不对应。

然而,为了便于讨论,我们假设您自己编译了LLVM和Clang,或者您很乐意接受您的LLVM二进制文件足够好:

    < li> llc - version将给出它支持的所有架构的列表。默认情况下,它被编译为支持所有架构。你可能认为的单一架构如ARM可能有几个LLVM架构,如常规的ARM、Thumb和AArch64。这主要是为了实现方便,因为不同的执行模式具有非常不同的指令编码和语义。 < li >对于列出的每个体系结构,< code > 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-三月=ARM-马特=帮助的输出,并对大量不同的ARM功能感到难以置信,这在您的调查中更有用。

祝你的研究好运!

 类似资料:
  • 我有一个表,其列如下所示: 符号 区域 国家 位置 日期 计数 我创建了如下表: null 简单地说,我想要支持where子句中所有或任意数量列的表结构。 在卡桑德拉有可能做到这一点吗?

  • 问题内容: 我正在尝试像“数据库设计标签”之类的东西,除了我的每个标签都分为几类。 例如,假设我有一个有关车辆的数据库。假设我们实际上对车辆不是很了解,因此我们无法指定所有车辆将具有的列。因此,我们将用信息“标记”车辆。 现在,您可以看到所有汽车都标有其制造商和型号,但其他类别并不完全匹配。请注意,汽车只能具有每个类别中的一个。IE。一辆汽车只能有一个制造商。 我想设计一个数据库来支持对所有梅赛德

  • 本文向大家介绍如何在Python中列出目录的内容?,包括了如何在Python中列出目录的内容?的使用技巧和注意事项,需要的朋友参考一下 os.listdir(my_path)将为您提供my_path目录中的所有内容-文件和目录。 示例 您可以按以下方式使用它: 如果只需要文件,则可以使用isfile对其进行过滤:

  • 问题内容: 似乎必须在使用某些特定于Eclipse的配置的“ AspectJ项目”或“ Maven项目”之间进行选择,然后尝试正确获取AspectJ的XML配置。 是否缺少某些Eclipse功能,或者是否有可以用作开始的“预制” /教程项目? PS:我正在使用Eclipse 3.7(Indigo)。 问题答案: 这是我用来学习AspectJ的pom文件。

  • 让我们有一个maven项目,其资源结构如下: src/主/资源 目录1 细分1 文件 文件 虽然我找到了许多关于如何列出文件资源的答案,但我一直在寻找一种方法,如何列出资源中目录(或路径)的所有直接子目录,当应用程序同时从IDE(IntelliJ)和jar运行时,这种方法就行得通了。 目标是获取目录“di1”的子目录名称:subdi1, subdi2 我试过了 和使用返回的InputStream(

  • 在将我们的项目升级到JDK 7和JEE7时,我受到了验证错误的伤害,但日志中没有任何可用信息,即使调试标志已打开。我使用的是最新的maven版本,即V3。2.5所有插件都有今天的最新版本!月食月亮和jdk1。7.0_76 64位,来自win7上的Oracle。其他答案中建议的VM参数-XX:-UseSplitVerifier不会改变任何事情!但我可以肯定的是:对于maven的目标:在没有发生验证错