Релиз набора компиляторов LLVM 11.0

Сгeнeрирoвaнный псeвдoкoд мoжeт быть прeoбрaзoвaн рядом пoмoщи JIT-кoмпилятoрa в мaшинныe инструкции нeпoсрeдствeннo в мoмeнт выпoлнeния прoгрaммы. Ключeвым измeнeниeм в нoвoм выпускe стaлo включeниe в сoстaв Flang, фрoнтэндa угоду кому) языкa Fortran. Flang пoддeрживaeт Fortran 2018, OpenMP 4.5 и OpenACC 3.0, нo рaзрaбoткa прoeктa пoкa нe зaвeршeнa и фрoнтэнд oгрaничивaeтся рaзбoрoм кoдa и eгo прoвeркoй нa кoррeктнoсть. Гeнeрaция прoмeжутoчнoгo кoдa LLVM пoкa нe пoддeрживaeтся и исполнение) формирования исполняемых файлов генерируется каноничный код, который передаётся во неглубокий компилятор Fortran. Улучшения в Clang 11.0: Добавлена средство восстановления абстрактного синтаксического дерева (AST) к некорректного кода на C++, которое может употребляться для упрощения диагностики ошибок и предоставляет дополнительную информацию ради внешних утилит, таких как clang-tidy и clangd. Допустимость по умолчанию включена для стих на C++ и управляется через опции "-Xclang -f[no-]recovery-ast". Добавлены новые режимы диагностики: "-Wpointer-to-int-cast" - классификация предупреждений о приведении указателей к целому типу int, невыгодный вмещающему все возможные значения. "-Wuninitialized-const-reference" - предуведомление о передаче неинициализированных переменных в параметрах функции, принимающих ссылочные доводы с признаком "const". Для платформы ARM предоставлены встроенные в транслятор Си-функции (Intrinsics), заменяемые для эффективные векторные инструкции Arm v8.1-M MVE и CDE. Доступные функции определены в заголовочных файлах arm_mve.h и arm_cde.h. Добавлен ассортимент расширенных целочисленных типов _ExtInt(N), позволяющих слагать типы не кратные степени двойки, которые могут производительно обрабатываться на FPGA/HLS. Например, _ExtInt(7) определяет слитный тип, состоящий из 7 бит. Добавлены макросы, определяющие поддержку встроенных Си-функций для базе инструкций ARM SVE (Scalable Vector Extension): __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16, __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64, __ARM_FEATURE_SVE_MATMUL_INT8, __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES, __ARM_FEATURE_SVE2_BITPERM, __ARM_FEATURE_SVE2_SHA3, __ARM_FEATURE_SVE2_SM4. Скажем так, макрос __ARM_FEATURE_SVE определяется при генерации стих AArch64 с установкой опции командной строки "-march=armv8-a+sve". Штандарт "-O" теперь отождествляется с режимом оптимизации "-O1" взамен "-O2". Добавлены новые флаги компилятора: "-fstack-clash-protection" - охватывает защиту от пересечения стека и кучи. "-ffp-exception-behavior={ignore,maytrap,strict}" - позволяет удосужиться режим обработчика исключений для чисел с плавающей запятой. "-ffp-model={precise,strict,fast}" - упрощает путь к серии специализированных опций для чисел с плавающей запятой. "-fpch-codegen" и "-fpch-debuginfo" чтобы генерации предкомпилированного заголовка (PCH) с отдельными объектными файлами в (видах кода и debuginfo. "-fsanitize-coverage-allowlist" и "-fsanitize-coverage-blocklist" в целях проверки белого и чёрного списков coverage-тестирования. "-menable-experimental-extension" про включения экспериментальных расширений RISC-V. После умолчанию для Си применён регламент "-fno-common", позволяющий повысить эффективность доступа к глобальным переменным в некоторых платформах. Кэш модулей ровно по умолчанию перенесён из /tmp в каталог ~/.cache. Чтобы переопределения можно использовать флаг "-fmodules-cache-path=". Применяемый вдоль умолчанию стандарт языка Си обновлён с gnu11 предварительно gnu17. Добавлена предварительная поддержка расширения GNU C "asm inline" чтобы добавления ассемблерных вставок. Расширены потенциал, связанные с поддержкой OpenCL и CUDA. Добавлена подспорье диагностики блоков OpenCL 2.0 и реализованы новые потенциал OpenMP 5.0. В утилиту clang-format добавлена опция IndentExternBlock с целью выравнивания внутри блоков extern "C" и extern "C++". В статическом анализаторе улучшена обтачивание унаследованных конструкторов в C++. Добавлены новые проверки alpha.core.C11Lock и alpha.fuchsia.Lock с целью проверки блокировок, alpha.security.cert.pos.34c интересах выявления небезопасного использования putenv, webkit.NoUncountedMemberChecker и webkit.RefCntblBaseVirtualDtor для того выявления проблем с несчётными типами, alpha.cplusplus.SmartPtr ради проверки разыменования нулевого умного указателя. В linter clang-tidy добавлена большая спутник новых проверок. В кеширующем сервере clangd (Clang Server) повышена эффективность и добавлены новые возможности диагностики. Основные новшества LLVM 11.0: Доктрина сборки переведена на использование Python 3. Разве Python 3 недоступен то реализована достижимость отката на использование Python 2. С выпуска исключён фронтэнд с компилятором во (избежание языка Go (llgo), который возможно склифосовский реструктиризирован в будущем. В промежуточное представление (IR) добавлен особенность vector-function-abi-variant для описания маппинга промежду скалярными и векторными функциями для векторизации вызовов. Изо llvm::VectorType выделено два отдельных векторных в виде llvm::FixedVectorType и llvm::ScalableVectorType. Признано неопределённым поведением разветвление на основе udef-значений и педерача undef-значений в функции стандартной библиотеки. В memset/memcpy/memmove разрешена перемещение undef-указателей, но если параметр с размером равен нулю. В LLJIT добавлена сохранение выполнения статических инициализаций через методы LLJIT::initialize и LLJIT::deinitialize. Реализована (объективная) добавления статических библиотек к JITDylib около помощи класса StaticLibraryDefinitionGenerator. Добавлен Си API ради ORCv2 (API для сборки JIT-компиляторов). В бэкенд на архитектуры AArch64 добавлена поддержка процессоров Cortex-A34, Cortex-A77, Cortex-A78 и Cortex-X1. Реализованы расширения ARMv8.2-BF16 (BFloat16) и ARMv8.6-A, включительно RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU ( Activity Monitors virtualization) и ARMv8.0-DGH (Data gathering hint). Обеспечена (объективная) генерации кода для встроенных функций-обвязок к векторным инструкциям SVE. Реализованы расширения Armv8.6-A Matrix Multiply и RMv8.2-AA32BF16 BFloat16. В бэкенд ради архитектуры PowerPC добавлена поддержка генерации стих для процессоров POWER10. В бэкенде интересах архитектуры RISC-V разрешён приём патчей с поддержкой экспериментальных расширенных наборов инструкций, кроме официально не одобренных. Бэкенд интересах архитектуры AVR переведён из категории экспериментальных в стабильные, включённые в базовую поставку. В бэкенде в целях архитектуры x86 реализована поддержка инструкций Intel AMX и TSXLDTRK. Добавлена экранирование от атак LVI (Load Value Injection), а в свою очередь реализован общий механизм Speculative Execution Side Effect Suppression с целью блокирования атак, вызванных спекулятивным выполнением операций в CPU. В бэкенде во (избежание архитектуры SystemZ добавлена поддержка MemorySanitizer и LeakSanitizer. В Libc++ добавлена помочь заголовочного файла с математическими константами ‹numbers›. Расширены потенциал компоновщика LLD. Улучшена поддержка формата ELF, в томище числе добавлены опции "--lto-emit-asm", "--lto-whole-program-visibility", "--print-archive-stats", "--shuffle-sections", "--thinlto-single-module", "--unique", "--rosegment", "--threads=N". Добавлена опция "--time-trace" к сохранения трассировки в файл, который впоследствии времени можно проанализировать через интерфейс chrome://tracing в Chrome. Галотерм: http://www.opennet.ru/opennews/art.shtml?num=53874