Рэліз набору кампілятараў LLVM 12.0

Пасля шасці месяцаў распрацоўкі прадстаўлены рэліз праекта LLVM 12.0 – GCC-сумяшчальнага інструментара (кампілятары, аптымізатары і генератары кода), які кампілюе праграмы ў прамежкавы біткод RISC-падобных віртуальных інструкцый (нізкаўзроўневая віртуальная машына з шматузроўневай сістэмай оптимитый. Згенераваны псеўдакод можа быць пераўтвораны пры дапамозе JIT-кампілятара ў машынныя інструкцыі непасрэдна ў момант выканання праграмы.

Паляпшэнні ў Clang 12.0:

  • Рэалізаваная і ўключаная па змаўчанні падтрымка прапанаваных у стандарце C++20 атрыбутаў "likely" і "unlikely", якія дазваляюць інфармаваць аптымізатар аб верагоднасці спрацоўвання ўмоўнай канструкцыі (напрыклад, "[[likely]] if (random > 0) {").
  • Дададзена падтрымка працэсараў AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) і Intel Sapphire Rapids (-march=sapphirerapids).
  • Дададзена падтрымка сцягоў «-march=x86-64-v[234]» для выбару ўзроўняў архітэктуры x86-64 (v2 — ахапляе пашырэнні SSE4.2, SSSE3, POPCNT і CMPXCHG16B; v3 — AVX2 і MOVBE; v4 — AVX-512) .
  • Дададзена падтрымка працэсараў Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) і Fujitsu A64FX (a64fx). Напрыклад, для ўключэння аптымізацый для CPU Neoverse-V1 можна паказаць "-mcpu=neoverse-v1".
  • Для архітэктуры AArch64 дададзены новыя сцягі кампілятара "-moutline-atomics" і "-mno-outline-atomics", прызначаныя для ўключэння і адключэнні дапаможных функцый з рэалізацыяй атамарных аперацый, такіх як "__aarch64_cas8_relax". Падобныя функцыі падчас выканання вызначаюць наяўнасць падтрымкі пашырэнняў LSE (Large System Extensions) і выкарыстоўваюць якія прадстаўляюцца атамарныя працэсарныя інструкцыі або адкочваюцца на выкарыстанне інструкцый LL/SC (Load-link/store-conditional) для сінхранізацыі.
  • Дададзена опцыя "-fbinutils-version" для выбару мэтавай версіі набору binutils для забеспячэння сумяшчальнасці са старымі паводзінамі кампаноўніка і асэмблера.
  • Для выкананых файлаў ELF пры ўказанні сцяга "-gz" па змаўчанні ўключаны сціск адладкавай інфармацыі з выкарыстаннем бібліятэкі zlib (gz=zlib). Для кампаноўкі выніковых аб'ектных файлаў патрабуецца lld ці GNU binutils 2.26+. Для аднаўлення сумяшчальнасці са старымі версіямі binutils можна пазначыць "-gz=zlib-gnu".
  • Паказальнік 'this' зараз апрацоўваецца з праверкамі nonnull і dereferenceable(N). Для выдалення атрыбута nonnull, пры неабходнасці выкарыстання значэнняў NULL, можна выкарыстоўваць опцыю "-fdelete-null-pointer-checks".
  • На платформе Linux для архітэктур AArch64 і PowerPC уключаны рэжым "-fasynchronous-unwind-tables" для генерацыі "раскручаных" (unwind) табліц выклікаў, як у GCC.
  • У "#pragma clang loop vectorize_width" дададзена магчымасць указання опцый "fixed" (па змаўчанні) і "scalable" для выбару метаду вектарызацыі. Рэжым «scalable», незалежны ад даўжыні вектара, з'яўляецца эксперыментальным і можа выкарыстоўвацца на абсталяванні з падтрымкай якая маштабуецца вектарызацыі.
  • Палепшана падтрымка платформы Windows: Падрыхтаваны афіцыйныя бінарныя зборкі для Windows на сістэмах Arm64, улучальныя кампілятар Clang, кампаноўнік LLD і runtime-бібліятэкі compiler-rt. Пры зборцы для мэтавых платформаў MinGW рэалізавана даданне суфікса .exe, нават пры выкананні крос-кампіляцыі.
  • Пашыраны магчымасці, звязаныя з падтрымкай OpenCL, OpenMP і CUDA. Дададзеныя опцыі "-cl-std=CL3.0" і "-cl-std=CL1.0" для выбару варыянтаў макрасаў для OpenCL 3.0 і OpenCL 1.0. Пашыраны сродкі дыягностыкі.
  • Дададзена падтрымка інструкцый HRESET, UINTR і AVXVNNI, рэалізаваных у некаторых працэсарах на базе архітэктуры x86.
  • На сістэмах x86 уключаная падтрымка опцыі «-mtune= », Якая актывуе абраныя мікраархітэктурныя аптымізацыі, незалежна ад значэння «-march= ».
  • У статычным аналізатары палепшана апрацоўка некаторых POSIX-функцый і значна палепшана вызначэнне выніку ўмоўных аперацый пры наяўнасці ў параўнанні некалькіх знакавых значэнняў. Дададзены новыя праверкі: fuchia.HandleChecker (вызначае дэскрыптары ў структурах), webkit.UncountedLambdaCapturesChecker webkit і alpha.webkit.UncountedLocalVarsChecker (улічваюць асаблівасці працы з паказальнікамі ў кодзе рухавічка WebKit).
  • У выразах, выкарыстоўваных у кантэксце канстант, дазволенае выкарыстанне ўбудаваных функцый __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_s__ __bswapd, __bswap64, __bswapq, _castf*, __rol* і __ror*.
  • Ва ўтыліту clang-format дададзена опцыя BitFieldColonSpacing для выбару расстаноўкі прабелаў вакол ідэнтыфікатараў, слупкоў і азначэнняў палёў.
  • У які кешыруе серверы clangd (Clang Server) на платформе Linux значна скарочана спажыванне памяці пры працяглай працы (забяспечаны перыядычны выклік malloc_trim для аддачы вольных старонак памяці аперацыйнай сістэме).

