Rilis paket kompiler GCC 10

Setelah satu tahun pembangunan diterbitkan rilis satu set kompiler gratis GCC 10.1, rilis besar pertama di cabang GCC 10.x yang baru. Menurut skema baru nomor rilis, versi 10.0 digunakan dalam proses pengembangan, dan sesaat sebelum rilis GCC 10.1, cabang GCC 11.0 telah bercabang, yang menjadi dasar rilis penting berikutnya, GCC 11.1, akan dibentuk.

GCC 10.1 terkenal karena penerapan banyak inovasi dalam bahasa C++ yang dikembangkan untuk standar C++20, peningkatan terkait dengan standar bahasa C (C2x) masa depan, pengoptimalan baru pada backend compiler, dan dukungan eksperimental mode analisis statis. Selain itu, selama persiapan cabang baru, proyek mentransfer repositori dari SVN ke Git.

Utama perubahan:

  • Ditambahkan mode eksperimental analisis statis "-fananalyzerβ€œ, yang melakukan analisis antarprosedural intensif sumber daya terhadap jalur eksekusi kode dan aliran data dalam suatu 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. Penggunaan mode baru untuk kode OpenSSL telah memungkinkan identifikasi kerentanan yang berbahaya.
  • Peningkatan optimasi antarprosedural. Pass IPA-SRA (Interprocedural Scalar Shared Replacement) telah didesain ulang agar berfungsi pada waktu terikat dan, antara lain, sekarang menghapus nilai yang tidak digunakan yang dihitung dan dikembalikan. Dalam mode pengoptimalan "-O2", opsi "-finline-functions" diaktifkan, yang disetel kembali untuk mendukung kode yang lebih ringkas dibandingkan kinerja eksekusi. Pekerjaan heuristik untuk penerapan fungsi inline telah dipercepat. Ekspansi inline dan heuristik kloning fungsi kini dapat menggunakan informasi tentang rentang nilai untuk memprediksi efektivitas transformasi individu. Untuk C++, keakuratan penguraian alias berbasis tipe telah ditingkatkan.
  • Peningkatan Pengoptimalan Waktu Tautan (LTO). Menambahkan executable baru lto-dump untuk mengatur ulang informasi tentang file objek dengan bytecode LTO. Jalur LTO paralel secara otomatis menentukan jumlah tugas make yang berjalan secara bersamaan dan, jika tidak dapat ditentukan, menggunakan informasi tentang jumlah inti CPU sebagai faktor paralelisasi. Menambahkan kemampuan untuk mengompresi bytecode LTO menggunakan algoritma zstd.
  • Mekanisme optimasi berdasarkan hasil pembuatan profil kode (PGO - Optimasi terpandu profil) telah ditingkatkan, yang menghasilkan kode yang lebih optimal berdasarkan analisis karakteristik eksekusi kode. Peningkatan pemeliharaan profil selama kompilasi dan pemisahan kode panas/dingin. Melalui opsi "-fprofile-nilaiΒ» kini dapat memantau hingga 4 nilai profil, misalnya untuk panggilan tidak langsung dan memberikan informasi profil yang lebih tepat.
  • Spesifikasi pemrograman paralel diimplementasikan untuk bahasa C, C++ dan Fortran BukaACC 2.6, yang mendefinisikan alat untuk membongkar operasi pada GPU dan prosesor khusus seperti NVIDIA PTX. Penerapan standar ini hampir selesai Buka MP 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). Menambahkan fitur seperti kondisional lastprivate, arahan pemindaian dan loop, ekspresi order dan use_device_addr. Untuk OpenMP dan OpenACC, dukungan telah ditambahkan untuk operasi pembongkaran pada GPU AMD Radeon (GCN) generasi keempat (Fiji) dan generasi kelima (VEGA 10/VEGA 20).
  • Untuk bahasa keluarga C, fungsi "akses" telah ditambahkan untuk mendeskripsikan akses fungsi ke objek yang diteruskan melalui referensi atau penunjuk, dan untuk mengaitkan objek tersebut dengan argumen bilangan bulat yang berisi informasi tentang ukuran objek. Untuk bekerja bersama dengan "akses", atribut "tipe" diimplementasikan untuk mendeteksi akses yang salah dari fungsi pengguna, misalnya, saat menulis nilai ke area di luar batas array. Juga ditambahkan atribut "symver" untuk mengaitkan simbol dalam file ELF dengan nomor versi tertentu.
  • Peringatan baru ditambahkan:
    • β€œ-Wstring-compare” (diaktifkan dengan β€œ-Wextra”) - memperingatkan tentang adanya ekspresi di mana nol dibandingkan dengan hasil pemanggilan fungsi strcmp dan strncmp, yang setara dengan konstanta karena panjangnya satu argumen lebih besar dari ukuran array pada argumen kedua.
    • "-Wzero-length-bounds" (diaktifkan dengan "-Warray-bounds") - memperingatkan tentang mengakses elemen array dengan panjang nol, yang dapat mengakibatkan penimpaan data lain.
    • Peringatan β€œ-Warray-bounds”, β€œ-Wformat-overflow”, β€œ-Wrestrict”, β€œ-Wreturn-local-addr” dan β€œ-Wstringop-overflow” telah diperluas untuk memperluas jumlah situasi di luar batas yang ditangani.
  • Menerapkan kemampuan untuk secara langsung menentukan karakter lebar dalam pengidentifikasi menggunakan pengkodean saat ini (UTF-8 secara default) daripada notasi UCN (\uNNNN atau \UNNNNNNNNN). Misalnya:

    konstanta statis int Ο€ = 3;
    int get_naΓ―ve_pi() {
    kembalikan Ο€;
    }

  • Untuk bahasa C, sebagian fitur baru yang dikembangkan dalam standar C2X telah diterapkan (diaktifkan dengan menentukan -std=c2x dan -std=gnu2x): dukungan untuk sintaks β€œ[[]]” telah muncul untuk mendefinisikan atribut seperti pada C++ (misalnya, [[gnu ::const]], [[deprecated]], [[fallthrough]] dan [[maybe_unused]]. Menambahkan dukungan untuk sintaksis "u8" untuk mendefinisikan konstanta dengan karakter UTF-8.
    Menambahkan makro baru ke . Menambahkan substitusi "%OB" dan "%Ob" ke strftime.

  • Mode default untuk C adalah "-fno-common", yang memungkinkan akses lebih efisien ke variabel global pada beberapa platform.
  • Untuk C++, sekitar 16 perubahan dan inovasi telah diterapkan, yang dikembangkan dalam standar C++20. Termasuk kata kunci tambahan β€œconstinit”
    dan dukungan untuk ekstensi template telah diterapkan "konsep". Konsep memungkinkan Anda menentukan sekumpulan persyaratan parameter templat yang, pada waktu kompilasi, membatasi kumpulan argumen yang dapat diterima sebagai parameter templat. Konsep tersebut dapat digunakan untuk menghindari inkonsistensi logis antara properti tipe data yang digunakan dalam templat dan properti tipe data dari parameter input.

  • G++ menyediakan deteksi perilaku tidak terdefinisi yang disebabkan oleh perubahan objek konstan melalui constexpr. Mengurangi konsumsi memori oleh kompiler saat menghitung constexpr. Menambahkan peringatan baru "-Wmismatched-tags" dan "-Wredundant-tags".
  • Opsi baris perintah baru telah diusulkan:
    • "-fallocation-dce" untuk menghapus pasangan operator "baru" dan "hapus" yang tidak perlu.
    • "-fprofile-partial-training" untuk menonaktifkan pengoptimalan ukuran untuk kode yang tidak menjalankan pelatihan.
    • "-fprofile-reproducible untuk mengontrol tingkat reproduktifitas profil.
    • "-fprofile-prefix-path" untuk menentukan direktori pembuatan sumber dasar yang digunakan untuk pembuatan profil terpisah (untuk "-fprofile-generate=profile_dir" dan "-fprofile-use=profile_dir").
  • Dalam teks peringatan untuk opsi yang disebutkan, disediakan hyperlink yang memungkinkan Anda membuka dokumentasi untuk opsi ini. Substitusi URL dikontrol menggunakan opsi "-fdiagnostics-urls".
  • Menambahkan operator praprosesor "__telah_terbangun", yang dapat digunakan untuk memeriksa fungsi bawaan.
  • Menambahkan fungsi bawaan baru "__builtin_roundeven" dengan penerapan fungsi pembulatan yang ditentukan dalam spesifikasi ISO/IEC TS 18661, mirip dengan "bulat", tetapi pembulatan bagian lebih besar dari 0.5 ke atas (ke nilai yang lebih besar), kurang dari 0.5 - turun (ke nol), dan sama dengan 0.5 - dimulai dari paritas digit kedua dari belakang.
  • Untuk arsitektur AArch64, dukungan untuk ekstensi SVE2 telah ditambahkan dan dukungan untuk SVE (Scalable Vector Extension) telah ditingkatkan, termasuk dukungan tambahan untuk fungsi dan tipe SVE ACLE bawaan, dan penggunaan vektorisasi. Dukungan untuk LSE (Large System Extensions) dan TME (Transactional Memory Extensions) telah diperluas. Menambahkan instruksi baru yang diusulkan di Armv8.5-A dan Armv8.6-A, termasuk instruksi untuk pembuatan angka acak, pembulatan, pengikatan tag memori,
    bfloat16 dan perkalian matriks. Menambahkan dukungan prosesor
    Lengan Korteks-A77,
    Lengan Korteks-A76AE,
    Lengan Korteks-A65,
    Lengan Korteks-A65AE,
    Lengan Cortex-A34 dan
    Marvell ThunderX3.

  • Menambahkan dukungan untuk ABI FDPIC (penunjuk fungsi 32-bit) untuk ARM64. Pemrosesan operasi bilangan bulat 64-bit yang didesain ulang dan dioptimalkan. Menambahkan dukungan CPU
    Lengan Korteks-A77,
    Lengan Cortex-A76AE dan
    Lengan Korteks-M35P. Dukungan yang diperluas untuk instruksi pemrosesan data ACLE, termasuk SIMD 32-bit, perkalian 16-bit, aritmatika latch, dan optimalisasi algoritma DSP lainnya. Menambahkan dukungan eksperimental untuk instruksi ACLE CDE (Ekstensi Jalur Data Kustom).

  • Pembuatan kode dan vektorisasi yang ditingkatkan secara signifikan di backend untuk GPU AMD berdasarkan mikroarsitektur GCN.
  • Menambahkan dukungan untuk perangkat mirip XMEGA untuk arsitektur AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, AT mega4809 dan ATmegaXNUMX.

  • Ekstensi arsitektur set instruksi Intel ENQCMD baru (-menqcmd) telah ditambahkan untuk arsitektur IA-32/x86-64. Menambahkan dukungan untuk CPU Intel Cooperlake (-march=cooperlake, menyertakan ekstensi AVX512BF16 ISA) dan Tigerlake (-march=tigerlake, menyertakan ekstensi MOVDIRI, MOVDIR64B, dan AVX512VP2INTERSECT ISA).
  • Implementasi HSAIL (Bahasa Menengah Arsitektur Sistem Heterogen) untuk sistem komputasi heterogen berdasarkan arsitektur HSA sudah tidak digunakan lagi dan kemungkinan akan dihapus pada rilis mendatang.

Sumber: opennet.ru

Tambah komentar