LLVM 12.0 компиляторлар жинағының шығарылымы

Алты айлық әзірлеуден кейін LLVM 12.0 жобасының шығарылымы ұсынылды - GCC-үйлесімді құралдар жинағы (компиляторлар, оңтайландырушылар және код генераторлары), ол бағдарламаларды RISC-тәрізді виртуалды нұсқаулардың аралық бит-кодына (төмен деңгейлі виртуалды машина) құрастырады. көп деңгейлі оңтайландыру жүйесі). Жасалған псевдокодты JIT компиляторы бағдарламаның орындалу сәтінде машиналық нұсқауларға түрлендіруі мүмкін.

Clang 12.0 жақсартулары:

  • C++20 стандартында ұсынылған «ықтимал» және «ықтимал» атрибуттарға қолдау әдепкі бойынша енгізілді және қосылды, бұл оңтайландырушыға шартты құрылымның іске қосылу ықтималдығы туралы хабардар етуге мүмкіндік береді (мысалы, «[[ықтимал ]] егер (кездейсоқ > 0) {“).
  • AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) және Intel Sapphire Rapids (-march=sapphirerapids) процессорларына қолдау қосылды.
  • x86-64 архитектуралық деңгейлерін таңдау үшін "-march=x234-86-v[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) процессорларына қолдау қосылды. Мысалы, Neoverse-V1 процессорлары үшін оңтайландыруларды қосу үшін “-mcpu=neoverse-v1” параметрін көрсетуге болады.
  • AArch64 архитектурасы үшін "__aarch64_cas8_relax" сияқты атомдық операцияның көмекші функцияларын қосу немесе өшіру үшін "-moutline-atomics" және "-mno-outline-atomics" жаңа компилятор жалаулары қосылды. Мұндай функциялар LSE (Үлкен Жүйе Кеңейтімдері) қолдауының қолжетімділігін іске қосу кезінде анықтайды және берілген атомдық процессор нұсқауларын пайдаланады немесе синхрондау үшін LL/SC (Load-link/store-шартты) нұсқауларын пайдалануға қайтады.
  • Ескі сілтеме және ассемблер әрекетімен үйлесімділік үшін binutils жиынтығының мақсатты нұсқасын таңдау үшін "-fbinutils-version" опциясы қосылды.
  • ELF орындалатын файлдары үшін, "-gz" жалаушасы көрсетілгенде, zlib кітапханасы арқылы жөндеу ақпаратын қысу әдепкі бойынша қосылады (gz=zlib). Алынған нысан файлдарын байланыстыру үшін lld немесе GNU binutils 2.26+ қажет. Binutils ескі нұсқаларымен үйлесімділікті қалпына келтіру үшін "-gz=zlib-gnu" параметрін көрсетуге болады.
  • «Бұл» көрсеткіші енді нөл емес және ескерілмейтін (N) тексерулермен өңделеді. Null емес төлсипатты жою үшін NULL мәндерін пайдалану қажет болса, "-fdelete-null-pointer-checks" опциясын пайдалануға болады.
  • Linux платформасында AArch64 және PowerPC архитектуралары үшін GCC-дегі сияқты шақыруларды босату кестелерін жасау үшін "-fasynchronous-unwind-tables" режимі қосылған.
  • «#pragma clang loop vectorize_width» векторлау әдісін таңдау үшін «тіркелген» (әдепкі) және «масштабталатын» опцияларды көрсету мүмкіндігін қосты. Вектор ұзындығына тәуелсіз «масштабталатын» режим эксперименттік болып табылады және масштабталатын векторизацияны қолдайтын аппараттық құралда пайдалануға болады.
  • Windows платформасы үшін жақсартылған қолдау: Arm64 жүйелеріндегі Windows үшін ресми екілік жинақтар дайындалды, соның ішінде Clang компиляторы, LLD сілтемесі және compiler-rt жұмыс уақыты кітапханалары. MinGW мақсатты платформалары үшін құрастыру кезінде, тіпті кросс компиляция кезінде де .exe жұрнағы қосылады.
  • OpenCL, OpenMP және CUDA қолдауымен байланысты мүмкіндіктер кеңейтілді. OpenCL 3.0 және OpenCL 1.0 үшін макрос опцияларын таңдау үшін "-cl-std=CL3.0" және "-cl-std=CL1.0" опциялары қосылды. Диагностикалық құралдар кеңейтілді.
  • Кейбір x86 негізіндегі процессорларда енгізілген HRESET, UINTR және AVXVNNI нұсқауларына қолдау қосылды.
  • x86 жүйелерінде "-mtune=" опциясын қолдау "-march=" мәніне қарамастан таңдалған микроархитектуралық оңтайландыруларды қосады.
  • Статикалық анализатор кейбір POSIX функцияларын өңдеуді жақсартты және салыстыруда бірнеше символдық мәндер болған кезде шартты операциялардың нәтижесін анықтауды айтарлықтай жақсартты. Жаңа тексерулер қосылды: fuchia.HandleChecker (құрылымдардағы дескрипторларды анықтайды), webkit.UncountedLambdaCapturesChecker webkit және alpha.webkit.UncountedLocalVarsChecker (WebKit механизмінің кодындағы көрсеткіштермен жұмыс істеу ерекшеліктерін ескереді).
  • Тұрақтылар контекстінде қолданылатын өрнектерде __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __reverse, __rd_bs, __rd_bs, __rd_bs, __bit_bs, ендірілген функцияларды пайдалану. bswapd, __bswap64, __ bswapq рұқсат етілген , _castf*, __rol* және __ror*.
  • Идентификаторлардың, бағандардың және өріс анықтамаларының айналасындағы бос орынды таңдау үшін clang пішімінің қызметтік бағдарламасына BitFieldColonSpacing опциясы қосылды.
  • Linux платформасындағы clangd кэштеу сервері (Clang Server) ұзақ мерзімді жұмыс кезінде жадты тұтынуды айтарлықтай азайтты (операциялық жүйеге бос жад беттерін қайтару үшін malloc_trim-ге мерзімді қоңыраулар беріледі).

