лязг: как список поддерживаемых архитектур?


В настоящее время я заинтересован в 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 имеет-триплетный параметр, но как я могу перечислить все возможные значения для него? Я обнаружил, что 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 co http://llvm.org/svn/llvm-project/cfe/trunk clang

я получу большинство платформ? Оно похоже, что Clang не был построен с кросс-компиляцией сразу, но поскольку он основан на llvm, он должен быть очень кросс-дружественным в теории? спасибо!

6 61

6 ответов:

насколько я могу судить, нет опции командной строки, чтобы перечислить, какие архитектуры заданы clang бинарные поддерживает, и даже работает strings на самом деле это не помогает. Clang-это, по сути, просто переводчик C на LLVM, и именно LLVM занимается созданием фактического машинного кода, поэтому неудивительно, что Clang не уделяет большого внимания базовой архитектуре.

как уже отмечали другие, вы можете задать llc что архитектуры, которые он поддерживает. Это не все, что полезно не только потому, что эти компоненты LLVM не могут быть установлены, но из-за капризов путей поиска и упаковочных систем, ваш llc и clang двоичные файлы могут не соответствовать одной и той же версии LLVM.

однако, ради аргумента, предположим, что вы скомпилировали оба LLVM и Clang сами или что вы в противном случае счастливы принять свои двоичные файлы LLVM как достаточно хорошие:

  • llc --version даст список всех архитектур, которые он поддерживает. По умолчанию он компилируется для поддержки всех архитектур. То, что вы можете считать единой архитектурой, такой как ARM, может иметь несколько архитектур LLVM, таких как обычная ARM, Thumb и AArch64. Это в основном для удобства реализации, потому что различные режимы выполнения имеют очень разные кодировки команд и семантику.
  • для каждой из перечисленных архитектур,llc -march=ARCH -mattr=help будет список "доступные процессоры" и " доступно особенности." Процессоры, как правило, просто удобный способ установки коллекции функций по умолчанию.

а теперь о плохих новостях. В Clang или LLVM нет удобной таблицы троек, которая может быть сброшена, потому что бэкэнды, зависящие от архитектуры, имеют возможность анализировать тройную строку в

Я использую 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, есть 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);
}

одна подсказка, которую вы можете сделать: если вы пытаетесь найти конкретную целевую тройку, это установить 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

вот что docs список в любом случае (видимо это четырехместный или пятиместный?] вместо тройки в эти дни):

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.

и вы даже можете настроить указать целевой процессор за этого, хотя он использует значение по умолчанию для целевого процессора на основе тройной.

иногда цели "решают" одно и то же, поэтому, чтобы увидеть, что цель на самом деле рассматривается как:

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

по словам Джонатана Руловс в этот разговор " какие цели поддерживает 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 

попробовать

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

он не будет перечислять все тройки, но

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

по крайней мере список всех процессоров.