Подтвердить что ты не робот

Clang: как список поддерживаемых целевых архитектур?

В настоящее время меня интересует 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 я * 86 - * - linux-gnu и т.д. http://git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS)

в мире clang, это только один бинарный (как я читал на некоторых форумах). Но как мне получить список поддерживаемых целей? И если моя цель не поддерживается на моем дистрибутиве (linux/windows/macos/whatever), как я могу получить тот, который поддерживает больше платформы?

если я SVN последний clang вот так:

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

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

4b9b3361

Ответ 1

Я использую 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 есть ссылка на руку.

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);
}

Ответ 2

Насколько я могу судить, нет опции командной строки для перечисления тех архитектур, которые поддерживает данный двоичный файл 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 нет таблицы удобных таблиц, которые могут быть сброшены, потому что для специфичных для архитектуры бэкендов можно разделить тройную строку на объект llvm::Triple (определенный в include/llvm/ADT/Triple.h). Другими словами, для сброса всех доступных троек требуется решение проблемы с остановкой. См., Например, llvm::ARM_MC::ParseARMTriple(...), какие специальные случаи анализируют строку "generic".

В конечном счете, однако, "тройной" в основном является функция обратной совместимости, которая делает Clang заменой для GCC, поэтому вам вообще не нужно уделять этому много внимания, если вы не переносите Clang или LLVM на новую платформу или архитектуру. Вместо этого вы, вероятно, найдете результаты llv -march=arm -mattr=help и ошеломляете огромный массив различных функций ARM, чтобы быть более полезными в ваших исследованиях.

Удачи вам в ваших исследованиях!

Ответ 3

По словам Джонатана Рулофса в этом разговоре "Какие цели поддерживает 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 могут предоставить следующее. Они перечислены как "предлагаемые", хотя еще не доступны по крайней мере с версии 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 

Ответ 4

Также попробуйте

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

Ответ 5

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

Здесь все равно 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

Ответ 6

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

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

по крайней мере перечислит все процессоры.