Как установить llvm ubuntu
Содержание:
- Сборка LLVM
- Привязка к Eclipse
- Архитектура окружения
- LLVM API
- Оптимизация Hello, World!
Сборка LLVM
Исходники LLVM можно взять с официальной страницы проекта, как в архиве, так и из репозитория. Сборка LLVM довольно проста, но в ней есть свои особенности: сначала собирается сам LLVM, затем front-end (в нашем случае llvm-gcc), без которого не получится компилировать C/C++ программы. предполагается, что все необходимые библиотеки присутствуют в системе, в противном случае вас все равно обругают при конфигурировании. Итак, мы находимся в корне дерева исходников, собираем LLVM:
cd llvm-gcc && mkdir build && cd build
Если все прошло успешно, то пройдет, например, такая проверка:/ prefix / of / llvm / llvm-gcc -v
…
gcc version 4.2.1 ( Based on Apple Inc. build 5658 ) ( LLVM build )
Привязка к Eclipse
Архитектура окружения
LLVM состоит из нескольких исполняемых файлов, использующих libLLVM2.x.so (ядро).
opt — инструмент, оперирующий байткодом: он может накатывать любые доступные машинно-независимые оптимизации в произвольном порядке, проводить различные виды анализа и добавлять профилирование. Существуют уровни оптимизации O0, O1, O2 и O3.
llc — кодогенератор из байткода в ассемблер целевой машины. Выполняет машинно-зависимые оптимизации. Так же существуют уровни оптимизации O0, O1, O2 и O3.
llvm-ld — линковщик байткода, т.е. инструмент соединяет несколько байткодных файлов в один большой BC файл. При этом накатываются link-time оптимизации, которыми так гордятся создатели.
lli — интерпретатор байткода с возможностью JIT компиляции.
llvm-dis — преобразователь байткода (bc) в эквивалентное текстовое представление (ll).
llvm-as — преобразователь текстового представления (ll) в байткод (bc).
llvm-ar — упаковщик нескольких файлов в один. Некий аналог bzip2.
llvmc — драйвер LLVM, вызывающий по очереди парсер языка (т.е. front-end: llvm-gcc или clang), opt, llc (указанный back-end для целевой машины), ассемблер и линковщик целевой машины. Общая схема изображена на рисунке.
- include — загловочные файлы
- tools — реализация перечисленных выше инструментов
- runtime — реализация сбора профиля
- tools — реализация служебных утилит LLVM, в т.ч. tblgen
- examples — примеры использования LLVM
- lib — главная часть
- lib/Analysis — проходы, осуществляющие анализ (о проходах см. дальше)
- lib/CodeGen — реализация кодогенерации, машинно-зависимых проходов
- lib/Transforms — проходы, выполнимые над байткодом
LLVM API
Ядро LLVM — очень мощная система. Все рутинные вещи спрятаны от рядовых разработчиков, давая возможность сосредоточиться над улучшением качества компилятора. Подробная документация, множество материалов позволяют быстро войти в курс дела. Имена классов, методов, схема наследования — все продумано до мелочей. Я немного расскажу об API, связанном с оптимизациями. Чтобы было не скучно, желательно знать, что означают такие термины как базовый блок (basic block) и граф потока управления (он же CFG, Control Flow Graph). Хватит информации из Wikipedia: базовый блок и граф потока управления.
Вообще принято говорить о проходах (passes), а не об оптимизациях. Проход это реализация конкретной оптимизации или ее части. У LLVM есть менеджер проходов (PassManager), который работает по принципу FIFO. Сначала добавляются описания проходов, а затем менеджер их одну за другой выполнит. Причем, если проход нуждается в данных некоторого анализа CFG, то менеджер предварительно проведет этот анализ, если его данные устарели. Проходы работают в рамках функции (наследуются от FunctionPass) или базового блока (BasicBlockPass). В первом случае на вход алгоритму будет подана функция, во втором — базовый блок. У функции можно стандартным образом итерировать по базовым блокам, у базового блока, соответственно, по инструкциям. Можно все переставлять местами, как вздумается, добавлять новые элементы.
Как говорится, лучше один раз увидеть, чем сто раз услышать. Перейдем к практике.
Оптимизация Hello, World!
using namespace llvm ;
// Объявление собираемых статистик.
// Каждая из них может быть только челым числом без знака.
// Общее количество базовых блоков
STATISTIC ( NumberOfBasicBlocks, "Number of basic blocks in the module" ) ;
// Общее количество инструкций
STATISTIC ( NumberOfInstructions, "Number of instructions in the module" ) ;
// Среднее количество инструкций на базовый блок
STATISTIC ( AverageInstructionsInBasicBlock, "Average number of instructions in a basic block" ) ;
// Структура (класс) прохода (pass)
// В общепринятой терминологии оптимизации называются проходами, т.к.
// действие над модулем выполняется за один полный проход по его содержимому
struct BasicBlockStats : public FunctionPass
<
// Идентификационный номер прохода
static char ID ;
BasicBlockStats ( ) : FunctionPass ( ID )
// Перегрузка метода, сообщающего менеджеру проходов, что использует и меняет данный проход
virtual void getAnalysisUsage ( AnalysisUsage & AU ) const
<
// Ничего не используем, ничего не меняем
AU. setPreservesAll ( ) ;
>
// Перегрузка метода, который несет смысл прохода - операции над функцией модуля
virtual bool runOnFunction ( Function & F ) ;
BasicBlockStats ( )
<
// При вызове деструктора считаем искомое число
AverageInstructionsInBasicBlock = NumberOfInstructions / NumberOfBasicBlocks ;
>
> ;
// Идентифицировать себя нам незачем
char BasicBlockStats :: ID = 0 ;
// Выполняем регистрацию прохода в менеджере проходов
RegisterPass < BasicBlockStats > X ( "basic-block-stats" , "Basic Block Statistics" , true ) ;
> // end of unnamed namespace
// Реализация основной логики
bool BasicBlockStats :: runOnFunction ( Function & F )
<
// Проходим по каждому базовому блоку функции
for ( Function :: iterator I = F. begin ( ) , E = F. end ( ) ; I ! = E ; I ++ )
<
NumberOfInstructions + = I - > size ( ) ;
>
// Добавляем количество базовых блоков
NumberOfBasicBlocks + = F. size ( ) ;
return false ;
>
g++ -c -fPIC BasicBlockStats.cpp -o BasicBlockStats.o -I.. / include -I.. / build / include -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROSНастало время проверить, а работает ли? Я предлагаю провести проверку в боевых условиях на коде SQLite. Качаем sqlite-amalgamation-A_B_C_D.zip, распаковываем куда-нибудь. Далее я предполагаю что путь к установленным исполняемым файлам LLVM и llvm-gcc, а также к BasicBlockStats.so прописан в $PATH.
gcc -shared -s BasicBlockStats.o -o BasicBlockStats.so
Итак, среднее значение инструкций в базовом блоке в коде SQLite равно 8.
Возможно, простота написания собственного прохода (pass) вдохновит читателя на изыскания в этой области, а я на этом закончу. Буду рад ответить на ваши вопросы.
Руководство по сборке и установке LLVM на Windows и Linux. Знакомит с примерами и утилитами в составе LLVM.
Содержание
Ключевые шаги установки:
- получить или собрать LLVM с библиотеками, заголовками и утилитами
- запустить утилиту llvm-config
- полученные флаги добавить в настройки проекта или скрипты сборки
- изучить Kaleidoscope, llc и другие примеры кода в составе пакета исходных кодов LLVM
Установка бинарных пакетов в Linux
- Для версии LLVM 5.0 необходимые для разработчика пакеты будут следующими: llvm-5.0 llvm-5.0-dev llvm-5.0-runtime clang-5.0 .
- Также можно установить пакеты без явного номера версии, получив привязанную к выпуску дистрибутива версию LLVM/Clang.
Установка бинарных пакетов в Windows
Сборка через CMake
CMake используется как основная система сборки для LLVM на всех системах.
CMake представляет собой целый пакет программ и утилит. Система сборки реализуется утилитой командной строки — cmake.exe на Windows и cmake на UNIX. CMake не умеет собирать исходный код самостоятельно и генерирует входные файлы для другой системы сборки, такой как GNU Make (на Linux), xcodebuild (на MacOSX) или msbuild (на Windows)
- для сборки под Windows или MacOSX разработчик генерирует проекты для Visual Studio или XCode соответственно, и затем собирает привычным способом
- для сборки под Linux разработчик генерирует Makefile и запускает make
Примеры вызова утилиты cmake:
Сборка и установка на Windows
Допустим, вы распаковали исходный код LLVM в каталог llvm-src на Windows с Visual Studio 2017. Тогда можно создать каталоги llvm-build и llvm-install, и из каталога llvm-build вызвать:
- После откройте LLVM.sln в Visual Studio и соберите либо весь Solution, либо проекты llc и llvm-config.
- Для установки LLVM в каталог llvm-install соберите мета-проект CMakePredefinedTargets\PACKAGE
Установка после сборки на Linux
Для установки собранного LLVM лучше всего использовать checkinstall, который, в отличии от make install, создаст нормальный Debian-пакет, который затем можно удалить. При запуске checkinstall без параметров утилита сама предложит ввести название пакета, версию, описание и другие атрибуты, а в конце соберёт deb-пакет и установит его.
Чтобы избежать сюрпризов, можно явно указать параметры генерации пакета. Команда, приведённая ниже, создаст и установит пакет llvm-custom:
Утилита llvm-config
Утилита llvm-config хранит жёстко зашитые при сборке параметры собранного дистрибутива LLVM.
При вызове с параметром --includedir утилита выводит путь к заголовочным файлам LLVM, который можно добавить в настройки проекта или скрипты сборки.
При вызове с параметром --libs утилита выводит список доступных для компоновщика библиотек LLVM, оформленный в виде флагов GCC-совместимого компоновщика.
- Для подключения библиотек к проекту Visual Studio вы можете
- скопировать полученный от llvm-config список в текстовый редактор
- с помощью Find/Replace заменить формат -lAA -lBB на AA.lib\nBB.lib\n
- добавить изменённый список в настройки проекта в раздел “Linker->Input”
- Не пытайтесь скопировать список из примера выше: на вашей системе он может отличаться
При вызове без параметров утилита выдаёт справку:
Изучаем дистрибутив LLVM
Язык LLVM-IR
LLVM-IR — это промежуточный язык компиляторов, использующих библиотеки LLVM, именно с ним работают ключевые подсистемы LLVM. Язык поддерживает:
- инструкции, близкие к ассемблерным
- функции с параметрами и возвращаемым значением и их атрибуты
- структуры и массивы
- примитивные типы, например, целые числа от i1 (1-битное) до i64 (64-битное)
- в присваивании участвуют не переменные, а регистры — считается, что в LLVM бесконечно много регистров
- имена регистров локальные для функции, обычно генератор кода генерирует имена с помощью возрастающего ряда чисел
- присваивать регистр может только одна инструкция в пределах функции, для присваивания в цикле потребуется снова прыгнуть на эту инструкцию
В языке нет ни выражений, ни ООП, поскольку из LLVM-IR без излишних преобразований генерируется машинный код. Оптимизаторы кода в составе LLVM работают именно с LLVM-IR.
Пример Kaleidoscope
Пример реализует полноценный компилятор с кодогенерацией через LLVM. Особенности примера:
- фронтенд компилятора сильно упрощён, лексер и парсер написаны вручную
- для простоты примера используются глобальные переменные, от которых легко избавиться средствами ООП
- бекенд компилятора построен на библиотеках LLVM, для генерации и обработки промежуточного кода использует API библиотек LLVM
- есть поддержка выражений (включая if-выражение, эквивалентное тернарному оператору)
- есть поддержка инструкции for
- есть поддержка вызова внешних функций, написанных на языке C
- показан полный цикл кодогенерации, включая генерацию отладочной информации
Утилита llc
Утилита llc получает на вход LLVM-IR код и создаёт машинный код. Благодаря этому она служит прекрасным примером для создания финальной стадии бекенда: генератора машинного кода.
- код прост и понятен, и не содержит внутренней логики обработки данных
- в своём проекте алгоритм можно упростить ещё сильнее, убрав обработку ненужных вашему компилятору опций командной строки
- исходный код незначительно меняется от версии к версии в связи с изменениями в LLVM API
Компиляция из C/C++ в LLVM-IR
Компилятор clang способен компилировать из C/C++ в текстовое представление LLVM-IR, что позволяет исследовать способы генерации кода из различных высокоуровневых конструкций. По умолчанию clang компилирует без оптимизаций, то есть сгенерированный при обходе AST код не искажается проходами оптимизатора.
Поэтому я пытаюсь установить Halide на мою Ubuntu 12.04 (64bit). Мне нужно llvm-3.2 и clang для установки.
Запуск sudo apt-get install llvm-3.2 заканчивается «пакет не найден».
Пробую sudo apt-get install llvm или sudo apt-get install clang устанавливаю 2.9 версии. Google помог мне с этим
Сейчас sudo apt-get install llvm-3.2 clang-3.2 работает. Но когда я запускаю make в папке Halide, я все равно получаю clang: Команда не найдена.
Я предполагаю, что «clag: Команда не найдена» должна читать «clang: Команда не найдена»? Вы используете Ubuntu с графическим интерфейсом или только с командной строкой? Я скачал версию для ПК. Мне на самом деле нужен llvm 3.2, нет ни слова о версии clang.Хорошо, так что я успешно скомпилирован галогенид на Ubuntu 13.04, установив llvm , clang и build-essential . Мое единственное предположение относительно вашей проблемы заключается в том, что LLVM или лязг из установленного вами PPA-модуля могли работать не совсем правильно. Кажется, что на самом деле можно получить LLVM 3.2 из Ubuntu для 12.04 через так называемый «предложенный» архив. Вы можете попробовать очистить LLVM и установить его из «предложенного». Я объясню, как это сделать ниже. Поскольку вы упомянули, что вы новичок в Ubuntu (в оригинальной версии вопроса), я сначала объясню, что делает каждая команда, которую вы уже использовали, насколько я могу.
Итак, шаги для удаления пакетов, которые вы получили, и установки версий, доступных из точного предложения:
Надеюсь, это работает. Я не проверял ничего из этого, поэтому пользуйтесь на свой страх и риск и т. Д. Я уверен, однако, что это не должно делать ничего страшного.
РЕДАКТИРОВАТЬ: Обратите внимание, что llvm и llvm-3.2 являются независимыми. llvm зависит от llvm-2.9 ( см. здесь ), а llvm-3.2 является отдельным ( см. здесь зависимости )
Кроме того, я не уверен, знаете ли вы о завершении вкладки ; это может быть полезно, если вы ищете команду, но не знаете ее имя (например, в этом случае, возможно, она показала бы, что она llvm-config была вызвана llvm-config-3.2 ).
LLVM - это набор инструментов компилятора C / C ++, как и GCC. LLVM может компилировать C, C ++ и Objective-C. Clang, предоставляемый набором инструментов LLVM, может компилировать коды C и C ++ быстрее, чем GCC. Отладчик LLVM LLDB намного эффективнее с точки зрения памяти и очень быстро загружает символы по сравнению с GCC. LLVM поддерживает C ++ 11, C ++ 14 и C ++ 17 через проекты libc ++ и libc ++ ABI.
В этой статье я покажу вам, как установить LLVM 5 на Ubuntu 17.10 Artful Aardvark. Я буду использовать официальный репозиторий пакетов Ubuntu LLVM для установки LLVM на Ubuntu 17.10. Давайте начнем.
Сначала перейдите на официальный сайт репозитория пакетов LLVM по адресу
В этой статье мы будем использовать Ubuntu 17.10, как я уже говорил ранее. Так что прокрутите немного вниз, и вы должны найти следующие строки, как показано на скриншоте ниже. Вы можете установить LLVM версии 4 или 5. Я выберу LLVM 5. Скопируйте строку с помощью Ctrl + C
Теперь перейдите в меню приложений и найдите «обновление». Вы должны увидеть что-то подобное. Щелкните значок «Программное обеспечение и обновления», как показано на снимке экрана ниже.
Программное обеспечение и обновления должны открыться.
Теперь щелкните вкладку «Другое программное обеспечение». Вы должны увидеть следующее окно.
Теперь нажмите кнопку «Добавить ..».
Вы должны увидеть следующее окно.
Когда вы закончите вставку APT-строки, это должно выглядеть следующим образом. Теперь нажмите кнопку «Добавить источник», как показано на скриншоте ниже.
Вам будет предложено ввести пароль пользователя. Введите свой пароль для входа в Ubuntu и нажмите «Аутентифицировать».
После добавления строки APT «Программное обеспечение и обновления» должно выглядеть следующим образом.
Теперь нажмите «Закрыть» в окне «Программное обеспечение и обновления».
Теперь вы должны увидеть следующее окно. Щелкните по кнопке «Закрыть». Кнопка «Обновить» сейчас не работает. Потому что мы еще не добавили ключ GPG. Мне кажется, с терминала это проще сделать.
Теперь откройте терминал (Ctrl + Alt + T в Ubuntu) и выполните следующую команду, чтобы добавить ключ GPG для LLVM.
Ключ GPG был добавлен.
Ключ GPG был добавлен.
Теперь обновите кеш репозитория пакетов с помощью следующей команды:
$ судо apt-get update
Теперь вы можете установить LLVM Clang и LLDB.
Чтобы установить только Clang и LLDB, выполните следующую команду:
$ судо apt-get install лязг 5.0 lldb- 5.0 lld- 5.0
Теперь нажмите «y» и нажмите продолжить.
Менеджер пакетов должен все загрузить и установить.
После завершения установки вы можете запустить следующую команду, чтобы проверить, работает ли LLVM Clang.
На скриншоте видно, что установлен clang версии 5.0.1
Теперь я собираюсь написать простую программу hello world на C и C ++ и попытаться скомпилировать ее на LLVM Clang.
Это код C, который я попытаюсь скомпилировать с помощью Clang 5.0.1.
Чтобы скомпилировать код C с помощью Clang 5.0.1, запустите следующий код
$ лязг 5.0 ИСХОДНЫЙ ФАЙЛ -о ИМЯ ВЫХОДНОГО ФАЙЛА
Здесь я компилирую исходный файл test.c, а выходным исполняемым файлом будет test_ccode.
Если в исходном файле есть какая-либо ошибка, об этом будет сообщено. В моем случае все было нормально.
Теперь я могу запустить скомпилированный исполняемый файл с помощью следующей команды.
Как видите, я получил ожидаемый результат.
Теперь я скомпилирую следующий исходный файл C ++ hello world.
Чтобы скомпилировать исходный файл C ++, выполните следующую команду:
$ clang ++ 5.0 ИСХОДНЫЙ ФАЙЛ - o OUTPUT_FIlENAME
Здесь test.cpp - это исходный файл C ++, который я компилирую, а test_cpp - это исполняемый файл, который будет сгенерирован в результате.
Ошибок не было, поэтому компиляция прошла успешно.
Вы можете выполнить программу так же, как и раньше:
Вы можете видеть, что результат такой, как ожидалось.
Вот как вы устанавливаете LLVM 5 из официального репозитория LLVM на Ubuntu 17.10 Artful Aardvark. Спасибо, что прочитали эту статью.
Написало что успешно установилось, проверил через llvm-config-8 --version, вывело версию 8.0.1, а когда пишу просто llvm-config --version, пишет 3.4. То есть все программы продолжают обнаруживать старую версию. Что делать? Удалял уже старую, новая остаётся но не обнаруживается, потому что пакет там с цифрой и тире наверное, а как это всё поместить вместо старой версии под обычным названием пакета (без цифр версии в конце) я не знаю
Последнее исправление: menangen 15.07.19 12:16:58 (всего исправлений: 1)
Не совсем понял, при чём тут eoan, у меня же trusty. И как это заставит программы использовать новую версию вместо 3.4?
Попробуй update-alternatives. Возможно нужны какие-то ключи, загугли.
Можно trusty с пакетами от eoan (llvm/clang), и остальные обновятся, если нужно.
Зачем? Даже если пакеты из eoan заработают, они по прежнему не будут использоваться! У меня почему-то всегда используется старая версия, а новая не видна нигде
Откуда качать? Из toolchain? Если из toolchain то они не будут использоваться, программа будет видеть только старую версию без номера версии в названии пакета (3.4), а остальные (например пакет-8) не будут использоваться
Альтернативный тулчейн надо указывать отдельно. Смирись.
Расскажи ещё, пожалуйста, а зачем тебе 14.04?
Пакеты от eoan не заработают на 14.04, там libc старый.
14.04 стоит в системе exagear, менять дистрибутив нельзя чтобы не нарушить работу программы
Я тебе не про eoan. Я про префикс.
Ясно. Ну вам всего хорошего там, здоровья, счастья, терпения.
Могли бы его как-нибудь отдельно. Или сбандлить с зависимостями. Ну вы понимаете.
Сделать символические ссылки на бинари. Пример:
После этого увидеть желаемое:
Я уже сделал так, удалил llvm 3.4 и создал симлинки без версии для каждого бинарника, и всё заработало
Скорее всего там симлинк, ибо сейчас llvm-config нумеруется сгласно версии (т.е. должно быть llvm-config-8 )
Читайте также: