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

98

В настоящее время меня интересует 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 есть параметр -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 это только один двоичный файл (как я читал на некоторых форумах). Но как мне получить список поддерживаемых целей? И если моя цель не поддерживается в моем дистрибутиве (linux / windows / macos / что угодно), как я могу получить тот, который поддерживает больше платформ?

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

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

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

exebook
источник
8
не полный ответ, но llc --version даст вам цели
old_timer
1
Я думаю, вам придется посмотреть исходник, чтобы увидеть тройки. Насколько я понимаю, стандартная сборка clang будет включать базовую поддержку кросс-компиляции. Базовая поддержка превращает код только в объектные файлы (если интегрированный ассемблер поддерживает тройку, в противном случае вам придется брать файлы .s). Вам нужно будет предоставить заголовки, библиотеки, компоновщик (в любом случае, пока lld не заработает) и т. Д.
bames53
1
Хотя установка по умолчанию содержит только исполняемые файлы clang и clang ++, как и на других платформах, вы можете создавать их копии или жесткие ссылки с троек и четверок, закодированных в именах. clang ++ и clang на самом деле являются просто копиями друг друга, он проверяет имя исполняемого файла, чтобы увидеть, как обрабатывать ввод.
LB

Ответы:

57

Насколько я могу судить, в командной строке нет параметра для перечисления архитектур, поддерживаемых данным 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 на новую платформу. или архитектура. Вместо этого вы, вероятно, обнаружите, что результаты llc -march=arm -mattr=helpогромного количества различных функций ARM будут более полезными в ваших исследованиях.

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

pndc
источник
35

Я использую 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.

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);
}
a'Q
источник
5
как насчет второй и третьей частей тройки?
osgx 04
Фактический синтаксический анализатор имени Arch в ArchType находится в 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
Некоторые описания целей и троек clang : llvm.org/devmtg/2014-04/PDFs/LightningTalks/… , предложено в 2014 г .: «Target Triple: <arch> <sub> - <vendor> - <sys> - <abi> ; --print-supported-archs --print-supported-vendors --print-supported-systems --print-supported-abis --print-multi-libs --print-available- target
osgx
20

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

Тогда вы все равно знаете, как нацелить его при кросс-компиляции.

Очевидно, есть "много" целей, вот список, не стесняйтесь добавлять к нему в стиле вики сообщества:

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

Вот что в любом случае список документов (очевидно, это четверка [или пятерка?] Вместо тройки в наши дни):

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
rogerdpack
источник
Когда это говорит mingw32, это означает, что он не будет работать с MinGW64? Есть ли что-то, совместимое с MSVC?
Рой
@Royi stackoverflow.com/q/39871656/32453 может быть полезно, удачи!
rogerdpack
13

По словам Джонатана Рулофса в своем выступлении, «Какие цели поддерживает 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 
jww
источник
Похоже, это не работает в новых версиях Clang.
Royi
6

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

> 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
1
Кажется, что llc обычно устанавливается вместе с clang, однако ... и вы можете установить его, если не из вашего диспетчера пакетов, и он должен выровняться, я думаю ... однако этот список выглядит, если вы хотите настроить таргетинг на конкретный процессор, не обязательно другую «тройную» архитектуру, как того хотела ОП ...
rogerdpack
5
Чтобы перечислить параметры для других архитектур, вы можете использовать -mtripleпараметр, как в llc -mtriple=arm -mattr=help.
Lekensteyn
4

Начиная с 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 .

Valiano
источник
3

Он не перечислит все тройки, но

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

хотя бы перечислит все процессоры.

млрд. кубометров
источник
1
В нем будут перечислены только параметры, которые могут быть применены к текущей (по умолчанию) цели.
osgx
1

Если вас интересует, какие целевые объекты поддерживаются для построения 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
скрутари
источник