clang:サポートされているターゲットアーキテクチャを一覧表示する方法は?


95

現在、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の世界では、これは1つのバイナリのみです(私がいくつかのフォーラムで読んだように)。しかし、サポートされているターゲットのリストを取得するにはどうすればよいですか?そして、私のターゲットが私のディストリビューション(linux / windows / macos / whatever)でサポートされていない場合、どのようにしてより多くのプラットフォームをサポートするものを入手できますか?

私がこのようなSVNの最新のClangの場合:

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

ほとんどのプラットフォームを入手できますか?Clangはクロスコンパイルを考慮してすぐに構築されていないように見えますが、llvmベースであるため、理論的には非常にクロスフレンドリーなはずです。ありがとうございました!


8
完全な答えではありませんが、llc --versionはターゲットを提供します
old_timer

1
トリプルを確認するには、ソースを確認する必要があると思います。そして、私が理解しているように、clangのデフォルトのビルドにはクロスコンパイルの基本的なサポートが含まれます。基本サポートはコードをオブジェクトファイルに変換するだけです(統合アセンブラがトリプルをサポートしている限り、そうでない場合は.sファイルを使用する必要があります)。ヘッダー、ライブラリ、リンカー(lldが機能するまで)などを指定する必要があります
bames53

1
デフォルトのインストールにはclangとclang ++の実行可能ファイルしかありませんが、他のプラットフォームと同様に、名前にエンコードされたトリプルとクワッドを使用して、それらのコピーまたはハードリンクを作成できます。clang ++とclangは実際には互いの単なるコピーであり、実行可能ファイルの名前をチェックして入力の処理方法を確認します。
LB-- 2013

回答:


52

私が知る限り、与えられたアーキテクチャをリストするコマンドラインオプションはありません clangバイナリがサポートするstringsはありません。その上でしても、実際には役に立ちません。Clangは基本的にCからLLVMへのトランスレーターであり、実際のマシンコードを生成する核心を処理するのはLLVM自体であるため、Clangが基礎となるアーキテクチャーにあまり注意を払っていないことはまったく驚くことではありません。

他の人がすでに述べたように、llcそれがサポートするアーキテクチャを尋ねることができます。これは、すべてではないこと、これらのLLVMコンポーネントがインストールされていない可能性がありますので、しかしための検索パスの気まぐれのやシステムをパッケージ化するだけでなく、便利あなたllcclangバイナリはLLVMの同じバージョンに対応しない場合があります。

ただし、議論のために、LLVMとClangの両方を自分でコンパイルしたか、それともLLVMバイナリを問題なく受け入れたとしましょう。

  • llc --versionそれがサポートするすべてのアーキテクチャのリストを提供します。デフォルトでは、すべてのアーキテクチャをサポートするようにコンパイルされています。ARMなどの単一のアーキテクチャと考えるものには、通常のARM、Thumb、AArch64などの複数のLLVMアーキテクチャがある場合があります。実行モードが異なると、命令のエンコーディングとセマンティクスが大きく異なるため、これは主に実装の便宜のためです。
  • llc -march=ARCH -mattr=helpリストされているアーキテクチャごとに、「使用可能なCPU」と「使用可能な機能」がリストされます。CPUは、通常、機能のデフォルトのコレクションを設定する便利な方法にすぎません。

しかし、今は悪いニュースです。アーキテクチャ固有のバックエンドには、トリプル文字列をllvm::Tripleオブジェクト(include / llvm / ADT / Triple.hで定義)に解析するオプションがあるため、ダンプできるClangまたはLLVMのトリプルの便利なテーブルはありません。つまり、利用可能なすべてのトリプルをダンプするには、停止問題を解決する必要があります。たとえば、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に関する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);
}

5
トリプルの2番目と3番目の部分はどうですか?
osgx 14

そして、ArchTypeへのArch名の実際のパーサーは、code.metager.de / source / xref / llvm / llvm / lib / Support /…-llvm / lib / Support / Triple.cpp function static Triple::ArchType parseArch(StringRef ArchName)
osgx

使用可能な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

実行できる1つのヒント:特定のターゲットトリプルを見つけようとしている場合は、そのシステムに 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

とにかく、ドキュメントリストは次のとおりです(最近では、トリプルではなく、4倍[または5倍?]と表示されます)。

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 stackoverflow.com/q/39871656/32453はお役に立てば幸いです。
rogerdpack 2018

12

この講演のジョナサン・ロエロフによると「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の将来のバージョンでは、次のものが提供される可能性があります。それらは「提案済み」としてリストされていますが、少なくとも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バージョンでは機能しないようです。
Royi

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 '30 / 11/16

5
他のアーキテクチャのオプションを一覧表示するには、のように-mtripleオプションを使用できますllc -mtriple=arm -mattr=help
Lekensteyn 2017

2

すべてのトリプルをリストするわけではありませんが、

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

少なくともすべてのCPUがリストされます。


1
これにより、現在の(デフォルト)ターゲットに適用できるオプションのみがリストされます。
osgx 2013

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コミットClang 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.