2013-02-23 4 views
57

В настоящее время меня интересует 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) 

Я знаю, лязг имеет -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/whatever), как я могу получить тот, который поддерживает больше платформы?

если я SVN последнего лязга так:

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

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

+7

не полный ответ, но ооо --version даст вам Мишени –

+1

Я думаю, что вы» Придется взглянуть на источник, чтобы увидеть троек.И, как я понимаю, стандартная сборка clang будет включать базовую поддержку кросс-компиляции. Базовая поддержка только превращает код в объектные файлы (если интегрированный ассемблер поддерживает тройку, в противном случае вам придется брать файлы .s). Вам нужно будет поставлять заголовки, библиотеки, компоновщик (до тех пор, пока не будет работать lld) и т. Д. – bames53

+1

Хотя установка по умолчанию имеет только clang и clang ++ исполняемые файлы, как и другие платформы, вы можете создавать копии или жесткие ссылки из них с помощью троек и квадроциклов закодированных в именах. clang ++ и clang на самом деле являются просто копиями друг друга, он проверяет имя исполняемого файла, чтобы увидеть, как обрабатывать ввод. –

ответ

23

Я использую 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/водитель/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); 
} 
+4

Что касается второй и третьей частей Triple? – osgx

+0

И фактический парсер имени Arch в ArchType находится в http://code.metager.de/source/xref/llvm/llvm/lib/Support/Triple.cpp#221 - llvm/lib/Support/Triple.cpp function ' static Triple :: ArchType parseArch (StringRef ArchName) ' – osgx

+0

Доступный двоичный файл clang не означает, что пользователь скомпилировал его из источника. –

1

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

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

будет по крайней мере список всех процессоров.

+1

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

5

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

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

Доступный clang не означает, что llc доступен. –

+1

кажется, что llc обычно устанавливается вместе с clang, однако ... и вы можете установить его, если не из своего диспетчера пакетов, и он должен выстраиваться в линию, я бы предположил ... однако этот список выглядит, если вы хотите настроить таргетинг конкретный процессор, не обязательно другая «тройная» архитектура, поскольку OP хотел ... – rogerdpack

+1

Чтобы отобразить опции для других архитектур, вы можете использовать опцию '-mtriple', как в' llc -mtriple = arm -mattr = help' , – Lekensteyn

13

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

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

7

Согласно Джонатан Рулос в этом разговоре “Which targets does Clang support?”:

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

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

Видимо есть «много» мишеней там, вот список, не стесняйтесь добавлять к нему, вики сообщества стиль:

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 
Смежные вопросы