Rilis paket kompiler GCC 11

Setelah satu tahun pengembangan, rangkaian kompiler gratis GCC 11.1 telah dirilis, rilis signifikan pertama di cabang GCC 11.x yang baru. Sesuai dengan skema penomoran rilis baru, versi 11.0 digunakan dalam proses pengembangan, dan sesaat sebelum rilis GCC 11.1, cabang GCC 12.0 telah bercabang, dari mana rilis besar berikutnya, GCC 12.1, akan dibentuk.

GCC 11.1 terkenal karena transisinya menggunakan format file debug DWARF 5 secara default, penyertaan default standar C++17 (“-std=gnu++17”), peningkatan signifikan dalam dukungan untuk C++20 standar, dukungan eksperimental untuk C++23, peningkatan terkait standar bahasa C masa depan (C2x), optimalisasi kinerja baru.

Perubahan besar:

  • Mode default untuk bahasa C++ telah dialihkan untuk menggunakan standar C++17 (-std=gnu++17) daripada C++14 yang ditawarkan sebelumnya. Dimungkinkan untuk menonaktifkan perilaku C++17 baru secara selektif saat memproses templat yang menggunakan templat lain sebagai parameter (-fno-new-ttp-matching).
  • Menambahkan dukungan untuk akselerasi perangkat keras dari alat AddressSanitizer, yang memungkinkan Anda menentukan fakta mengakses area memori yang dibebaskan, melampaui batas buffer yang dialokasikan, dan beberapa jenis kesalahan lainnya saat bekerja dengan memori. Akselerasi perangkat keras saat ini hanya tersedia untuk arsitektur AArch64 dan difokuskan untuk digunakan saat mengkompilasi kernel Linux. Untuk mengaktifkan akselerasi perangkat keras AddressSanitizer saat membangun komponen ruang pengguna, tanda "-fsanitize=hwaddress" telah ditambahkan, dan tanda kernel "-fsanitize=kernel-hwaddress".
  • Saat membuat informasi debug, format DWARF 5 digunakan secara default, yang dibandingkan dengan versi sebelumnya, memungkinkan menghasilkan data debug 25% lebih ringkas. Dukungan penuh untuk DWARF 5 memerlukan setidaknya binutils versi 2.35.2. Format DWARF 5 didukung di alat debugging sejak GDB 8.0, valgrind 3.17.0, elfutils 0.172 dan dwz 0.14. Untuk menghasilkan file debug menggunakan DWARF versi lain, Anda dapat menggunakan opsi "-gdwarf-2", "-gdwarf-3" dan "-gdwarf-4".
  • Persyaratan untuk compiler yang dapat digunakan untuk membangun GCC telah ditingkatkan. Kompiler sekarang harus mendukung standar C++11 (sebelumnya diperlukan C++98), yaitu. Jika GCC 10 sudah cukup untuk membangun GCC 3.4, maka setidaknya GCC 11 kini diperlukan untuk membangun GCC 4.8.
  • Nama dan lokasi file untuk menyimpan dump, file sementara dan informasi tambahan yang diperlukan untuk optimasi LTO telah diubah. File seperti itu sekarang selalu disimpan di direktori saat ini kecuali jalurnya diubah secara eksplisit melalui opsi "-dumpbase", "-dumpdir" dan "-save-temps=*".
  • Dukungan untuk format biner BRIG untuk digunakan dengan bahasa HSAIL (Heterogeneous System Architecture Intermediate Language) sudah tidak digunakan lagi dan akan segera dihapus.
  • Kemampuan mode ThreadSanitizer (-fsanitize=thread) telah diperluas, dirancang untuk mendeteksi kondisi balapan saat berbagi data yang sama dari thread berbeda pada aplikasi multi-thread. Rilis baru ini menambahkan dukungan untuk runtime dan lingkungan alternatif, serta dukungan untuk alat debugging KCSAN (Kernel Concurrency Sanitizer), yang dirancang untuk mendeteksi kondisi balapan secara dinamis dalam kernel Linux. Menambahkan opsi baru "-param tsan-distinguish-volatile" dan "-param tsan-instrument-func-entry-exit".
  • Nomor kolom dalam pesan diagnostik sekarang tidak mencerminkan jumlah byte dari awal baris, tetapi sebenarnya nomor kolom yang memperhitungkan karakter multi-byte dan karakter yang menempati beberapa posisi dalam baris (misalnya, karakter 🙂 menempati dua posisi dan dikodekan dalam 4 byte). Demikian pula, karakter tab sekarang diperlakukan sebagai sejumlah spasi tertentu (dapat dikonfigurasi melalui opsi -ftabstop, default 8). Untuk mengembalikan perilaku lama, opsi “-fdiagnostics-column-unit=byte” diusulkan, dan untuk menentukan nilai awal (penomoran dari 0 atau 1) - opsi “-fdiagnostics-column-origin=”.
  • Vectorizer memperhitungkan seluruh konten fungsi dan menambahkan kemampuan pemrosesan yang terkait dengan persimpangan dan referensi ke blok sebelumnya dalam grafik aliran kontrol (CFG, grafik aliran kontrol).
  • Pengoptimal mengimplementasikan kemampuan untuk mengubah serangkaian operasi kondisional yang membandingkan variabel yang sama menjadi ekspresi saklar. Ekspresi saklar nantinya dapat dikodekan menggunakan instruksi pengujian bit (opsi “-fbit-tests” telah ditambahkan untuk mengontrol konversi tersebut).
  • Peningkatan optimasi antarprosedural. Menambahkan pass modref IPA baru (-fipa-modref) untuk melacak efek samping saat memanggil fungsi dan meningkatkan akurasi analisis. Peningkatan implementasi pass IPA-ICF (-fipa-icf), yang mengurangi konsumsi memori selama kompilasi dan meningkatkan jumlah fungsi terpadu yang menggabungkan blok kode identik. Dalam jalur IPA-CP (propagasi konstan antarprosedural), heuristik prediksi telah ditingkatkan, dengan mempertimbangkan batasan dan fitur loop yang diketahui.
  • Dalam Linking Time Optimizations (LTO), format bytecode dioptimalkan untuk mengurangi ukuran dan meningkatkan kecepatan pemrosesan. Mengurangi konsumsi memori puncak selama fase pengikatan.
  • Dalam mekanisme pengoptimalan berdasarkan hasil pembuatan profil kode (PGO - Optimasi terpandu profil), yang memungkinkan pembuatan kode yang lebih optimal berdasarkan analisis fitur eksekusi, ukuran file dengan data GCOV berkurang karena pengemasan penghitung nol yang lebih kompak . Peningkatan mode "-fprofile-values" dengan melacak lebih banyak parameter pada panggilan tidak langsung.
  • Penerapan standar OpenMP 5.0 (Open Multi-Processing), yang mendefinisikan API dan metode untuk menerapkan metode pemrograman paralel pada sistem multi-core dan hybrid (CPU+GPU/DSP) dengan memori bersama dan unit vektorisasi (SIMD), telah lanjutan. Menambahkan dukungan awal untuk arahan alokasi dan kemampuan untuk menggunakan loop heterogen dalam konstruksi OpenMP. Dukungan yang diterapkan untuk variabel lingkungan OMP_TARGET_OFFLOAD.
  • Implementasi spesifikasi pemrograman paralel OpenACC 2.6 yang disediakan untuk bahasa C, C++ dan Fortran telah ditingkatkan, yang mendefinisikan alat untuk operasi pembongkaran pada GPU dan prosesor khusus, seperti NVIDIA PTX.
  • Untuk bahasa C, atribut baru “no_stack_protector” telah diterapkan, dirancang untuk menandai fungsi yang perlindungan tumpukannya tidak boleh diaktifkan (“-fstack-protector”). Atribut "malloc" telah diperluas untuk mendukung identifikasi pasangan panggilan untuk mengalokasikan dan mengosongkan memori (allocator/deallocator), yang digunakan dalam penganalisis statis untuk mengidentifikasi kesalahan umum dalam bekerja dengan memori (kebocoran memori, penggunaan setelah pembebasan, panggilan ganda ke fungsi bebas, dll.) dan dalam peringatan kompiler “-Wmismatched-dealloc”, “-Wmismatched-new-delete” dan “-Wfree-nonheap-object”, menginformasikan tentang inkonsistensi antara dealokasi memori dan operasi alokasi memori.
  • Peringatan baru telah ditambahkan untuk bahasa C:
    • "-Wmismatched-dealloc" (diaktifkan secara default) - memperingatkan tentang operasi dealokasi memori yang menggunakan pointer yang tidak kompatibel dengan fungsi alokasi memori.
    • "-Wsizeof-array-div" (diaktifkan ketika "-Wall" ditentukan) - Memperingatkan tentang pembagian dua operator sizeof jika pembagi tidak cocok dengan ukuran elemen array.
    • "-Wstringop-overread" (diaktifkan secara default) - memperingatkan tentang pemanggilan fungsi string yang membaca data dari area di luar batas array.
    • "-Wtsan" (diaktifkan secara default) - Memperingatkan tentang penggunaan fitur (seperti std::atomic_thread_fence) yang tidak didukung di ThreadSanitizer.
    • “-Warray-parameter” dan “-Wvla-parameter” (diaktifkan saat menentukan “-Wall”) - memperingatkan tentang penggantian fungsi dengan deklarasi argumen yang tidak kompatibel terkait dengan array dengan panjang tetap dan variabel.
    • Peringatan "-Wuninitialized" sekarang mendeteksi upaya membaca dari memori yang dialokasikan secara dinamis yang tidak diinisialisasi.
    • Peringatan "-Wfree-nonheap-object" memperluas definisi kasus di mana fungsi dealokasi memori dipanggil dengan penunjuk yang tidak diperoleh melalui fungsi alokasi memori dinamis.
    • Peringatan "-Wmaybe-uninitialized" telah memperluas deteksi penerusan pointer ke fungsi yang merujuk ke lokasi memori yang tidak diinisialisasi.
  • Untuk bahasa C, sebagian fitur baru yang dikembangkan dalam kerangka standar C2X telah diterapkan (diaktifkan dengan menentukan -std=c2x dan -std=gnu2x): makro BOOL_MAX dan BOOL_WIDTH, indikasi opsional nama parameter yang tidak digunakan dalam fungsi definisi (seperti dalam C++), atribut “[ [nodiscard]]", operator praprosesor "__has_c_attribute", makro FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559_EXT__, INFINITY, NAN, FLT_SNAN, DBL_SNAN, LDBL_SNAN, DEC_INFINITY dan DEC _NAN, NaN=makro untuk FloatN, _FloatNx dan _DecimalN, kemampuan untuk menentukan tanda lompatan sebelum deklarasi dan di akhir pernyataan gabungan.
  • Untuk C++, sebagian dari perubahan dan inovasi yang diusulkan dalam standar C++20 telah diterapkan, termasuk fungsi virtual “consteval virtual”, pseudo-destructors untuk akhir siklus hidup objek, penggunaan kelas enum dan menghitung ukuran array dalam ekspresi "baru".
  • Untuk C++, dukungan eksperimental telah ditambahkan untuk beberapa perbaikan yang sedang dikembangkan untuk standar C++23 masa depan (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Misalnya, sekarang ada dukungan untuk akhiran literal “zu” untuk nilai size_t yang ditandatangani.
  • libstdc++ telah meningkatkan dukungan untuk standar C++17, termasuk pengenalan implementasi std::from_chars dan std::to_chars untuk tipe floating point. Menerapkan elemen baru dari standar C++20, termasuk std::bit_cast, std::source_location, operasi atom tunggu dan beri tahu, , , , , serta elemen dari standar C++ masa depan 23 (std::to_underlying, std::is_scoped_enum). Menambahkan dukungan eksperimental untuk tipe pemrosesan data paralel (SIMD, Tipe Data-Paralel). Implementasi std::uniform_int_distribution telah dipercepat.
  • Menghapus tanda kualitas alfa dari libgccjit, pustaka bersama untuk menyematkan generator kode ke dalam proses lain dan menggunakannya untuk mengatur kompilasi bytecode JIT ke dalam kode mesin. Menambahkan kemampuan untuk membangun libgccjit untuk MinGW.
  • Menambahkan dukungan untuk arsitektur AArch64 Armv8-R (-march=armv8-r). Untuk arsitektur AArch64 dan ARM, dukungan untuk prosesor telah ditambahkan (parameter -mcpu dan -mtune): Arm Cortex-A78 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c) , Arm Cortex- X1 (cortex-x1), Arm Neoverse V1 (neoverse-v1) dan Arm Neoverse N2 (neoverse-n2). CPU Fujitsu A64FX (a64fx) dan Arm Cortex-R82 (cortex-r82) juga telah ditambahkan, hanya mendukung arsitektur AArch64.
  • Menambahkan dukungan untuk menggunakan instruksi SIMD Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) dan MVE (AArch32 M-profile) untuk melakukan vektorisasi otomatis operasi yang melakukan penjumlahan, pengurangan, perkalian, dan varian penjumlahan/pengurangan atas bilangan kompleks. Menambahkan dukungan awal untuk vektorisasi otomatis untuk ARM menggunakan set instruksi MVE.
  • Untuk platform ARM, satu set lengkap fungsi C yang terintegrasi dengan kompiler (Intrinsik) disediakan, digantikan oleh instruksi vektor yang diperluas (SIMD), yang mencakup semua instruksi NEON yang didokumentasikan dalam spesifikasi ACLE Q3 2020.
  • Dukungan untuk GPU gfx908 telah ditambahkan ke backend untuk menghasilkan kode untuk GPU AMD berdasarkan mikroarsitektur GCN.
  • Menambahkan dukungan untuk prosesor baru dan ekstensi set instruksi baru yang diterapkan di dalamnya:
    • Intel Sapphire Rapids (-march=sapphirerapids, memungkinkan dukungan untuk instruksi MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF16 dan AVX-VNNI.
    • Intel Alderlake (-march=alderlake, mengaktifkan dukungan untuk instruksi CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI dan HRESET).
    • Intel Rocketlake (-march=rocketlake, mirip dengan Rocket Lake tanpa dukungan SGX).
    • AMD Zen 3 (-maret=znver3).
  • Untuk sistem IA-32/x86-64 berdasarkan prosesor Intel, dukungan untuk instruksi prosesor baru TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI telah ditambahkan.
  • Menambahkan dukungan untuk flag "-march=x86-64-v[234]" untuk memilih level arsitektur x86-64 (v2 - mencakup ekstensi SSE4.2, SSSE3, POPCNT dan CMPXCHG16B; v3 - AVX2 dan MOVBE; v4 - AVX-512 ) .
  • Menambahkan dukungan untuk sistem RISC-V dengan urutan byte big-endian. Menambahkan opsi "-misa-spec=*" untuk memilih versi spesifikasi arsitektur set instruksi RISC-V. Menambahkan dukungan untuk AddressSanitizer dan perlindungan tumpukan menggunakan tag canary.
  • Peningkatan berkelanjutan pada mode analisis statis “-fanalyzer”, yang melakukan analisis antarprosedural intensif sumber daya pada jalur eksekusi kode dan aliran data dalam program. Mode ini mampu mendeteksi masalah pada tahap kompilasi, seperti panggilan ganda ke fungsi free() untuk satu area memori, kebocoran deskriptor file, dereferensi dan meneruskan pointer nol, mengakses blok memori yang dibebaskan, menggunakan nilai yang tidak diinisialisasi, dll. Dalam versi baru:
    • Kode untuk melacak status program telah ditulis ulang sepenuhnya. Masalah dengan pemindaian file C yang sangat besar telah teratasi.
    • Menambahkan dukungan C++ awal.
    • Alokasi memori dan analisis deallokasi telah diabstraksi dari fungsi malloc dan fungsi bebas tertentu, dan sekarang mendukung new/delete dan new[]/delete[].
    • Menambahkan peringatan baru: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const dan -Wanalyzer-write-to-string-literal.
    • Menambahkan opsi debugging baru -fdump-analyzer-json dan -fno-analyzer-feasibility.
    • Kemampuan untuk memperluas penganalisis melalui plugin untuk GCC telah diterapkan (misalnya, sebuah plugin telah disiapkan untuk memeriksa kesalahan penggunaan penguncian global (GIL) di CPython).

Sumber: opennet.ru

Tambah komentar