Rilis paket kompiler GCC 9

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

GCC 9.1 terkenal karena menstabilkan dukungan untuk standar C++17, terus mengimplementasikan kemampuan standar C++20 masa depan (dengan nama kode C++2a), penyertaan di frontend untuk bahasa D, dukungan parsial untuk OpenMP 5.0 , dukungan hampir lengkap untuk OpenACC 2.5, peningkatan skalabilitas optimasi antarprosedural dan optimasi pada tahap pengikatan, perluasan alat diagnostik dan penambahan peringatan baru, backend untuk OpenRISC, C-SKY V2 dan GPU AMD GCN.

Utama perubahan:

  • Menambahkan dukungan untuk bahasa pemrograman D. GCC menyertakan frontend dengan compiler GDC (Gnu D Compiler) dan perpustakaan runtime (libphobos), yang memungkinkan Anda menggunakan GCC standar untuk membangun program dalam bahasa pemrograman D. Proses mengaktifkan dukungan bahasa D di GCC telah mulai kembali pada tahun 2011, tapi berlarut-larut karena kebutuhan untuk menyesuaikan kode dengan persyaratan GCC dan masalah dengan pengalihan hak kekayaan intelektual ke Digital Mars, yang sedang mengembangkan bahasa pemrograman D;
  • Perbaikan telah dilakukan pada pembuat kode. Misalnya, penggunaan strategi berbeda untuk memperluas ekspresi Switch (tabel lompat, pengujian bit, pohon keputusan) tergantung pada situasi telah diterapkan. Menambahkan kemampuan untuk mengubah fungsi linier yang menyertakan ekspresi Switch menggunakan optimasi “-ftree-switch-conversion” (misalnya, serangkaian kondisi seperti “case 2: how = 205; break; case 3: how = 305; break ;” akan diubah menjadi "100 * bagaimana + 5";
  • Peningkatan optimasi antarprosedural. Pengaturan penerapan inline telah diadaptasi untuk basis kode C++ modern dan diperluas dengan parameter baru max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns dan uninlined -waktunya. Peningkatan akurasi dan agresivitas pemisahan kode dingin/panas. Peningkatan skalabilitas untuk ukuran yang sangat besar unit terjemahan (misalnya, ketika menerapkan optimasi pada tahap penautan ke program besar);
  • Mekanisme optimasi berdasarkan hasil pembuatan profil kode (PGO - Optimasi terpandu profil) telah ditingkatkan, yang menghasilkan kode yang lebih optimal berdasarkan analisis karakteristik eksekusi kode. Opsi ringkasan "-fprofile-penggunaan" sekarang menyertakan mode pengoptimalan "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" dan "-ftree-loop-distribution". Menghapus penyertaan histogram dengan penghitung dalam file, yang mengurangi ukuran file dengan profil (histogram sekarang dibuat dengan cepat saat melakukan pengoptimalan selama penautan);
  • Peningkatan Pengoptimalan Waktu Tautan (LTO). Penyederhanaan jenis diberikan sebelum menghasilkan hasil, yang memungkinkan pengurangan ukuran file objek LTO secara signifikan, mengurangi konsumsi memori pada tahap pengikatan, dan meningkatkan paralelisasi operasi. Jumlah partisi (-param lto-partitions) telah ditingkatkan dari 32 menjadi 128, yang meningkatkan kinerja pada sistem dengan jumlah thread CPU yang banyak. Parameter telah ditambahkan untuk mengontrol jumlah proses pengoptimal
    "-param lto-max-streaming-paralelisme";

    Hasilnya, dibandingkan dengan GCC 8.3, pengoptimalan diperkenalkan di GCC 9 diizinkan mengurangi waktu kompilasi Firefox 5 dan LibreOffice 66 sekitar 6.2.3%. Ukuran file objek berkurang 7%. Waktu pengikatan pada CPU 8-inti menurun sebesar 11%. Tahap optimasi sekuensial dari tahap penautan kini 28% lebih cepat dan menggunakan memori 20% lebih sedikit. Konsumsi memori setiap prosesor pada tahap LTO yang diparalelkan menurun sebesar 30%;

  • Sebagian besar spesifikasi pemrograman paralel diimplementasikan untuk bahasa C, C++ dan Fortran BukaACC 2.5, yang mendefinisikan alat untuk membongkar operasi pada GPU dan prosesor khusus seperti NVIDIA PTX;
  • Dukungan parsial untuk standar ini telah diterapkan untuk C dan C++ Buka MP 5.0 (Open Multi-Processing), yang mendefinisikan API dan metode penerapan metode pemrograman paralel untuk bahasa C, C++ dan Fortran pada sistem multi-core dan hybrid (CPU+GPU/DSP) dengan memori bersama dan unit vektorisasi (SIMD) ;
  • Peringatan baru telah ditambahkan untuk bahasa C: "-Alamat-anggota-yang-dikemas" (nilai penunjuk yang tidak selaras ke anggota struktur atau gabungan yang dikemas) dan
    «-Nilai mutlak" (saat mengakses fungsi untuk menghitung nilai absolut, jika ada fungsi yang lebih sesuai untuk argumen yang ditentukan, misalnya, fabs(3.14) harus digunakan daripada abs(3.14). Peringatan baru ditambahkan untuk C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" dan "-Wclass-conversion". Banyak peringatan yang tersedia sebelumnya telah diperluas;

  • Menambahkan dukungan eksperimental untuk bagian dari standar bahasa C masa depan, dengan nama kode C2x. Untuk mengaktifkan dukungan C2x, gunakan opsi "-std=c2x" dan "-std=gnu2x" (untuk mengaktifkan ekstensi GNU). Standar ini masih dalam tahap awal pengembangan, oleh karena itu, dari kemampuannya, hanya ekspresi _Static_assert dengan satu argumen yang didukung (_Static_assert dengan dua argumen distandarisasi di C11);
  • Dukungan untuk standar C++17 telah dinyatakan stabil. Di frontend, kemampuan bahasa C++17 diimplementasikan sepenuhnya, dan di libstdc++, fungsi perpustakaan yang ditentukan dalam standar hampir mencapai implementasi penuh;
  • Lanjutan implementasi elemen standar C++2a masa depan. Misalnya, kemampuan untuk menyertakan rentang selama inisialisasi telah ditambahkan, ekstensi untuk ekspresi lambda telah diterapkan, dukungan untuk anggota struktur data yang kosong dan atribut yang mungkin/tidak mungkin telah ditambahkan, kemampuan untuk memanggil fungsi virtual dalam ekspresi kondisional telah disediakan , dll.
    Untuk mengaktifkan dukungan C++2a, gunakan opsi "-std=c++2a" dan "-std=gnu++2a". Menambahkan file header bit dan versi ke libstdc++ untuk fungsi C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible dan std::type_identity, std::midpoint, std::lerp , std::bind_front,
    std::visit, std::is_constant_evaluated dan std::assume_aligned, menambahkan dukungan untuk tipe char8_t, menerapkan kemampuan untuk memeriksa awalan dan akhiran string (starts_with, end_with);

  • Menambahkan dukungan untuk prosesor ARM baru
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ besar.LITTLE dan Neoverse N1. Menambahkan dukungan untuk instruksi yang diperkenalkan di Armv8.3-A untuk bekerja dengan bilangan kompleks, pembuatan bilangan acak semu (rng) dan penandaan memori (memtag), serta instruksi untuk memblokir serangan yang terkait dengan eksekusi spekulatif dan pengoperasian unit prediksi cabang . Untuk arsitektur AArch64, mode proteksi telah ditambahkan persimpangan tumpukan dan tumpukan (“-fstack-clash-perlindungan”). Untuk menggunakan fitur arsitektur Armv8.5-A, opsi “-march=armv8.5-a” telah ditambahkan

  • Ini mencakup backend untuk menghasilkan kode untuk GPU AMD berdasarkan mikroarsitektur GCN. Implementasinya saat ini terbatas pada kompilasi aplikasi single-threaded (dukungan untuk melakukan perhitungan multi-thread melalui OpenMP dan OpenACC akan ditawarkan nanti) dan dukungan untuk GPU Fiji dan Vega 10;
  • Menambahkan backend baru untuk prosesor BukaRISC;
  • Menambahkan backend untuk prosesor C-SKY V2, diproduksi oleh perusahaan Cina dengan nama yang sama untuk berbagai perangkat konsumen;
  • Semua opsi baris perintah yang mengoperasikan nilai byte mendukung sufiks kb, KiB, MB, MiB, GB dan GiB;
  • Diimplementasikan opsi “-flive-patching=[inline-only-static|inline-clone]” memungkinkan Anda mencapai kompilasi yang aman untuk sistem live-patching karena kontrol multi-level atas penggunaan interprosedural (IPA) optimasi;
  • Menambahkan opsi "--completion" untuk kontrol penyelesaian opsi yang lebih baik saat menggunakan bash;
  • Alat diagnostik menyediakan tampilan kutipan teks sumber yang menunjukkan nomor baris dan menandai informasi terkait secara visual, seperti jenis operan. Untuk menonaktifkan tampilan nomor baris dan label, opsi “-fno-diagnostics-show-line-numbers” dan “-fno-diagnostics-show-labels” disediakan;

    Rilis paket kompiler GCC 9

  • Diperluas alat untuk mendiagnosis kesalahan dalam kode C++, meningkatkan keterbacaan informasi tentang penyebab kesalahan dan menyoroti parameter masalah;

    Rilis paket kompiler GCC 9

  • Menambahkan opsi “-fdiagnostics-format=json”, yang memungkinkan menghasilkan keluaran diagnostik dalam format yang dapat dibaca mesin (JSON);
  • Menambahkan opsi pembuatan profil baru “-fprofile-filter-files” dan “-fprofile-exclude-files” untuk memilih file sumber yang akan diproses;
  • AddressSanitizer menyediakan pembuatan kode verifikasi yang lebih ringkas untuk variabel otomatis, yang mengurangi konsumsi memori dari file yang dapat dijalankan yang sedang diperiksa;
  • Peningkatan keluaran di "-fopt-info» (informasi mendetail tentang pengoptimalan tambahan). Menambahkan awalan baru "dioptimalkan" dan "tidak terjawab", selain awalan "catatan" yang tersedia sebelumnya. Menambahkan keluaran informasi tentang pengambilan keputusan pada inline-unfolding dan vektorisasi siklus;
  • Menambahkan opsi “-fsave-optimization-record”, ketika ditentukan, GCC menyimpan file SRCFILE.opt-record.json.gz dengan deskripsi keputusan tentang penggunaan optimasi tertentu. Opsi baru ini berbeda dari mode “-fopt-info” dengan menyertakan metadata tambahan, seperti informasi tentang profil dan rantai inline;
  • Menambahkan opsi “-fipa-stack-alignment” dan “-fipa-reference-addressable” untuk mengontrol penyelarasan tumpukan dan penggunaan mode pengalamatan (write-only atau read-exact) untuk variabel statis selama optimasi antarprosedural;
  • Fungsi bawaan baru diperkenalkan untuk mengontrol pengikatan atribut serta perilaku yang terkait dengan prediksi cabang dan eksekusi instruksi spekulatif: "__builtin_has_attribute«,«__builtin_expect_with_probability" Dan "__nilai_aman_spekulasi_bawaan". Atribut baru telah ditambahkan untuk fungsi, variabel, dan tipe salinan;
  • Dukungan penuh untuk input/output asinkron telah diterapkan untuk bahasa Fortran;
  • Dukungan untuk platform Solaris 10 (*-*-solaris2.10) dan Cell/BE (Cell Broadband Engine SPU) sudah tidak digunakan lagi dan akan dihapus pada rilis besar berikutnya. Dukungan untuk arsitektur Armv2, Armv3, Armv5 dan Armv5E telah dihentikan. Dukungan untuk Intel MPX (Memory Protection Extensions) telah dihentikan.

Sumber: opennet.ru

Tambah komentar