Увидел свет набор компиляторов LLVM 3.7

Представлен релиз проекта LLVM 3.7 (Low Level Virtual Machine) — GCC совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный платформонезависимый псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.

Улучшения в Clang 3.7:

  • Обеспечена полная поддержка стандарта OpenMP 3.1 (Open Multi-Processing), предоставляющего средства для применения методов параллельного программирования в программах на языках Си и Си++. Доступны средства обеспечения параллелизма на уровне задач (распараллеливание функций и циклов) и параллелизма на уровне данных (векторизация, распараллеливание типовых операций над массивами данных). В том числе реализованы комбинированные директивы, такие как »#pragma omp parallel for» и »#pragma omp parallel sections», атомарные операции (»#pragma omp atomic») и средства векторизации последовательных и параллелизированных циклов на процессорах с поддержкой инструкций SIMD (»#pragma omp simd»).

    Реализация OpenMP в Clang базируется на открытой компанией Intel runtime-библиотеке OpenMP, которая связывается с итоговыми OpenMP-приложениями и выполняет диспетчеризацию потоков в процессе выполнения OpenMP-программы. Из особенностей библиотеки отмечается поддержка различных аппаратных архитектур (x86, x86_64, PowerPC, ARM), высокая производительность и совместимость на уровне ABI с GCC и проприетарными OpenMP-компиляторами Intel. Для сборки программы с задействованием OpenMP достаточно указать при компиляции опцию »-fopenmp», а также пути к заголовочному файлу (»-I путь к omp.h») и библиотеке (»-L путь к библиотеке openmp»).

  • Интегрирован механизм проверки целостности выполнения программы CFI (Control Flow Integrity), нацеленный на выявление некоторых форм неопределённого поведения, которые потенциально могут привести к нарушению потока управления (control flow) в результате атаки на приложение. Представленный метод оптимизирован для минимизации накладных расходов, что позволяет использовать его при сборке релизов. При сборке Chromium с включением CFI наблюдалось замедление менее, чем на 1%, но увеличение размера исполняемого файла на 15%. Для включения следует использовать флаг »-fsanitize=cfi» в сочетании с включением оптимизации на этапе связывания (»-flto»);
  • При использовании языковых расширений для определения атрибутов (__declspec) теперь требуется указывать флаг »-fms-extensions» или »-fborland». Расширения также доступны при сборке кода CUDA;
  • При сборке для Windows обеспечена поддержка некоторых видов нестандартного использования языковых конструкций __try, __except и __finally. MSVC-совместимые расширения C++ пока не поддерживаются;
  • Средства диагностики расширены для отлавливания дополнительных проблем и вывода более точной информации о характере проблемы. Среди новых предупреждений отмечаются: -Wrange-loop-analysis, -Wredundant-move, Wpessimizing-move, -Wmove, -Winfinite-recursion и -Wobjc-circular-container;
  • Добавлен новый флаг компиляции »-fsized-deallocation», отвечающий за включения поддержки функции delete с указанием размера (sized deallocation), определённой в спецификации C++14;

Основные новшества LLVM 3.7:

  • Новый C++ JIT API для компиляции по запросу (ORC, On Request Compilation), отталкивающийся в функциональности от MCJIT, но созданный для упрощения интеграции новых возможностей и улучшения тестируемости кодовой базы. Из интересных новшеств отмечаются средства отложенной компиляции функций по запросу (function-at-a-time) на системах x86. В состав также входит новая реализация MCJIT API, в том числе режим для симуляции поведения MCJIT (OrcMCJITReplacement). MCJIT оставлен в кодовой базе и продолжает использоваться в качесестве движка JIT (ExecutionEngine) по умолчанию;
  • Новый бэкенд для компиляции сценариев в байткод BPF (Berkeley Packet Filter), поддерживающий набор расширенных инструкций, представленных в доступной в свежих ядрах Linux виртуальной машине eBPF. Собранные BPF-сценарии могут быть загружены в ядро Linux при помощи системного вызова bpf (2) и использованы для создания похожих на модули ядра обработчиков и фильтров. Из отличий расширенного BPF отмечается добавление восьми дополнительных регистров, реализация новых инструкций (call, shift, map hash/array, операции чтения и сохранения в стеке от 1 до 8 байт), добавление 64-разрядных регистров и возможность обращения к ограниченным функциям ядра. Для задействования бэкенда для генерации байткода BPF следует использовать опцию »-target bpf» в Clang или »-march=bpf» в llc;
  • Для написания модулей для виртуальной машины eBPF представлен фреймворк BCC (BPF Compiler Collection), предоставляющий средства по написанию сценариев на языке Си, которые затем транслируются в корректные программы BPF. В том числе в BCC предоставляются привязки к подсистемам ядра Linux, позволяющие создавать фильтры для сокетов, классификаторы трафика и обработчики определённой сетевой активности. Для языка Python подготовлен набор биндингов. Кроме того, можно отметить инициированный организацией Linux Foundation проект IO Visor, нацеленный на создание инструментов и инфраструктуры для разработки расширяющих ядро Linux сетевых возможностей и обработчиков ввода/вывода, реализованных в форме модулей BPF.

Из параллельно развивающихся проектов, основанных на LLVM, можно отметить:

  • KLEE — символьный анализатор и генератор тестовых наборов;
  • Runtime-библиотека compiler-rt;
  • llvm-mc — автогенератор ассемблера, дизассемблера и других связанных с машинным кодом компонентов на основе описаний параметров LLVM-совместимых платформ.
  • Реализация функционального языка программирования 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