Rilis paket kompiler GCC 12

Setelah satu tahun pengembangan, rangkaian kompiler gratis GCC 12.1 telah dirilis, rilis signifikan pertama di cabang GCC 12.x yang baru. Sesuai dengan skema penomoran rilis baru, versi 12.0 digunakan dalam proses pengembangan, dan sesaat sebelum rilis GCC 12.1, cabang GCC 13.0 telah bercabang, yang menjadi dasar rilis besar berikutnya, GCC 13.1, akan dilakukan. dibentuk. Pada tanggal 23 Mei, proyek ini akan merayakan 35 tahun sejak pembentukan GCC edisi pertama.

Perubahan besar:

  • Menambahkan dukungan untuk format debugging CTF (Compact Type Format), yang menyediakan penyimpanan ringkas informasi tentang tipe C, koneksi antar fungsi, dan simbol debugging. Ketika tertanam dalam objek ELF, formatnya memungkinkan penggunaan tabel karakter EFL untuk menghindari duplikasi data.
  • Dukungan untuk format penyimpanan informasi debug "STABS", yang dibuat pada tahun 1980-an, sudah tidak digunakan lagi.
  • Pekerjaan terus memperluas dukungan untuk standar C2X dan C++23 masa depan untuk bahasa C dan C++. Misalnya, dukungan untuk ekspresi “if consteval” telah ditambahkan; diperbolehkan menggunakan auto dalam argumen fungsi (“f(auto(g()))”); penggunaan variabel non-literal, goto dan label diperbolehkan dalam fungsi yang dideklarasikan sebagai constexpr; menambahkan dukungan untuk operator indeks multidimensi operator[]; di if, for dan switch, kemampuan blok inisialisasi telah diperluas (“for (menggunakan T = int; T e : v)”).
  • Pustaka Standar C++ telah meningkatkan dukungan untuk bagian eksperimental standar C++20 dan C++23. Menambahkan dukungan untuk std::move_only_function, , std::basic_string::resize_and_overwrite, , dan std::invoke_r. Diizinkan menggunakan std::unique_ptr, std::vector, std::basic_string, std::optional dan std::variant dalam fungsi constexpr.
  • Frontend Fortran memberikan dukungan penuh untuk spesifikasi TS 29113, yang menjelaskan kemampuan untuk memastikan portabilitas antara kode Fortran dan C.
  • Menambahkan dukungan untuk ekstensi __builtin_shufflevector(vec1, vec2, index1, index2, ...) yang sebelumnya ditambahkan ke Clang, yang menawarkan satu panggilan untuk melakukan operasi pengacakan dan pengacakan vektor umum.
  • Saat menggunakan tingkat pengoptimalan "-O2", vektorisasi diaktifkan secara default (mode -ftree-vectorize dan -fvect-cost-model=very-cheap diaktifkan). Model yang sangat murah memungkinkan vektorisasi hanya jika kode vektor dapat sepenuhnya menggantikan kode skalar yang sedang divektorisasi.
  • Menambahkan mode "-ftrivial-auto-var-init" untuk mengaktifkan inisialisasi variabel secara eksplisit pada tumpukan untuk melacak masalah dan memblokir kerentanan yang terkait dengan penggunaan variabel yang tidak diinisialisasi.
  • Untuk bahasa C dan C++, fungsi bawaan __builtin_dynamic_object_size telah ditambahkan untuk menentukan ukuran suatu objek, kompatibel dengan fungsi serupa dari Clang.
  • Untuk bahasa C dan C++, dukungan untuk atribut “tidak tersedia” telah ditambahkan (misalnya, Anda dapat menandai fungsi yang akan menghasilkan kesalahan jika Anda mencoba menggunakannya).
  • Untuk bahasa C dan C++, dukungan untuk arahan prapemrosesan “#elifdef” dan “#elifndef” telah ditambahkan.
  • Menambahkan tanda "-Wbidi-chars" untuk menampilkan peringatan jika karakter UTF-8 digunakan secara tidak benar, mengubah urutan tampilan teks dua arah.
  • Menambahkan tanda "-Warray-compare" untuk memperingatkan ketika mencoba membandingkan dua operan yang merujuk ke array.
  • Penerapan standar OpenMP 5.0 dan 5.1 (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) , terus berlanjut.
  • Peningkatan implementasi spesifikasi pemrograman paralel OpenACC 2.6, yang mendefinisikan alat untuk operasi pembongkaran pada GPU dan prosesor khusus seperti NVIDIA PTX.
  • Dukungan untuk instruksi tambahan Intel AVX86-FP512 dan tipe _Float16 telah ditambahkan ke backend pembuatan kode untuk arsitektur x16.
  • Untuk arsitektur x86, perlindungan telah ditambahkan terhadap kerentanan pada prosesor yang disebabkan oleh eksekusi instruksi spekulatif setelah operasi lompat ke depan tanpa syarat. Masalah terjadi karena pemrosesan instruksi pre-emptive segera mengikuti instruksi cabang di memori (SLS, Spekulasi Garis Lurus). Untuk mengaktifkan perlindungan, opsi “-mharden-sls” diusulkan.
  • Menambahkan deteksi penggunaan variabel yang tidak diinisialisasi ke penganalisis statis eksperimental. Menambahkan dukungan awal untuk menganalisis kode perakitan di sisipan inline. Pelacakan memori yang ditingkatkan. Kode untuk memproses ekspresi switch telah ditulis ulang.
  • Menambahkan 30 panggilan baru ke libgccjit, pustaka bersama untuk menyematkan generator kode ke dalam proses lain dan menggunakannya untuk mengkompilasi bytecode JIT ke dalam kode mesin.
  • Dukungan untuk mekanisme CO-RE (Kompilasi Sekali - Jalankan Di Mana Saja) telah ditambahkan ke backend untuk menghasilkan bytecode BPF, yang memungkinkan Anda mengkompilasi kode program eBPF untuk kernel Linux hanya sekali dan menggunakan pemuat universal khusus yang mengadaptasi program yang dimuat ke kernel saat ini dan Format Jenis BPF). CO-RE memecahkan masalah portabilitas program eBPF yang dikompilasi, yang sebelumnya hanya dapat digunakan dalam versi kernel yang dikompilasinya, karena posisi elemen dalam struktur data berubah dari versi ke versi.
  • Backend RISC-V menambahkan dukungan untuk ekstensi arsitektur set instruksi baru zba, zbb, zbc dan zbs, serta ekstensi ISA untuk operasi kriptografi vektor dan skalar. Secara default, dukungan untuk spesifikasi RISC-V ISA 20191213 disediakan. Flag -mtune=thead-c906 telah ditambahkan untuk mengaktifkan optimasi pada core T-HEAD c906.
  • Dukungan untuk tipe __int128_t/integer(kind=16) telah ditambahkan ke backend pembuatan kode untuk GPU AMD berdasarkan mikroarsitektur GCN. Dimungkinkan untuk menggunakan hingga 40 kelompok kerja per unit komputasi (CU) dan hingga 16 bagian depan instruksi (muka gelombang, satu set thread yang dijalankan secara paralel oleh Mesin SIMD) per grup. Sebelumnya, hanya satu sisi instruksi per CU yang diperbolehkan.
  • Backend NVPTX, yang dirancang untuk menghasilkan kode menggunakan arsitektur set instruksi NVIDIA PTX (Parallel Thread Execution), telah menambahkan kemampuan untuk menggunakan flag “-march”, “-mptx” dan “-march-map”. Dukungan yang diterapkan untuk PTX ISA sm_53, sm_70, sm_75 dan sm_80. Arsitektur defaultnya adalah sm_30.
  • Implementasi fungsi bawaan telah ditulis ulang di backend untuk prosesor PowerPC/PowerPC64/RS6000. Fungsi bawaan __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar dan __builtin_set_tfiar didokumentasikan.
  • Dukungan untuk Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) dan Arm Cortex-X710 (cortex-x2). Menambahkan dukungan untuk opsi arsitektur ARMv2 baru untuk digunakan dengan opsi "-march": armv8-a, armv8.7-a, armv8.8-a. Menambahkan implementasi fungsi C yang dibangun ke dalam kompiler (Intrinsik) untuk memuat atom dan menyimpan data ke dalam memori, berdasarkan penggunaan instruksi ARM yang diperluas (ls9). Menambahkan dukungan untuk mempercepat fungsi memcpy, memmove, dan memset menggunakan ekstensi mopsoption ARM.
  • Menambahkan mode pemeriksaan baru “-fsanitize=shadow-call-stack” (ShadowCallStack), yang saat ini hanya tersedia untuk arsitektur AArch64 dan berfungsi saat membuat kode dengan opsi “-fixed-r18”. Mode ini memberikan perlindungan terhadap penimpaan alamat pengirim dari suatu fungsi jika terjadi buffer overflow pada stack. Inti dari perlindungan adalah menyimpan alamat pengirim dalam tumpukan “bayangan” terpisah setelah mentransfer kontrol ke suatu fungsi dan mengambil alamat ini sebelum keluar dari fungsi tersebut.

Sumber: opennet.ru

Tambah komentar