В настоящее время меня интересует 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, теоретически он должен быть очень перекрестно-дружественным? Спасибо!
Ответы:
Насколько я могу судить, в командной строке нет параметра для перечисления архитектур, поддерживаемых данным
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 будут более полезными в ваших исследованиях.Удачи в ваших исследованиях!
источник
Я использую Clang 3.3, думаю, лучший способ получить ответ - это прочитать исходный код. в llvm / ADT / Triple.h ( http://llvm.org/doxygen/Triple_8h_source.html ):
а в clang / lib / Driver / ToolChains.cpp есть что-то о arm.
источник
static Triple::ArchType parseArch(StringRef ArchName)
Один совет, который вы можете сделать: если вы пытаетесь найти конкретную целевую тройку, нужно установить llvm в этой системе, а затем выполнить
или альтернативно:
Тогда вы все равно знаете, как нацелить его при кросс-компиляции.
Очевидно, есть "много" целей, вот список, не стесняйтесь добавлять к нему в стиле вики сообщества:
Вот что в любом случае список документов (очевидно, это четверка [или пятерка?] Вместо тройки в наши дни):
и вы даже можете точно настроить, указав целевой ЦП сверх этого, хотя он использует разумное значение по умолчанию для целевого ЦП на основе тройки.
Иногда цели «решаются» на одно и то же, поэтому, чтобы увидеть, как на самом деле рассматривается цель:
источник
mingw32
, это означает, что он не будет работать с MinGW64? Есть ли что-то, совместимое с MSVC?По словам Джонатана Рулофса в своем выступлении, «Какие цели поддерживает Clang?» :
В будущих версиях Clang может быть следующее. Они перечислены как «предлагаемые», хотя еще не доступны по крайней мере в версии 3.9.0:
источник
Также попробуйте
источник
-mtriple
параметр, как вllc -mtriple=arm -mattr=help
.Начиная с Clang 11 (магистраль), список поддерживаемых целевых архитектур можно было легко распечатать с помощью недавно добавленного
-print-targets
флага:Ссылки: LLVM PR , LLVM commit , документация Clang 11 .
источник
Он не перечислит все тройки, но
хотя бы перечислит все процессоры.
источник
Если вас интересует, какие целевые объекты поддерживаются для построения LLVM или Clang из источника (значения для
-DLLVM_TARGETS_TO_BUILD
), поищите список подкаталогов вllvm/lib/Target
папке исходного дистрибутива. По состоянию на 9.0.1:источник