Асноўныя навіны LLVM 12.0:

  • Спынена падтрымка напісанага на мове Python зборачнага інструментара llvm-build, замест якога праект поўнасцю перайшоў на выкарыстанне зборачнай сістэмы CMake.
  • У бэкендзе для архітэктуры AArch64 палепшана падтрымка платформы Windows: забяспечана карэктная генерацыя асэмблернай высновы для мэтавых сістэм Windows, аптымізавана генерацыя дадзеных аб "раскрутцы" (unwind) выклікаў (памер падобных дадзеных скараціўся на 60%), дададзена магчымасць стварэння unwind-дадзеных пры дапамозе дырэктыў .seh_*.
  • У бэкендзе для архітэктуры PowerPC рэалізаваны новыя аптымізацыі цыклаў і inline-разгортвання, пашырэнні падтрымка працэсараў Power10, дададзена падтрымка інструкцый MMA для маніпуляцый з матрыцамі, палепшана падтрымка аперацыйнай сістэмы AIX.
  • У бэкендзе для архітэктуры x86 дададзеная падтрымка працэсараў AMD Zen 3, Intel Alder Lake і Intel Sapphire Rapids, а таксама працэсарных інструкцый HRESET, UINTR і AVXVNNI. Спыненая падтрымка пашырэнняў MPX (Memory Protection Extensions) для праверкі паказальнікаў на выкананне меж абласцей памяці (названая тэхналогія не атрымала распаўсюджвання і ўжо выдаленая з GCC і clang). У асэмблер дададзеная падтрымка прэфіксаў {disp32} і {disp8} і суфіксаў .d32 і .d8 для кіравання памерам зрушэння аперанд і пераходаў. Дададзены новы атрыбут "tune-cpu" для кіравання ўключэннем мікраархітэктурных аптымізацый.
  • У дэтэктар праблем пры працы з цэлымі лікамі (integer sanitizer, "-fsanitize=integer") дададзены новы рэжым "-fsanitize=unsigned-shift-base" для выяўлення перапаўненняў беззнаковых цэлых лікаў пасля бітавага зруху налева.
  • У розных дэтэктарах (asan, cfi, lsan, msan, tsan, ubsan sanitizer) дададзеная падтрымка Linux-дыстрыбутываў са стандартнай бібліятэкай Musl.
  • Пашыраны магчымасці кампаноўніка LLD. Палепшана падтрымка фармату ELF, у тым ліку дададзеныя опцыі «dependency-file», «error-handling-script», «lto-pseudo-probe-for-profiling», «no-lto-whole-program-visibility. ». Палепшана падтрымка MinGW. Для фармату Mach-O (macOS) рэалізавана падтрымка архітэктур arm64, arm і i386, аптымізацый на этапе звязвання (LTO) і раскруткі стэка пры апрацоўцы выключэнняў.
  • У Libc++ рэалізаваны новыя магчымасці стандарту C++20 і пачалася распрацоўка магчымасцяў спецыфікацыі C++2b. Дададзена падтрымка зборкі з адключэннем падтрымкі лакалізацыі («-DLIBCXX_ENABLE_LOCALIZATION=OFF») і прылад для генерацыі псеўда-выпадковых лікаў («-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF»).

Крыніца: opennet.ru

Дадаць каментар