LLVM 12.0 kompilyator dəstinin buraxılışı

Altı aylıq inkişafdan sonra LLVM 12.0 layihəsinin buraxılışı təqdim edildi - proqramları RISC-yə bənzər virtual təlimatların aralıq bit koduna (aşağı səviyyəli virtual maşın) tərtib edən GCC-ə uyğun alətlər dəsti (tərtibçilər, optimallaşdırıcılar və kod generatorları). çoxsəviyyəli optimallaşdırma sistemi). Yaradılmış psevdokod JIT kompilyatorundan istifadə edərək proqramın icrası zamanı birbaşa maşın təlimatlarına çevrilə bilər.

Clang 12.0-da təkmilləşdirmələr:

  • C++20 standartında təklif olunan “ehtimal” və “ehtimal” atributları üçün dəstək defolt olaraq tətbiq edilib və aktivləşdirilib, optimallaşdırıcıya şərti konstruksiyanın işə salınma ehtimalı haqqında məlumat verməyə imkan verir (məsələn, “[[ehtimal ki, ]] əgər (təsadüfi > 0) {“).
  • AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) və Intel Sapphire Rapids (-march=sapphirerapids) prosessorları üçün əlavə dəstək.
  • X86-64 arxitektura səviyyələrini seçmək üçün "-march=x234-86-v[64]" bayraqları üçün əlavə dəstək (v2 - SSE4.2, SSSE3, POPCNT və CMPXCHG16B genişləndirmələrini əhatə edir; v3 - AVX2 və MOVBE; v4 - AVX-512 ) .
  • Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (korteks-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) və Fujitsu A64FX (a64fx) prosessorları üçün əlavə dəstək. Məsələn, Neoverse-V1 CPU-ları üçün optimallaşdırmaları aktivləşdirmək üçün siz “-mcpu=neoverse-v1” təyin edə bilərsiniz.
  • AArch64 arxitekturası üçün "__aarch64_cas8_relax" kimi atom əməliyyatı köməkçi funksiyalarını aktivləşdirmək və ya söndürmək üçün "-moutline-atomics" və "-mno-outline-atomics" yeni tərtibçi bayraqları əlavə edilmişdir. Bu cür funksiyalar icra zamanı LSE (Böyük Sistem Genişləndirmələri) dəstəyinin mövcud olub-olmadığını müəyyən edir və təmin edilmiş atom prosessor təlimatlarından istifadə edir və ya sinxronizasiya üçün LL/SC (Load-link/store-conditional) təlimatlarından istifadə etməyə qayıdır.
  • Köhnə linker və assembler davranışı ilə uyğunluq üçün binutils paketinin hədəf versiyasını seçmək üçün "-fbinutils-version" seçimi əlavə edildi.
  • ELF icra edilə bilən fayllar üçün, "-gz" bayrağı göstərildikdə, zlib kitabxanasından istifadə edərək sazlama məlumatının sıxılması defolt olaraq aktivləşdirilir (gz=zlib). Yaranan obyekt fayllarını əlaqələndirmək üçün lld və ya GNU binutils 2.26+ tələb olunur. Binutillərin köhnə versiyaları ilə uyğunluğu bərpa etmək üçün "-gz=zlib-gnu" təyin edə bilərsiniz.
  • 'Bu' göstərici indi qeyri-null və dereferensable(N) yoxlamaları ilə işlənir. NULL dəyərlərindən istifadə etməli olduğunuz zaman qeyri-null atributunu silmək üçün "-fdelete-null-pointer-checks" seçimindən istifadə edə bilərsiniz.
  • Linux platformasında AArch64 və PowerPC arxitekturalarında GCC-də olduğu kimi zəng cədvəllərini yaratmaq üçün "-fasinxron-açılma-masalar" rejimi aktivləşdirilib.
  • "#pragma clang loop vectorize_width" bölməsində vektorlaşdırma metodunu seçmək üçün "sabit" (defolt) və "miqyaslana bilən" seçimləri təyin etmək imkanı əlavə edilmişdir. Vektor uzunluğundan asılı olmayan "miqyaslı" rejim eksperimentaldır və miqyaslana bilən vektorlaşdırmanı dəstəkləyən aparatda istifadə oluna bilər.
  • Windows platforması üçün təkmilləşdirilmiş dəstək: Arm64 sistemlərində Windows üçün rəsmi ikili birləşmələr, o cümlədən Clang kompilyatoru, LLD əlaqələndiricisi və compiler-rt iş vaxtı kitabxanaları hazırlanmışdır. MinGW hədəf platformaları üçün qurarkən, hətta çarpaz tərtib edərkən .exe şəkilçisi əlavə olunur.
  • OpenCL, OpenMP və CUDA dəstəyi ilə bağlı imkanlar genişləndirilib. OpenCL 3.0 və OpenCL 1.0 üçün makro seçimlərini seçmək üçün "-cl-std=CL3.0" və "-cl-std=CL1.0" seçimləri əlavə edildi. Diaqnostika vasitələri genişləndirilib.
  • Bəzi x86 əsaslı prosessorlarda həyata keçirilən HRESET, UINTR və AVXVNNI təlimatları üçün əlavə dəstək.
  • X86 sistemlərində "-mtune=" seçiminə dəstək aktivləşdirilib, "-march=" dəyərindən asılı olmayaraq seçilmiş mikroarxitektura optimallaşdırmalarına imkan verir.
  • Statik analizator bəzi POSIX funksiyalarının işlənməsini təkmilləşdirdi və müqayisədə bir neçə simvolik dəyər olduqda şərti əməliyyatların nəticəsinin təyin edilməsini əhəmiyyətli dərəcədə yaxşılaşdırdı. Yeni çeklər əlavə edildi: fuchia.HandleChecker (strukturlarda tutacaqları müəyyənləşdirir), webkit.UncountedLambdaCapturesChecker webkit və alpha.webkit.UncountedLocalVarsChecker (WebKit mühərrik kodunda göstəricilərlə işləməyin xüsusiyyətlərini nəzərə alır).
  • Sabitlər kontekstində istifadə edilən ifadələrdə daxili funksiyalardan istifadə __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __revers, __bsfq, __rdwa, __rqbs,_bit_s bswapd, __bswap64, __ bswapq icazə verilir , _castf*, __rol* və __ror*.
  • İdentifikatorlar, sütunlar və sahə tərifləri ətrafındakı boşluqları seçmək üçün cingilti formatı yardım proqramına BitFieldColonSpacing seçimi əlavə edildi.
  • Linux platformasındakı clangd caching server (Clang Server) uzunmüddətli əməliyyat zamanı yaddaş istehlakını əhəmiyyətli dərəcədə azaldıb (əməliyyat sisteminə boş yaddaş səhifələrini qaytarmaq üçün malloc_trim-ə vaxtaşırı zənglər təmin edilir).

