лязг: как список поддерживаемых архитектур?
В настоящее время я заинтересован в 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 ответов:
насколько я могу судить, нет опции командной строки, чтобы перечислить, какие архитектуры заданы
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. ...