Новая версия набора компиляторов LLVM 3.5
Анонсирован релиз проекта 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=»; Для архитектуры ARM по умолчанию включён интегрированный ассемблер. Для улучшения диагностики с его помощью обеспечена проверка ассемблерных inline-вставок; В статический анализатор добавлено выявление возможных делений на ноль, при наличии сравнения с нулём после операции деления (int avg = sum / count; if (count == 0){…}); Основные новшества LLVM 3.5:
В реализацию интегрированного ассемблера для архитекстуры ARM добавлена поддержка многих директив и расширений GNU; В интегрированный ассемблер добавлена поддержка MIPS и PowerPC; Поддержка шестой редакции архитектур MIPS32 и MIPS64; Значительно улучшена поддержка архитектуры AArch64, в том числе улучшен процесс генерации кода, добавлена поддержка iOS и значительно ускорен процесс компиляции при выборе уровня оптимизации »-O0»; Из параллельно развивающихся проектов, основанных на LLVM, можно отметить:
KLEE — символьный анализатор и генератор тестовых наборов; Runtime-библиотека compiler-rt; llvm-mc — автогенератор ассемблера, дизассемблера и других связанных с машинным кодом компонентов на основе описаний параметров LLVM-совместимых платформ. VMKit — виртуальная машина для Java и .NET; Реализация функционального языка программирования Pure; LDC — компилятор для языка D; Roadsend PHP — оптимизатор, статический и 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 (Portable Native Client) — интегрированная в браузер Chrome система, которая позволяет организовать выполнение приложений, написанных на языках C и С++, в специальном изолированном окружении web-браузера, независимо от текущей аппаратной архитектуры; PoCL (Portable Computing Language OpenCL) — реализация стандарта OpenCL, независимая от производителей графических ускорителей и позволяющая использовать различные бэкенды для выполнения OpenCL-ядер на разных типах графических и центральных процессоров; Likely — открытый предметно-ориентированный язык для распознавания изображений. Алгоритмы распознавания на лету компилируются (JIT) при помощи инфраструктуры LLVM MCJIT для выполнения на одно- или многоядерных CPU, а также на GPU с использованием OpenCL SPIR или CUDA. LibBeauty — инструментарий для декомпиляции и обратного инжиниринга, построенный с использованием дизассемблера LLVM и LLVM IR Builder. Приняв на входе объектный файл (.o) на выходе генерирует файл в промежуточном представлении LLVM (.bc или .ll); McSema — фреймворк для преобразования машинного кода в биткод LLVM; Swift — основанный на LLVM язык программирования, развиваемый компанией Apple; FTL (Fourth Tier LLVM) — JIT-компилятор для движка WebKit;
© OpenNet