LLVM 12.0 негізгі инновациялары:

  • Python тілінде жазылған llvm-build құрастыру құралына қолдау көрсету тоқтатылды және оның орнына жоба толығымен CMake құрастыру жүйесін пайдалануға көшті.
  • AArch64 архитектурасына арналған бэкендтерде Windows платформасын қолдау жетілдірілді: мақсатты Windows жүйелері үшін ассемблер шығысының дұрыс генерациясы қамтамасыз етілді, қоңырауларды босату бойынша деректерді генерациялау оңтайландырылды (мұндай деректердің өлшемі 60-қа қысқарды. %), ассемблер көмегімен ашу деректерін жасау мүмкіндігі .seh_* директивалары қосылды.
  • PowerPC архитектурасына арналған серверде циклдар мен кірістірілген орналастыру үшін жаңа оңтайландырулар, Power10 процессорларына кеңейтілген қолдау, матрицаны манипуляциялау үшін MMA нұсқауларына қосымша қолдау және AIX операциялық жүйесін жақсартуға арналған қолдау бар.
  • x86 сервері AMD Zen 3, Intel Alder Lake және Intel Sapphire Rapids процессорларына, сондай-ақ HRESET, UINTR және AVXVNNI процессор нұсқауларына қолдауды қосады. Жад шекараларына бұдан былай қолдау көрсетілмейтініне көз жеткізу үшін меңзерлерді тексеруге арналған MPX (жадты қорғау кеңейтімдері) қолдауы (бұл технология кең таралмаған және GCC және clang-дан жойылған). Ассемблерге {disp32} және {disp8} префикстері мен .d32 және .d8 жұрнақтары үшін операндтың ығысулары мен секірістерінің өлшемін басқару үшін қосылды. Микроархитектуралық оңтайландыруларды қосуды басқару үшін жаңа "tune-cpu" төлсипаты қосылды.
  • Біраз солға жылжудан кейін таңбасыз бүтін сандардың толып кетуін анықтау үшін бүтін сан мәселесі детекторына (integer sanitizer, “-fsanitize=integer”) жаңа “-fsanitize=unsigned-shift-base” режимі қосылды.
  • Әртүрлі детекторларда (asan, cfi, lsan, msan, tsan, ubsan sanitizer) стандартты Musl кітапханасы бар Linux дистрибутивтерін қолдау қосылды.
  • LLD байланыстырғышының мүмкіндіктері кеңейтілді. «--тәуелділік-файл», «-қателік өңдеу-скрипті», «-lto-псевдок-профильдеу-профильдеу», «-no-lto-whole-бағдарламасы» қосылған опцияларды қоса алғанда, ELF пішімі үшін жақсартылған қолдау. -көріну"" Жақсартылған MinGW қолдауы. Mach-O пішімі (macOS) үшін arm64, arm және i386 архитектурасына қолдау, сілтеме уақытын оңтайландыру (LTO) және ерекше жағдайларды өңдеу үшін стекті босату жүзеге асырылды.
  • Libc++ C++20 стандартының жаңа мүмкіндіктерін жүзеге асырады және C++2b спецификациясының мүмкіндіктерін әзірлеуді бастады. Оқшауланған локализация қолдауымен («-DLIBCXX_ENABLE_LOCALIZATION=OFF») және жалған кездейсоқ сандарды генерациялауға арналған құрылғылар («-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF») бар құрылысқа қолдау қосылды.

Ақпарат көзі: opennet.ru

пікір қалдыру