The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Новая версия набора компиляторов LLVM 3.8

09.03.2016 10:06

Состоялся релиз проекта LLVM 3.8 (Low Level Virtual Machine) - GCC-совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный платформонезависимый псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы. В новом выпуске включена по умолчанию поддержка OpenMP 3.1, добавлены элементы OpenMP 4.x, реализована возможность компиляции CUDA, задействован режим shrink-wrapping, добавлены новые возможности OpenCL 2.0, добавлен режим emutls, улучшен статический анализатор, проведена ревизия C API, объявлена устаревшей система сборки autoconf.

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

  • Значительно улучшен генератор кода для конструкций OpenMP, который теперь генерирует более стабильный и быстрый код. Включена по умолчанию поддержка стандарта OpenMP 3.1 (Open Multi-Processing), предоставляющего средства для применения методов параллельного программирования в программах на языках Си и Си++. Вместо библиотеки GCC OpenMP в Clang используется открытая компанией Intel runtime-библиотека OpenMP, которая при указании флага "-fopenmp" связывается с итоговыми OpenMP-приложениями и выполняет диспетчеризацию потоков в процессе выполнения OpenMP-программы.

    Кроме полной поддержки OpenMP 3.1 в новом выпуске также реализована порция возможностей, доступных в OpenMP 4.0/4.5: конструкции map, num_teams, simdlen, hint и thread_limit, директивы "target", "target data", "target enter data" и "target exit data", определение зависимостей между задачами, секции массивов, модификаторы имён для выражений "if", возможность использования выражения linear в директивах управления циклами;

  • Экспериментальная поддержка компиляции CUDA. Драйвер определяет наличие установок CUDA, создаёт сценарии компиляции компонентов для хоста и устройства (GPU), связывает выполняемый на стороне устройства код с соответствующим биткодом и генерирует единый объектный файл с кодом для выполнения на стороне хоста и GPU. Поддерживается перезагрузка функций на основе атрибутов, которая позволяет компилировать код CUDA без его разделения на отдельные части для хоста и GPU;
  • Режим диагностики "-Wmicrosoft" разбит на серию отдельных флагов, что позволяет выборочно включать определённые подкатегории предупреждений. Флаг "-Wno-microsoft" по-прежнему отключает, а "-Wmicrosoft" включает сразу все предупреждения, специфичные для расширений MSVC;
  • Возможность настройки включения отладочной информации DWARF с учётом особенностей различных отладчиков. В частности, можно не включать в файл отладочные данные, которые не поддерживаются или не используются определённым отладчиком, или добавлять специфичные для какого-то отладчика расширения. Предусмотрены три флага: "-ggdb" - адаптация для GDB (после опции можно указать отладочный уровень, например, "-ggdb1"), "-glldb" - адаптация для LLDB, "-gsce" - адаптация для Sony Computer Entertainment debugger;
  • Добавлена опция "-fstrict-vtable-pointers", включающая экспериментальный режим улучшенной девиртуализации;
  • Улучшены средства передачи в LLVM дополнительной информации о выравнивании указателей для строгих типов, задаваемой в коде через специальные атрибуты. Разыменование некорректно выравненных указателей относится к области неопределённого поведения, так как может привести к крахам или к понижению производительности на архитектурах, требующих обязательного выравнивания указателей;
  • Для языка Си улучшена поддержка проверки "__builtin_object_size" и возможность применения специфичных для Си преобразований типов для функций, помеченных атрибутом "overloadable";
  • Расширена поддержка диалекта языка Си, используемого в OpenCL. Добавлены новые возможности OpenCL 2.0: опция "-std=CL2.0", поддержка разделяемой виртуальной памяти (__generic), предварительная поддержка pipes (доступ к памяти по принципу FIFO), атомарные типы (atomic_int, atomic_uint, atomic_long и т.п.), типы для изображений ( image2d_depth_t, image2d_msaa_t и т.п.). В общем виде для OpenCL улучшена поддержка векторов, расширены средства диагностики, добавлен оператор "^^", реализована порция новых флагов: -cl-no-signed-zeros, -cl-unsafe-math-optimizations, -cl-finite-math-only, -cl-fast-relaxed-math;
  • Улучшены средства статического анализа. В базовый состав включены утилиты scan-build и scan-view, предназначенные для запуска статического анализа для проекта и просмотра результатов проверки. Значительно расширены средства статического анализа лямбда-функций C++, в том числе добавлен межпроцедурный анализ лямбда-приложений. Добавлены новые проверки: некорректное использование vfork() и типа _Nonnull, выявление ошибок локализации в Cocoa-приложениях и т.д.

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

  • Переведена в разряд устаревших система сборки на базе инструментария autoconf. Поддержка autoconf будет удалена в выпуске LLVM 3.9. В качестве основной системы сборки используется CMake;
  • Прекращена поддержка Windows Vista и XP. Для работы LLVM на платформе Windows требуется Windows 7 и старше;
  • Добавлена поддержка совместимого с GCC и независящего от особенностей целевых платформ режима хранения локальных переменных emutls (TLS - Thread-Local Storage). При указании флага "-femultated-tls" все обращения к TLS-переменным транслируются в вызов __emutls_get_address, предоставляемый runtime-библиотекой;
  • Компоновщик IR Linker разделён на две части: IRMover (перемещает биткод из одного модуля в другой ) и Linker (принимает решение о связывании);
  • Добавлена опциональная возможность связывания clang и утилит LLVM с одной разделяемой библиотекой libLLVM (для включения следует установить флаг "-DLLVM_LINK_LLVM_DYLIB=ON" в CMake);
  • Внесены многочисленные улучшения в бэкенды для архитектур ARM, AArch64, MIPS и PowerPC;
  • Для архитектуры x86 повышена эффективность кода сравнения больших целочисленных значений (64-разрядных чисел на 32-разрядных системах);
  • Включена по умолчанию оптимизации по перемещению пролога и эпилога функций в статичные блоки кода (shrink-wrapping);
  • Прекращена генерация секций .data.rel.ro.local и .data.rel;
  • Документированы принципы обеспечения стабильности C API для релизов и экспериментальных веток, а также правила расширения C API; В разряд устаревших переведены функции C API: LLVMLinkModules (следует использовать LLVMLinkModules2), LLVMParseBitcode, LLVMParseBitcodeInContext, LLVMGetBitcodeModuleInContext, LLVMGetBitcodeModule, LLVMGetBitcodeModuleProviderInContext, LLVMGetBitcodeModuleProvider, LLVMCreateExecutionEngine, LLVMCreateInterpreter, LLVMCreateJITCompiler, LLVMAddModuleProvider и LLVMRemoveModuleProvider; Проведена реорганизация заголовочных файлов C API: связанные с типами определения перенесены в Type.h, а обработка ошибок в ErrorHandling.h;




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

  • KLEE - символьный анализатор и генератор тестовых наборов;
  • Runtime-библиотека compiler-rt;
  • llvm-mc - автогенератор ассемблера, дизассемблера и других связанных с машинным кодом компонентов на основе описаний параметров LLVM-совместимых платформ.
  • Реализация функционального языка программирования Pure;
  • LDC - компилятор для языка D;
  • Виртуальные машины для 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.
  • 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);
  • RUST - основанный на LLVM язык программирования, развиваемый компанией Mozilla;
  • McSema - фреймворк для преобразования машинного кода в биткод LLVM;
  • Swift - основанный на LLVM язык программирования, развиваемый компанией Apple;
  • FTL (Fourth Tier LLVM) - JIT-компилятор для движка WebKit;
  • Polly - экспериментальный оптимизатор, поддерживающий несколько техник оптимизации циклов и позволяющий организовать автоматическое распараллеливание кода с задействованием OpenMP.


  1. Главная ссылка к новости (http://lists.llvm.org/pipermai...)
  2. OpenNews: AMD развивает основанный на LLVM универсальный компилятор C++ и CUDA для CPU/GPU
  3. OpenNews: Администрация по национальной ядерной безопасности США подключилась к усовершенствованию LLVM
  4. OpenNews: Увидел свет набор компиляторов LLVM 3.7
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/44009-llvm
Ключевые слова: llvm, clang
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (34) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, iZEN (ok), 10:37, 09/03/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Можно использовать совместно с Mesa/DRI 11.0.8?
     
     
  • 2.4, Andrey Mitrofanov (?), 10:49, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Можно использовать совместно с Mesa/DRI 11.0.8?

    На софтваре-растерайзер потянуло? Невидиа жмёт?! Пользуйся, чего уж, разрешаю.

    The Gallium llvmpipe driver is a software rasterizer that uses LLVM to do runtime [...]
    [...]
    * LLVM: version 3.4 recommended; 3.3 or later required.

    http://www.mesa3d.org/llvmpipe.html

     
     
  • 3.6, iZEN (ok), 11:09, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    То есть - нельзя.
     
     
  • 4.8, Andrey Mitrofanov (?), 12:30, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    *>>Пользуйся, чего уж, разрешаю.
    *>> * LLVM: version 3.4 recommended; 3.3 or later required.

    > То есть - нельзя.

    Эппле не такой добрый, как я? Или коре тиим жмётся?  Кто обидел нашего рубаху-парня?!

     
  • 3.10, Аноним (-), 14:25, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ну почему же сразу софтваре-растерайзер? Как же gallium3d и AMDGPU-бэкенд?
     
     
  • 4.12, Andrey Mitrofanov (?), 15:27, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Ну почему же сразу софтваре-растерайзер? Как же gallium3d и AMDGPU-бэкенд?

    У него невидия. Исколючительно  и только. Но он почему-то не спросил, можно ли ему с блобом невидии "использовать" llvm. Видимо знал, куда идти -- сразу.

     
     
  • 5.31, Аноним (-), 16:13, 10/03/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Насколько помню у него где-то встроенный в материнку r600.
     
  • 5.34, iZEN (ok), 21:56, 11/03/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > glxgears

    Running synchronized to the vertical refresh.  The framerate should be
    approximately the same as the monitor refresh rate.
    300 frames in 5.0 seconds = 59.883 FPS
    300 frames in 5.0 seconds = 59.964 FPS
    300 frames in 5.0 seconds = 59.964 FPS
    299 frames in 5.0 seconds = 59.760 FPS
    300 frames in 5.0 seconds = 59.966 FPS

    - на AMD 785G (RS880, Radeon HD 4200)

     

  • 1.3, Аноним (-), 10:40, 09/03/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    Надо будет проверить мой проект. А то в 3.7 силэнг крашился.
     
     
  • 2.11, pavlinux (ok), 14:25, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Виноват компилятор, ога. :D
     
     
  • 3.15, Аноним (-), 17:22, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Именно крашиться он всё равно не должен.
     
     
  • 4.35, pavlinux (ok), 03:20, 12/03/2016 [^] [^^] [^^^] [ответить]  
  • +5 +/
    > Именно крашиться он всё равно не должен.

    Срочно в Microsoft резюме отправляй. В конце допиши "Мои проекты все без багов и всегда работают"  

     
  • 3.25, Аноним (-), 22:03, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Ога. Вываливается с бектрейсом и просит отправить сырцы на багтрекер.
    А то что гцц и мсвц все собирают я даже и не говорю.
     
     
  • 4.41, Владимир (??), 09:21, 13/03/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Похоже, местные аналитики опеннета считают, что краш программы при обработке пользовательских данных - вполне себе нормальное поведение.
    Да будь там хоть гигабайтный исходный файл на входе или 14000 вложенных циклов - пусть ошибку выдает, раз не может справиться.
    Еще и заминусовали человека. Бред.
     
  • 3.40, 0xd34df00d (??), 16:26, 12/03/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, виноват проект сложнее хелловорлда.
     

  • 1.9, Аноним (-), 13:56, 09/03/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Никто не знает, появилась ли возможность указывать линкеру скрипт с расположением секций и участков памяти, как в gcc? Без этого собирать под embedded довольно проблематично, приходится отдельно линковать gcc-шным ld, а это уныло. :(
     
  • 1.13, Штунц (?), 16:15, 09/03/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    объясните, зачем этот режим интерпретатора "псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы"
     
     
  • 2.16, Andrey Mitrofanov (?), 17:27, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > объясните, зачем этот режим интерпретатора "псевдокод может быть преобразован при помощи
    > JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы"

    Очевидно же! Чтобы выполняь маш.код вместо выполнения байт-кода.  Это быстрее>/<

     

  • 1.14, Аноним (-), 17:09, 09/03/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Генерирует все такой же ужасный код на Hello world в 70 инструкций, в отличии от GCC
     
     
  • 2.18, Аноним (-), 17:42, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Листинги в студию
     
     
  • 3.26, Аноним (-), 22:35, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    llvm http://goo.gl/7Fza32
    gcc http://goo.gl/wN0mlV
     
     
  • 4.30, 1 (??), 09:09, 10/03/2016 [^] [^^] [^^^] [ответить]  
  • +/
    однако если вместо
      zero *= a;
    написать
      zero += (a + 1);

    то сворачивает нормально.

     
  • 4.32, Bicycle (ok), 20:01, 10/03/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > llvm http://goo.gl/7Fza32
    > gcc http://goo.gl/wN0mlV

    Забавно. Кликнул в выпадающем списке Clang <3.4 - собирает не такой УГшный код. Либо они что-то "переоптимизировали", либо что-то "переломали".

     
     
  • 5.33, Аноним (-), 04:03, 11/03/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Умножать разучились.
     

  • 1.17, Андрей (??), 17:40, 09/03/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Новость хорошая. Но на форониксе недавно тестировали, и оказалось, что самый быстрый код генерировал 3.6. У 3.7 результаты хуже, а у 3.8-snapshot - ещё хуже. Странно.
     
     
  • 2.19, Andrey Mitrofanov (?), 17:55, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Новость хорошая. Но на форониксе недавно тестировали, и оказалось, что самый быстрый
    > код генерировал 3.6. У 3.7 результаты хуже, а у 3.8-snapshot -
    > ещё хуже. Странно.

    Действительно странно. Почему Вы не поминаете, что код из-под gcc был быстрее во всех случаях, кроме 1-2 (из 15 или 20, какжется).

     
     
  • 3.21, Андрей (??), 18:26, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Вообще-то я говорил исключительно о развитии llvm (а не о сравнении с gcc). Ведь это должно быть развитие, а не деградация. Сравнение с gcc - отдельный вопрос.
     
  • 3.23, Андрей (??), 18:52, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +/
    А ещё по тестам он от версии к версии всё медленнее компилирует. А именно скорость компиляции вообще-то является его замечательной отличительной особенностью.
     
     
  • 4.24, Andrey Mitrofanov (?), 19:16, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > А ещё по тестам он от версии к версии всё медленнее компилирует.
    > А именно скорость компиляции вообще-то является его замечательной отличительной особенностью.

    -O0, tcc и pcc в помощь.

     
     
  • 5.29, Андрей (??), 06:06, 10/03/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    как современного оптимизирующего компилятора как Си, так и Си++.
     
  • 2.20, Andrey Mitrofanov (?), 18:07, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Новость хорошая. Но на форониксе недавно тестировали, и оказалось, что самый быстрый
    > код генерировал 3.6. У 3.7 результаты хуже, а у 3.8-snapshot -
    > ещё хуже. Странно.

    Где это было? Вот тут http://www.phoronix.com/scan.php?page=article&item=ubuntu-1604-compilers&num= Ларабель весь обизворачивался, рассказывая, как "не намного" (но много раз...) llvm отстаёт от gcc.  Но там, кажется, нет 3.6.

    Где он сравнивал 3.6 с 3.8? Или "недавно тестировали" заключалось в сложении "в уме" сравнений 3.6 с 3.7 и 3.7 с 3.8?

     
     
  • 3.22, Андрей (??), 18:29, 09/03/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Где он сравнивал 3.6 с 3.8? Или "недавно тестировали" заключалось в сложении
    > "в уме" сравнений 3.6 с 3.7 и 3.7 с 3.8?

    Вообще-то я об этом: http://www.phoronix.com/scan.php?page=article&item=llvm-clang-363738

     

  • 1.27, Michael Shigorin (ok), 22:55, 09/03/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > GCC совместимого

    Отнюдь: http://clang.debian.net

     
  • 1.28, Аноним (-), 01:03, 10/03/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Из параллельно **развивающихся** проектов, основанных на LLVM, можно отметить:
    >LLVM-Lua
    >Самый новый коммит 4 года назад

    Убери, оно протухло

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру