Новая версия набора компиляторов LLVM 3.5
5 сентября 2014 года
Анонсирован (Архивная копия от 22 апреля 2015 на Wayback Machine) релиз проекта LLVM 3.5 (Low Level Virtual Machine) - GCC совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный платформонезависимый псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.
Улучшения в Clang 3.5:
- Достижение уровня самопересборки (self host) на платформах Linux/Sparc64 и FreeBSD/Sparc64;
- Начальная поддержка некоторых элементов будущего международного стандарта C++1z (С++17), идущего следом за стандартом C++ 14, полная поддержка которого уже реализована в Clang (Clang стал первым компилятором с поддержкой C++ 14);
- На платформе Windows задействован обновлённый MinGW ABI для достижения совместимости с GCC 4.7 и более новыми выпусками;
- Значительный прогресс в реализации поддержки OpenMP. Добавлен разбор и анализ семантики для всех pragma, определённых в спецификации OpenMP 3.1, за исключением atomics и ordered. Runtime-библиотека OpenMP адаптирована для поддержки арихитектур ARM и PowerPC. Частично реализованы некоторые возможности OpenMP 4.0, такие как векторизация последовательных и параллелизированных циклов с использованием инструкции SIMD, и поддержка ускорения вычислений за счёт задействования дополнительных аппаратных вычислительных устройств.
- Средство проверки наличия атрибутов __has_attribute теперь учитывает поддержку заданного атрибута в целевой платформе, для которой осуществляется сборка (ранее проверялось лишь семантическое наличие атрибута без учёта его фактической поддержки);
- Поддержка генерации ремарок (флаг "-R") - диагностических сообщений о процессе компиляции, в том числе информирующих ("-Rpass") об использовании тех или иных оптимизаций для разных частей кода. Изучение ремарок позволяет разработчику увеличить эффективность оптимизации кода;
- Расширены средства диагностики ошибок. Обеспечен вывод нефатального предупреждения вместо вывода ошибки при использовании неподдерживаемых флагов оптимизации GCC. Добавлены новые типы предупреждений: -Wabsolute-value, -Wtautological-pointer-compare и -Wtautological-undefined-compare.
- Прекращена поддержка устаревших флагов -faddress-sanitizer, -fthread-sanitizer, -fcatch-undefined-behavior и -fbounds-checking, вместо которых следует использовать семейство флагов "-fsanitize=";
- В статический анализатор добавлено выявление возможных делений на ноль, при наличии сравнения с нулём после операции деления (int avg = sum / count; if (count == 0){...});
- Для архитектуры ARM по умолчанию включён интегрированный ассемблер;
- Для улучшения диагностики интегрированный ассемблер теперь производит разбор и проверку ассемблерных inline-вставок;
Основные новшества(недоступная ссылка) LLVM 3.5:
- В реализацию интегрированного ассемблера для архитектуры ARM (IAS) добавлена поддержка многих директив и расширений GNU, используемых в коде таких проектов, как ядро Linux. Доведён до готовности и включён по умолчанию бэкенд EHABI, используемый для обработки исключений на системах ARM;
- В интегрированный ассемблер добавлена поддержка MIPS и PowerPC;
- Поддержка шестой редакции архитектур MIPS32 и MIPS64;
- Все бэкенды переведены на использование системы MC (LLVM Machine Code) для вывода ассемблерных инструкций. Для генерации номеров строк в отладочных данных теперь используются только секции .loc;
- llvm-ar теперь обрабатывает IR-файлы по аналогии с обычными объектными файлами;
- Значительно улучшена поддержка архитектуры AArch64, в том числе улучшен процесс генерации кода, добавлена поддержка iOS (arm64-apple-ios7.0) и значительно ускорен процесс компиляции при выборе уровня оптимизации "-O0";
- Сборка и установка документации LLVM, Clang и lld sphinx теперь может быть проведена при сборке в CMake. В системах сборки Autoconf/Makefile и CMake обеспечена генерация файла LLVMConfig.cmake для экспорта установленных библиотек;
В процессе разработки LLVM 3.5 компания Apple открыла исходные тексты своих наработок, используемых для генерации 64-разрядного ARM кода на платформе iOS. Данные наработки по функциональности пересекаются с развиваемым в LLVM генератором кода, но проекты развивались параллельно и не пересекаются между собой. Поддержание двух близких по функциональности бэкендов признано нецелесообразным, поэтому решено оставить в качестве базового бэкенд Apple ARM64, как более зрелый и проверенный на практике, и понемногу переносить оптимизации и расширенную функциональность из ранее развиваемого бэкенда LLVM. В итоге планируется подготовить комбинируемую реализацию, включающую лучшие возможности обоих бэкендов. Для избежания путаницы комбинированная реализация бэкенда развивается под именем AArch64.
Из параллельно развивающихся проектов, основанных на LLVM, можно отметить:
- KLEE - символьный анализатор и генератор тестовых наборов;
- Runtime-библиотека compiler-rt;
- llvm-mc - автогенератор ассемблера, дизассемблера и других связанных с машинным кодом компонентов на основе описаний параметров LLVM-совместимых платформ.
- Реализация функционального языка программирования Pure(недоступная ссылка);
- LDC - компилятор для языка D;
- Roadsend PHP (Архивная копия от 6 сентября 2008 на Wayback Machine) - оптимизатор, статический и JIT компилятор для языка PHP;
- Виртуальные машины для Ruby: Rubinius и MacRuby;
- LLVM-Lua
- FlashCCompiler - средство для компиляции кода на языке Си в вид, пригодный для выполнения в виртуальной машине Adobe Flash;
- LLDB - новая модульная инфраструктура отладки, использующая такие подсистемы LLVM как API для дизассемблирования, Clang AST (Abstract Syntax Tree), парсер выражений, генератор кода и JIT-компилятор. LLDB поддерживает отладку многопоточных программ на языках C, Objective-C и C++; отличается возможностью подключения плагинов и скриптов на языке Python; показывает крайне высокое быстродействие при отладке программ большого размера;
- emscripten - компилятор биткода LLVM в JavaScript, позволяющий преобразовать для запуска в браузере приложения, изначально написанные на языке Си. Например, удалось запустить Python, Lua, Quake, Freetype;
- sparse-llvm - бэкенд, нацеленный на создание Си-компилятора, способного собирать ядро Linux.
- Portable OpenCL - открытая и независимая реализация стандарта OpenCL;
- CUDA Compiler - позволяет сгенерировать GPU-инструкции из кода, написанного на языках Си, Си++ и Fortran;
- Julia - открытый динамический язык программирования, использующий наработки проекта LLVM.
- Jade (Just-in-time Adaptive Decoder Engine) - универсальный движок для декодирования видео, использующий LLVM для JIT-компиляции адаптивных конфигураций декодера видео, определённых комитетом MPEG Reconfigurable Video Coding (RVC);
- PNaCl (Архивная копия от 7 октября 2013 на Wayback Machine) (Portable Native Client) - интегрированная в браузер Chrome система, которая позволяет организовать выполнение приложений, написанных на языках C и С++, в специальном изолированном окружении web-браузера, независимо от текущей аппаратной архитектуры;
- PoCL (Portable Computing Language OpenCL) - реализация стандарта OpenCL, независимая от производителей графических ускорителей и позволяющая использовать различные бэкенды для выполнения OpenCL-ядер на разных типах графических и центральных процессоров;
- Likely (Архивная копия от 15 декабря 2021 на Wayback Machine) - открытый предметно-ориентированный язык для распознавания изображений. Алгоритмы распознавания на лету компилируются (JIT) при помощи инфраструктуры LLVM MCJIT для выполнения на одно- или многоядерных CPU, а также на GPU с использованием OpenCL SPIR или CUDA.
- LibBeauty (Архивная копия от 22 октября 2020 на Wayback Machine) - инструментарий для декомпиляции и обратного инжиниринга, построенный с использованием дизассемблера LLVM и LLVM IR Builder. Приняв на входе объектный файл (.o) на выходе генерирует файл в промежуточном представлении LLVM (.bc или .ll);
- McSema - фреймворк для преобразования машинного кода в биткод LLVM;
- Swift - основанный на LLVM язык программирования, развиваемый компанией Apple;
- FTL (Fourth Tier LLVM) - JIT-компилятор для движка WebKit;
Источники
править- Главная ссылка к новости (http://lists.cs.uiuc.edu/piper...) (Архивная копия от 22 апреля 2015 на Wayback Machine)
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.