clang: desteklenen hedef mimarileri nasıl listeleyebilirim?


99

Şu anda genel olarak ARM ve özellikle iphone / android hedefleriyle ilgileniyorum. Ama önümüzdeki yıllarda önemli bir rol oynayacak gibi hissettirdiği için clang hakkında daha fazla şey öğrenmek istiyorum.

denedim

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'ın -triplet parametresine sahip olduğunu biliyorum, ancak bunun için tüm olası değerleri nasıl listeleyebilirim? O çınlama her şey için ayrı ikili olmalıdır GCC dünyada, çapraz derleme açısından gcc için çok farklı buldum, PLATFORM_make veya PLATFORM_ld gibi, (i 86-pc-cygwin * i 86 * - * - Linux-gnu vb http : //git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS )

clang dünyasında, sadece bir ikili (bazı forumlarda okuduğum gibi). Ancak desteklenen hedeflerin listesini nasıl alırım? Ve hedefim dağıtımımda desteklenmiyorsa (linux / windows / macos / her neyse) daha fazla platformu destekleyen birini nasıl edinebilirim?

en son clang'ı böyle SVN yaparsam

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

platformların çoğunu alacak mıyım? Görünüşe göre Clang hemen çapraz derleme düşünülerek inşa edilmemiş, ancak llvm tabanlı olduğu için teoride çok çapraz dostu olmalı? teşekkür ederim!


8
tam bir cevap değil ama llc --version size hedefleri verecek
old_timer

1
Üçlüleri görmek için kaynağa bakmanız gerektiğini düşünüyorum. Ve anladığım kadarıyla varsayılan bir clang yapısı çapraz derleme için temel desteği içerecek. Temel destek yalnızca kodu nesne dosyalarına dönüştürür (entegre derleyici üçlü desteği desteklediği sürece, aksi takdirde .s dosyalarını almanız gerekir). Başlıklar, kitaplıklar, bağlayıcı (lld çalışana kadar), vb.
Sağlamanız gerekecek

1
Varsayılan kurulumda yalnızca clang ve clang ++ yürütülebilir dosyaları olsa da, diğer platformlar gibi, adlarda kodlanmış üçlü ve dörtlülerle bunların kopyalarını veya sabit bağlantılarını oluşturabilirsiniz. clang ++ ve clang aslında birbirlerinin kopyalarıdır ve girdinin nasıl işleneceğini görmek için yürütülebilir dosyanın adını kontrol eder.
LB

Yanıtlar:


57

Anladığım kadarıyla, belirli bir clangbinary mimarisinin hangi mimarileri desteklediğini listelemek için bir komut satırı seçeneği yok ve hatta stringsüzerinde çalıştırmak bile gerçekten yardımcı olmuyor. Clang, esasen sadece bir C'den LLVM'ye çevirmen ve LLVM'nin kendisi, gerçek makine kodu üretme işiyle ilgileniyor, bu nedenle Clang'ın temel mimariye fazla dikkat etmemesi tamamen şaşırtıcı değil.

Diğerlerinin daha önce de belirttiği gibi, llchangi mimarileri desteklediğini sorabilirsiniz . Bu, yalnızca bu LLVM bileşenlerinin yüklenemeyeceği için değil, aynı zamanda arama yollarının ve paketleme sistemlerinin değişkenlerinden dolayı , sizin llcve clangikili dosyalarınız LLVM'nin aynı sürümüne karşılık gelmeyebilir.

Bununla birlikte, argüman uğruna, hem LLVM hem de Clang'ı kendiniz derlediğinizi ya da LLVM ikili dosyalarınızı yeterince iyi kabul etmekten memnun olduğunuzu varsayalım:

  • llc --versiondesteklediği tüm mimarilerin bir listesini verecektir. Varsayılan olarak, tüm mimarileri desteklemek için derlenmiştir. ARM gibi tek bir mimari olarak düşünebileceğiniz şey, normal ARM, Thumb ve AArch64 gibi birkaç LLVM mimarisine sahip olabilir. Bu temelde uygulama kolaylığı içindir çünkü farklı yürütme modları çok farklı komut kodlamalarına ve anlamsallığa sahiptir.
  • Listelenen mimarilerin her biri için llc -march=ARCH -mattr=help"kullanılabilir CPU'lar" ve "kullanılabilir özellikler" listelenecektir . CPU'lar genellikle varsayılan bir özellik koleksiyonunu ayarlamanın uygun bir yoludur.

Ama şimdi kötü haber için. Clang veya LLVM'de atılabilecek uygun bir üçlü tablosu yoktur, çünkü mimariye özgü arka uçlar üçlü dizeyi bir llvm::Triplenesneye ayrıştırma seçeneğine sahiptir ( include / llvm / ADT / Triple.h içinde tanımlanmıştır ). Başka bir deyişle, mevcut tüm üçlüleri atmak, Duraklama Problemini çözmeyi gerektirir. Örneğin, llvm::ARM_MC::ParseARMTriple(...)dizeyi hangi özel durumların ayrıştırdığına bakın "generic".

Nihayetinde, "üçlü", Clang'ı GCC'nin yerine geçecek hale getirmek için çoğunlukla geriye dönük bir uyumluluk özelliğidir, bu nedenle, Clang veya LLVM'yi yeni bir platforma taşımadığınız sürece genellikle çok fazla dikkat etmeniz gerekmez. veya mimari. Bunun yerine, muhtemelen llc -march=arm -mattr=helparaştırmalarınızda daha yararlı olacak çok çeşitli ARM özelliklerinin çıktısını ve şaşırtıcı olduğunu göreceksiniz .

Araştırmanızda bol şans!


35

Clang 3.3 kullanıyorum, cevabı almanın en iyi yolu kaynak kodunu okumaktır. llvm / ADT / Triple.h'de ( 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
  };

ve clang / lib / Driver / ToolChains.cpp'de arm hakkında bir şey var.

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
Üçlünün ikinci ve üçüncü bölümleri ne olacak?
osgx

Ve ArchType'a gerçek Arch adının ayrıştırıcısı code.metager.de/source/xref/llvm/llvm/lib/Support/… - llvm / lib / Support / Triple.cpp function static Triple::ArchType parseArch(StringRef ArchName)
osgx

Clang ikilisinin mevcut olması, kullanıcının onu kaynaktan derlediği anlamına gelmez.
Colin LeMahieu

Clang'ın hedeflerinin ve üçlülerinin bazı açıklamaları: llvm.org/devmtg/2014-04/PDFs/LightningTalks/… , 2014'te önerilen: "Üçlü Hedef: <arch> <sub> - <vendor> - <sys> - <abi> ; --print-destekli-archs --print-destekli-satıcılar --print-destekli-sistemler --print-destekli-abis --print-multi-libs --print-available-hedefler "ve clang.llvm.org /UniversalDriver.html
osgx

20

Yapabileceğiniz Bir ipucu: Eğer üçlü belirli hedef bulmaya çalışıyorsanız, LLVM yüklemektir o sistem üzerinde daha sonra yapılacak

$ llc --version | grep Default
  Default target: x86_64-apple-darwin16.1.0

Veya alternatif olarak:

$ llvm-config --host-target
x86_64-apple-darwin16.0.0
or
$ clang -v 2>&1 | grep Target
Target: x86_64-apple-darwin16.1.0

O zaman çapraz derleme yaparken onu nasıl hedefleyeceğinizi bilirsiniz.

Görünüşe göre orada "çok" hedef var, işte bir liste, buna eklemekten çekinmeyin, topluluk wiki stili:

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

İşte ne docs zaten listelemek (görünüşte bir dörtlü var [veya beşli?] Yerine üçlü bugünlerde):

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.

ve hatta bunun ötesinde bir hedef işlemci bile ince ayar yapabilirsiniz, ancak bu üçlü tabanlı hedef işlemci için mantıklı bir varsayılan kullanır.

Bazen hedefler aynı şeyi "çözer", böylece bir hedefin gerçekte ne olarak değerlendirildiğini görmek için:

 $ clang -target x86_64-w64-mingw32 -v 2>&1 | grep Target
 Target: x86_64-w64-windows-gnu

Ne zaman mingw32söyleniyor, MinGW64 ile çalışmayacağı anlamına geliyor mu? MSVC Uyumlu bir şey var mı?
Royi

@Royi stackoverflow.com/q/39871656/32453 faydalı olabilir, iyi şanslar!
rogerdpack

13

Jonathan Roelofs'a göre bu konuşmada "Clang hangi hedefleri destekliyor?" :

$ 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'ın gelecekteki sürümleri aşağıdakileri sağlayabilir. "Önerilen" olarak listeleniyorlar, ancak en azından 3.9.0 sürümünden itibaren henüz mevcut değiller:

$ 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 

Daha yeni Clang sürümlerinde çalışmıyor gibi görünüyor.
Royi

6

Ayrıca denemek

> 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'ın mevcut olması, llc'nin mevcut olduğu anlamına gelmez.
Colin LeMahieu

1
Görünüşe göre llc genellikle clang ile birlikte kurulur, ancak ... ve paket yöneticinizden değilse kurabilirsiniz ve sıralanması gerekir, sanırım ... ancak bu liste bir OP'nin istediği gibi farklı bir "üçlü" mimari olması gerekmez ...
rogerdpack

5
Diğer mimariler için seçenekleri listelemek için, -mtripleseçeneğindeki gibi kullanabilirsiniz llc -mtriple=arm -mattr=help.
Lekensteyn

4

Clang 11'den (gövde) başlayarak, desteklenen hedef mimarilerin listesi yeni eklenen -print-targetsbayrak kullanılarak kolayca yazdırılabilir :

$ 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

Referanslar: LLVM PR , LLVM commit , Clang 11 belgeleri .


3

Tüm üçlüleri listelemeyecek ama

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

en azından tüm CPU'ları listeleyecektir.


1
Bu, yalnızca mevcut (varsayılan) hedefe uygulanabilecek seçenekleri listeleyecektir.
osgx

1

Kaynaktan LLVM veya Clang oluşturmak için hangi hedeflerin desteklendiğiyle ilgileniyorsanız (değerler için -DLLVM_TARGETS_TO_BUILD), llvm/lib/Targetkaynak dağıtımındaki klasördeki alt dizinlerin listesini arayın . 9.0.1 itibarıyla:

AArch64
AMDGPU
ARC
ARM
AVR
BPF
Hexagon
Lanai
MSP430
Mips
NVPTX
PowerPC
RISCV
Sparc
SystemZ
WebAssembly
X86

0

clang -march=dont-know empty.c

hata: bilinmeyen hedef CPU 'bilmiyorum'

not: geçerli hedef CPU değerleri şunlardır: 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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.