GCC 11 kompilyator dəstinin buraxılışı

Bir illik inkişafdan sonra pulsuz GCC 11.1 kompilyator dəstinin buraxılışı, yeni GCC 11.x filialında ilk əhəmiyyətli buraxılış buraxıldı. Yeni buraxılış nömrələmə sxeminə əsasən, 11.0 versiyası inkişaf zamanı istifadə edilmişdir və GCC 11.1-in buraxılmasından bir müddət əvvəl, GCC 12.0 filialı artıq çəngəllənmişdi, bundan GCC 12.1-in növbəti əhəmiyyətli buraxılışı formalaşacaqdır.

GCC 11.1 standart olaraq DWARF 5 debug fayl formatından istifadəyə keçidi, C++17 standartının defolt daxil edilməsi (“-std=gnu++17”), C++20 dəstəyində əhəmiyyətli təkmilləşdirmələri ilə diqqət çəkir. standart, C++23 üçün eksperimental dəstək, gələcək C dili standartı (C2x) ilə bağlı təkmilləşdirmələr, yeni performans optimallaşdırmaları.

Əsas dəyişikliklər:

  • C++ dili üçün standart rejim əvvəllər təklif edilmiş C++17 əvəzinə C++17 standartından (-std=gnu++14) istifadə etməyə dəyişdirilib. Parametr kimi digər şablonlardan istifadə edən şablonları işləyərkən yeni C++17 davranışını seçici şəkildə söndürmək mümkündür (-fno-new-ttp-matching).
  • Sərbəst yaddaş sahələrinə daxil olmaq, ayrılmış buferin hüdudlarından kənara çıxmaq və yaddaşla işləyərkən bəzi digər növ səhvləri müəyyən etməyə imkan verən AddressSanitizer alətinin aparat sürətləndirilməsi üçün əlavə dəstək. Avadanlıq sürətləndirilməsi hazırda yalnız AArch64 arxitekturası üçün mövcuddur və Linux nüvəsini tərtib edərkən istifadəyə yönəlib. İstifadəçi məkanı komponentlərini qurarkən AddressSanitizer aparat sürətləndirilməsini aktivləşdirmək üçün "-fsanitize=hwaddress" və nüvə bayrağı "-fsanitize=kernel-hwaddress" əlavə edildi.
  • Sazlama məlumatını yaradan zaman DWARF 5 formatı standart olaraq istifadə olunur ki, bu da əvvəlki versiyalarla müqayisədə 25% daha yığcam sazlama məlumatı yaratmağa imkan verir. DWARF 5 üçün tam dəstək ən azı binutils 2.35.2 versiyasını tələb edir. DWARF 5 formatı GDB 8.0, valgrind 3.17.0, elfutils 0.172 və dwz 0.14-dən bəri sazlama alətlərində dəstəklənir. DWARF-ın digər versiyalarından istifadə edərək sazlama faylları yaratmaq üçün "-gdwarf-2", "-gdwarf-3" və "-gdwarf-4" seçimlərindən istifadə edə bilərsiniz.
  • GCC qurmaq üçün istifadə edilə bilən kompilyatorlara tələblər artırıldı. Kompilyator indi C++11 standartını dəstəkləməlidir (əvvəllər C++98 tələb olunurdu), yəni. Əgər GCC 10 GCC 3.4-u qurmaq üçün kifayət idisə, indi GCC 11-i qurmaq üçün ən azı GCC 4.8 tələb olunur.
  • Zibilləri, müvəqqəti faylları və LTO optimallaşdırılması üçün lazım olan əlavə məlumatı saxlamaq üçün faylların adı və yeri dəyişdirildi. Yol "-dumpbase", "-dumpdir" və "-save-temps=*" seçimləri vasitəsilə açıq şəkildə dəyişdirilməsə, bu cür fayllar indi həmişə cari kataloqda saxlanılır.
  • HSAIL (Heterojen Sistem Arxitekturasının Ara Dili) dili ilə istifadə üçün ikili format BRIG dəstəyi köhnəlib və tezliklə silinəcək.
  • ThreadSanitizer rejiminin imkanları (-fsanitize=thread) genişləndirilib, çox yivli tətbiqin müxtəlif başlıqlarından eyni məlumatları paylaşarkən yarış şərtlərini aşkar etmək üçün nəzərdə tutulub. Yeni buraxılış alternativ iş vaxtları və mühitlər üçün dəstək, eləcə də Linux nüvəsində yarış şərtlərini dinamik şəkildə aşkar etmək üçün nəzərdə tutulmuş KCSAN (Kernel Concurrency Sanitizer) sazlama alətinə dəstək əlavə edir. "-param tsan-distinguish-volatile" və "-param tsan-instrument-func-entry-exit" yeni seçimləri əlavə edildi.
  • Diaqnostik mesajlardakı sütun nömrələri indi sətrin əvvəlindən bayt sayını deyil, əslində çox baytlıq simvolları və sətirdə bir neçə mövqe tutan simvolları nəzərə alan sütun nömrələrini əks etdirir (məsələn, 🙂 simvolu iki mövqe tutur və 4 baytla kodlanır). Eyni şəkildə, tab simvolları indi müəyyən sayda boşluq kimi qəbul edilir (-ftabstop seçimi ilə konfiqurasiya edilə bilər, standart 8). Köhnə davranışı bərpa etmək üçün “-fdiagnostics-column-unit=bayt” seçimi, ilkin dəyəri müəyyən etmək üçün (0 və ya 1-dən nömrələmə) - “-fdiagnostics-column-origin=” seçimi təklif olunur.
  • Vektorayator funksiyanın bütün məzmununu nəzərə alır və kəsişmələrlə əlaqəli emal imkanları və nəzarət-axın qrafikində əvvəlki bloklara istinadlar əlavə edir (CFG, nəzarət-axın qrafiki).
  • Optimizator eyni dəyişəni keçid ifadəsinə müqayisə edən bir sıra şərti əməliyyatları çevirmək qabiliyyətini həyata keçirir. Gələcəkdə keçid ifadəsi bit test təlimatlarından istifadə etməklə kodlaşdırıla bilər (belə çevrilməni idarə etmək üçün “-fbit-testlər” seçimi əlavə edilmişdir).
  • Təkmilləşdirilmiş prosedurlararası optimallaşdırmalar. Funksiyaları çağırarkən yan təsirləri izləmək və təhlilin dəqiqliyini artırmaq üçün yeni IPA-modref keçidi (-fipa-modref) əlavə edildi. Kompilyasiya zamanı yaddaş istehlakını azaldan və eyni kod bloklarının birləşdirildiyi vahid funksiyaların sayını artıran IPA-ICF keçidinin (-fipa-icf) təkmilləşdirilmiş tətbiqi. IPA-CP (Prosedurlararası daimi yayılma) keçidində dövrələrin məlum sərhədləri və xüsusiyyətləri nəzərə alınmaqla proqnozlaşdırma heuristikası təkmilləşdirilmişdir.
  • Zamanın Optimallaşdırılmasının Bağlanmasında (LTO) bayt kodu formatı ölçüsü azaltmaq və emal sürətini yaxşılaşdırmaq üçün optimallaşdırılmışdır. Bağlanma mərhələsində yaddaşın maksimum istehlakı azaldı.
  • İcra xüsusiyyətlərinin təhlili əsasında daha optimal kod yaratmağa imkan verən kod profilinin (PGO - Profile-guided optimization) nəticələrinə əsaslanan optimallaşdırma mexanizmində, sıfır sayğacların daha yığcam qablaşdırılması hesabına GCOV məlumatları olan faylların ölçüsü azaldılır. . Dolayı zənglərdə daha çox parametrləri izləməklə təkmilləşdirilmiş "-fprofile-values" rejimi.
  • Ortaq yaddaş və vektorlaşdırma vahidləri (SIMD) olan çoxnüvəli və hibrid (CPU+GPU/DSP) sistemlərdə paralel proqramlaşdırma metodlarının tətbiqi üçün API və metodları müəyyən edən OpenMP 5.0 (Açıq Çox Proses) standartının tətbiqi, davam etdi. Ayrılma direktivi üçün ilkin dəstək və OpenMP konstruksiyalarında heterojen döngələrdən istifadə etmək imkanı əlavə edildi. OMP_TARGET_OFFLOAD mühit dəyişəni üçün həyata keçirilən dəstək.
  • C, C++ və Fortran dilləri üçün nəzərdə tutulmuş OpenACC 2.6 paralel proqramlaşdırma spesifikasiyasının tətbiqi təkmilləşdirilmişdir ki, bu da NVIDIA PTX kimi GPU-larda və xüsusi prosessorlarda yükləmə əməliyyatları üçün alətləri müəyyən edir.
  • C dilləri üçün yığın qorunmasının aktiv edilməməsi lazım olan funksiyaları qeyd etmək üçün nəzərdə tutulmuş yeni “no_stack_protector” atributu tətbiq edilmişdir (“-fstack-protector”). “malloc” atributu yaddaşla işləməkdə tipik səhvləri (yaddaş sızması, boşaldıqdan sonra istifadə) müəyyən etmək üçün statik analizatorda istifadə olunan yaddaşın ayrılması və boşaldılması üçün zəng cütlərinin müəyyən edilməsini dəstəkləmək üçün genişləndirilmişdir (ayrıcı/deallocator). pulsuz funksiyaya ikiqat zənglər və s.) və kompilyator xəbərdarlıqlarında “-Wmismatched-dealloc”, “-Wmismatched-new-delete” və “-Wfree-nonheap-object”, yaddaşın boşaldılması və yaddaşın ayrılması əməliyyatları arasında uyğunsuzluq barədə məlumat verir.
  • C dili üçün yeni xəbərdarlıqlar əlavə edildi:
    • "-Wmismatched-dealloc" (standart olaraq aktivdir) - yaddaş ayırma funksiyaları ilə uyğun gəlməyən göstəricidən istifadə edən yaddaşın boşaldılması əməliyyatları barədə xəbərdarlıq edir.
    • "-Wsizeof-array-div" ("-Divar" göstərildikdə aktivdir) - Bölən massiv elementinin ölçüsünə uyğun gəlmirsə, iki sizeof operatorunun bölünməsi barədə xəbərdarlıq edir.
    • "-Wstringop-overread" (defolt olaraq aktivdir) - massiv sərhədindən kənar ərazidən məlumatları oxuyan sətir funksiyasının çağırılması barədə xəbərdarlıq edir.
    • "-Wtsan" (standart olaraq aktivdir) - ThreadSanitizer-də dəstəklənməyən funksiyalardan (məsələn, std::atomic_thread_fence) istifadə barədə xəbərdarlıq edir.
    • “-Warray-parameter” və “-Wvla-parameter” (“-Wall” göstərildikdə aktivləşdirilir) - sabit və dəyişən uzunluqlu massivlərlə əlaqəli arqumentlərin uyğun olmayan bəyanları ilə funksiyaları ləğv etmək barədə xəbərdarlıq edir.
    • "-Wuninitialized" xəbərdarlığı indi işə salınmamış dinamik olaraq ayrılmış yaddaşdan oxumaq cəhdlərini aşkar edir.
    • "-Wfree-nonheap-object" xəbərdarlığı yaddaşın boşaldılması funksiyalarının dinamik yaddaş ayırma funksiyaları vasitəsilə əldə edilməyən göstərici ilə çağırıldığı halların tərifini genişləndirir.
    • "-Wmaybe-uninitialized" xəbərdarlığı işə salınmamış yaddaş yerlərinə istinad edən funksiyalara göstəricilərin ötürülməsinin aşkarlanmasını genişləndirdi.
  • C dili üçün C2X standartı çərçivəsində hazırlanmış yeni funksiyaların bir hissəsi həyata keçirilmişdir (-std=c2x və -std=gnu2x göstərilməklə aktivləşdirilmişdir): BOOL_MAX və BOOL_WIDTH makroları, funksiyada istifadə olunmayan parametrlərin adlarının isteğe bağlı göstəricisi təriflər (C++-da olduğu kimi), atribut “[ [nodiscard]]”, preprosessor operatoru “__c_atributuna malikdir”, makroslar FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_LTANF, FSNBL60559, FSN_LTANF _SNAN, LDBL_SNAN, DEC_INFINITY və DEC _NAN, NaN=makroslar FloatN, _FloatNx və _DecimalN, bəyannamələrdən əvvəl və mürəkkəb ifadələrin sonunda keçid işarələrini təyin etmək imkanı.
  • C++ üçün C++20 standartında təklif olunan dəyişiklik və yeniliklərin bir hissəsi, o cümlədən “consteval virtual” virtual funksiyaları, obyektlərin həyat dövrünün sonu üçün psevdo-destruktorlar, enum sinifinin istifadəsi və “yeni” ifadədə massivin ölçüsünün hesablanması.
  • C++ üçün gələcək C++23 standartı (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu) üçün inkişaf etdirilən bəzi təkmilləşdirmələr üçün eksperimental dəstək əlavə edilmişdir. ++2b). Məsələn, indi işarələnmiş size_t dəyərləri üçün hərfi şəkilçi “zu” üçün dəstək var.
  • libstdc++ üzən nöqtə növləri üçün std::from_chars və std::to_chars tətbiqlərinin tətbiqi daxil olmaqla, C++17 standartı üçün təkmilləşdirilmiş dəstəyi əldə etmişdir. C++20 standartının yeni elementləri, o cümlədən std::bit_cast, std::source_location, atom əməliyyatları gözləyin və xəbərdar edin, , , , , həmçinin gələcək C++23 standartının elementləri (std::to_underlying, std::is_scoped_enum). Paralel məlumatların işlənməsi növləri üçün eksperimental dəstək əlavə edildi (SIMD, Data-Paralel Tiplər). std::uniform_int_distribution tətbiqi sürətləndirildi.
  • Alfa keyfiyyət bayrağı libgccjit-dən silindi, kod generatorunu digər proseslərə daxil etmək və ondan bayt kodun maşın koduna JIT tərtibini təşkil etmək üçün istifadə etmək üçün paylaşılan kitabxana. MinGW üçün libgccjit qurmaq imkanı əlavə edildi.
  • AArch64 Armv8-R arxitekturasına dəstək əlavə edildi (-march=armv8-r). AArch64 və ARM arxitekturaları üçün prosessorlara dəstək əlavə edildi (parametrlər -mcpu və -mtune): Arm Cortex-A78 (korteks-a78), Arm Cortex-A78AE (korteks-a78ae), Arm Cortex-A78C (korteks-a78c) , Arm Cortex- X1 (korteks-x1), Arm Neoverse V1 (neoverse-v1) və Arm Neoverse N2 (neoverse-n2). Yalnız AArch64 arxitekturasını dəstəkləyən Fujitsu A64FX (a82fx) və Arm Cortex-R82 (cortex-r64) CPU-ları da əlavə edilib.
  • Əlavə, çıxma, vurma və toplama/çıxma variantlarını yerinə yetirən əməliyyatları avtovektorlaşdırmaq üçün Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) və MVE (AArch32 M-profili) SIMD təlimatlarından istifadə üçün əlavə dəstək mürəkkəb ədədlər. MVE təlimat dəstindən istifadə edərək ARM üçün avtovektorlaşdırma üçün ilkin dəstək əlavə edildi.
  • ARM platformaları üçün ACLE Q3 2020 spesifikasiyasında sənədləşdirilmiş bütün NEON təlimatlarını əhatə edən genişləndirilmiş vektor təlimatları (SIMD) ilə əvəz edilmiş kompilyatorla inteqrasiya olunmuş C funksiyalarının (Intrinsics) tam dəsti təmin edilir.
  • GCN mikroarxitekturasına əsaslanan AMD GPU-ları üçün kod yaratmaq üçün arxa hissəyə gfx908 GPU dəstəyi əlavə edilib.
  • Yeni prosessorlar və onlarda tətbiq olunan yeni təlimat dəsti uzantıları üçün əlavə dəstək:
    • Intel Sapphire Rapids (-march=sapphirerapids, MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TXLDTRK, AMT-TILEMOTE, TXLDTRK, AMT-TILEX8V16B, AMT-TILEXXNUMXF, təlimatlarını dəstəkləməyə imkan verir.
    • Intel Alderlake (-march=alderlake, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI və HRESET təlimatlarını dəstəkləməyə imkan verir).
    • Intel Rocketlake (-march=rocketlake, SGX dəstəyi olmadan Rocket Lake-ə bənzəyir).
    • AMD Zen 3 (-mart=znver3).
  • Intel prosessorlarına əsaslanan IA-32/x86-64 sistemləri üçün TXLDTRK, SERIALIZE, HRESET, UINTKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI yeni prosessor təlimatlarına dəstək əlavə edilmişdir.
  • 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 ) .
  • Böyük endian bayt sırası ilə RISC-V sistemləri üçün əlavə dəstək. RISC-V təlimat dəsti arxitektura spesifikasiyasının versiyasını seçmək üçün "-misa-spec=*" seçimi əlavə edildi. AddressSanitizer və kanareyka etiketlərindən istifadə edərək yığın qorunması üçün əlavə dəstək.
  • Proqramda kodun icra yollarının və məlumat axınlarının resurs tutumlu prosedurlararası təhlilini həyata keçirən “-fanalyzer” statik analiz rejiminin davamlı təkmilləşdirilməsi. Rejim kompilyasiya mərhələsində problemləri aşkar etməyə qadirdir, məsələn, bir yaddaş sahəsi üçün free() funksiyasına ikiqat çağırışlar, fayl deskriptorunun sızması, referensiyadan çıxarılması və null göstəricilərin ötürülməsi, boşaldılmış yaddaş bloklarına daxil olmaq, işə salınmamış dəyərlərdən istifadə və s. Yeni versiyada:
    • Proqramın vəziyyətini izləmək üçün kod tamamilə yenidən yazılmışdır. Çox böyük C fayllarının skan edilməsi ilə bağlı problemlər həll edildi.
    • İlkin C++ dəstəyi əlavə edildi.
    • Yaddaşın ayrılması və boşaldılması təhlili xüsusi malloc və pulsuz funksiyalardan ayrılıb və indi yeni/silmək və yeni[]/delete[] funksiyalarını dəstəkləyir.
    • Yeni xəbərdarlıqlar əlavə edildi: -Wanalyzer-shift-count-neqativ, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const və -Wanalyzer-write to string-literal.
    • Yeni sazlama seçimləri əlavə edildi -fdump-analyzer-json və -fno-analyzer-fisibility.
    • Analizatoru GCC üçün plaginlər vasitəsilə genişləndirmək imkanı tətbiq edilmişdir (məsələn, CPython-da qlobal kilidləmənin (GIL) səhv istifadəsini yoxlamaq üçün plagin hazırlanmışdır).

Mənbə: opennet.ru

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