LLVM 12.0 компилятор топтомунун чыгарылышы

Алты айлык иштеп чыгуудан кийин LLVM 12.0 долбоорунун релизинин бет ачары болду - программаларды RISC сымал виртуалдык нускамалардын ортоңку биткоддоруна компиляциялоочу GCC шайкеш инструменттер топтому (компиляторлор, оптимизаторлор жана код генераторлор). көп деңгээлдүү оптималдаштыруу системасы). Түзүлгөн псевдокод 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 CPU үчүн оптималдаштырууну иштетүү үчүн, "-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 архитектуралары үчүн "-faynchronous-unwind-tables" режими иштетилген, GCCдеги сыяктуу, чакыруу таблицаларын түзүү.
  • "#pragma clang циклинде vectorize_width" векторизация ыкмасын тандоо үчүн "фиксацияланган" (демейки) жана "масштабталуучу" опцияларды көрсөтүү мүмкүнчүлүгү кошулган. Вектордун узундугунан көз карандысыз "масштабтуу" режим эксперименталдык болуп саналат жана масштабдалуучу векторизацияны колдогон жабдыкта колдонулушу мүмкүн.
  • Windows платформасы үчүн жакшыртылган колдоо: Arm64 системаларында Windows үчүн расмий бинардык ассамблеялар даярдалды, анын ичинде Clang компилятору, LLD шилтемеси жана компилятор-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, __reverses, __bsfq, __reverses, __rds_bs, __rdb_s 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 backend AMD Zen 3, Intel Alder Lake жана Intel Sapphire Rapids процессорлорун, ошондой эле HRESET, UINTR жана AVXVNNI процессорунун нускамаларын колдойт. Эстутум чектерин мындан ары колдоого алуу үчүн көрсөткүчтөрдү текшерүү үчүн MPX (Эстутумду коргоо кеңейтүүлөрү) колдоо (бул технология кеңири жайылган эмес жана GCC жана clangден мурунтан эле алынып салынган). Ассемблерге {disp32} жана {disp8} префикстери жана .d32 жана .d8 суффикстери үчүн операнддардын жылыштарынын жана секирүүлөрдүн өлчөмүн көзөмөлдөө үчүн колдоо кошулду. Микроархитектуралык оптималдаштыруунун камтылышын көзөмөлдөө үчүн жаңы "tune-cpu" атрибуту кошулду.
  • Бир аз солго жылгандан кийин кол коюлбаган бүтүн сандардын ашып кетишин аныктоо үчүн бүтүн сан көйгөй детекторуна жаңы “-fsanitize=unsigned-shift-base” режими кошулду.
  • Ар кандай детекторлордо (asan, cfi, lsan, msan, tsan, ubsan sanitizer) стандарттуу Musl китепканасы менен Linux дистрибуцияларын колдоо кошулган.
  • LLD шилтемесинин мүмкүнчүлүктөрү кеңейтилди. ELF форматы үчүн жакшыртылган колдоо, анын ичинде "--көз карандылык-файл", "-ката-башкаруу-скрипт", "-лто-псевдо-пробе-профилдөө", "-no-lto-whole-program" сыяктуу кошумча опциялар -көрүнүү"" Жакшыртылган MinGW колдоосу. Mach-O форматы (macOS) үчүн arm64, arm жана i386 архитектураларын колдоо, шилтеме убактысын оптималдаштыруу (LTO) жана өзгөчө кырдаалдарды иштетүү үчүн стекти ачуу ишке ашырылган.
  • Libc++ C++20 стандартынын жаңы мүмкүнчүлүктөрүн ишке ашырат жана C++2b спецификациясынын өзгөчөлүктөрүн иштеп чыгууну баштады. Локалдаштыруу колдоосун өчүрүү менен курууга колдоо кошулду (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) жана псевдококустук сандарды түзүү үчүн түзмөктөр (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Source: opennet.ru

Комментарий кошуу