LLVM 12.0-da əsas yeniliklər:

  • Python-da yazılmış llvm-build qurma alətinə dəstək dayandırıldı və bunun əvəzinə layihə tamamilə CMake qurma sistemindən istifadəyə keçdi.
  • AArch64 arxitekturası üçün backenddə Windows platforması üçün dəstək təkmilləşdirilmişdir: hədəf Windows sistemləri üçün assembler çıxışının düzgün generasiyası təmin edilmişdir, zənglərin açılması üzrə məlumatların generasiyası optimallaşdırılmışdır (belə məlumatların ölçüsü 60 azaldılmışdır). %), assemblerdən istifadə edərək açılan məlumat yaratmaq imkanı .seh_* direktivləri əlavə edildi.
  • PowerPC arxitekturası üçün arxa planda döngələr və daxili yerləşdirmə üçün yeni optimallaşdırmalar, Power10 prosessorları üçün genişləndirilmiş dəstək, matris manipulyasiyası üçün MMA təlimatları üçün əlavə dəstək və AIX əməliyyat sistemi üçün təkmilləşdirilmiş dəstək var.
  • X86 backend AMD Zen 3, Intel Alder Lake və Intel Sapphire Rapids prosessorları, həmçinin HRESET, UINTR və AVXVNNI prosessor təlimatları üçün dəstək əlavə edir. Yaddaş sərhədlərinin artıq dəstəklənmədiyinə əmin olmaq üçün göstəriciləri yoxlamaq üçün MPX (Yaddaş Mühafizəsi Genişləndirilməsi) dəstəyi (bu texnologiya geniş yayılmayıb və artıq GCC və cingiltidən çıxarılıb). Operand ofsetlərinin və atlamaların ölçüsünü idarə etmək üçün {disp32} və {disp8} prefiksləri və .d32 və .d8 şəkilçiləri üçün assemblerə dəstək əlavə edildi. Mikroarxitektura optimallaşdırmalarının daxil edilməsinə nəzarət etmək üçün yeni "tune-cpu" atributu əlavə edildi.
  • Bir az sola sürüşdükdən sonra işarəsiz tam ədədlərin daşqınlarını aşkar etmək üçün tam problem detektoruna (tam sayı təmizləyicisi, “-fsanitize=integer”) yeni “-fsanitize=unsigned-shift-base” rejimi əlavə edilmişdir.
  • Müxtəlif detektorlarda (asan, cfi, lsan, msan, tsan, ubsan sanitizer) standart Musl kitabxanası ilə Linux paylamaları üçün dəstək əlavə edilmişdir.
  • LLD əlaqələndiricisinin imkanları genişləndirildi. ELF formatı üçün təkmilləşdirilmiş dəstək, o cümlədən “--asılılıq-fayl”, “-xəta ilə işləmə-skript”, “-lto-pseudo-probe-for-profiling”, “-no-lto-whole-program” əlavə edilmiş seçimlər -görünürlük"" Təkmilləşdirilmiş MinGW dəstəyi. Mach-O formatı (macOS) üçün arm64, arm və i386 arxitekturaları, keçid vaxtının optimallaşdırılması (LTO) və istisnaların idarə edilməsi üçün yığının açılması üçün dəstək tətbiq edilmişdir.
  • Libc++ C++20 standartının yeni funksiyalarını həyata keçirir və C++2b spesifikasiyasının xüsusiyyətlərini inkişaf etdirməyə başlayıb. Lokalizasiya dəstəyini deaktiv etməklə ("-DLIBCXX_ENABLE_LOCALIZATION=OFF") və psevdo-təsadüfi nömrələr yaratmaq üçün cihazlarla ("-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF") tikinti dəstəyi əlavə edilib.

Mənbə: opennet.ru

Добавить комментарий