Ngaleupaskeun GCC 9 kompiler suite

Sanggeus sataun pangwangunan diterbitkeun ngabebaskeun set bébas tina compiler GCC 9.1, release utama munggaran dina cabang GCC 9.x anyar. Dumasarkeun kana skéma anyar angka release, versi 9.0 dipaké dina prosés ngembangkeun, sarta teu lila saméméh sékrési GCC 9.1, cabang GCC 10.0 geus cabang kaluar, dina dasar nu release signifikan salajengna, GCC 10.1, bakal kabentuk.

GCC 9.1 kasohor pikeun nyaimbangkeun dukungan pikeun standar C ++ 17, neraskeun ngalaksanakeun kamampuan standar C ++ 20 kahareup (codenamed C ++ 2a), kalebet dina frontend pikeun basa D, dukungan parsial pikeun OpenMP 5.0. , rojongan ampir lengkep pikeun OpenACC 2.5, ngaronjatkeun scalability of optimizations interprocedural na optimizations dina tahap mengikat, perluasan parabot diagnostik jeung tambahan warnings anyar, backends pikeun OpenRISC, C-SKY V2 na AMD GCN GPU.

utama parobahan:

  • Ditambahkeun rojongan pikeun basa programming D. GCC ngawengku frontend kalawan compiler a GDC (Gnu D Compiler) sareng perpustakaan runtime (libphobos), anu ngamungkinkeun anjeun ngagunakeun GCC standar pikeun ngawangun program dina basa pamrograman D. Prosés ngaktifkeun dukungan basa D dina GCC geus dimimitian deui 2011, tapi diseret alatan kudu mawa kode kana patuh sarat GCC jeung masalah jeung mindahkeun hak cipta intelektual Digital Mars, nu geus ngembangkeun basa programming D;
  • Perbaikan parantos dilakukeun pikeun generator kode. Contona, pamakéan strategi béda pikeun ékspansi Switch ékspansi (luncat tabel, test bit, tangkal kaputusan) gumantung kana situasi geus dilaksanakeun. Ditambahkeun kamampuan pikeun ngarobih fungsi linier anu kalebet ekspresi Switch nganggo optimasi "-ftree-switch-conversion" (contona, sakumpulan kaayaan sapertos "kasus 2: kumaha = 205; putus; kasus 3: kumaha = 305; putus. ;” bakal dirobah jadi "100 * kumaha + 5";
  • Ningkatkeun optimasi interprocedural. Setélan panyebaran inline parantos diadaptasi pikeun basis kode C ++ modéren sareng dilegaan ku parameter énggal max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns and uninlined - waktosna. Ningkatkeun akurasi sarta aggressiveness tina tiis / separation kode panas. Ningkatkeun skalabilitas pikeun anu ageung pisan unit tarjamah (contona, nalika nerapkeun optimasi dina tahap linking ka program badag);
  • Mékanisme optimasi dumasar kana hasil profil kode (PGO - optimasi dipandu Profil) parantos ningkat, anu ngahasilkeun kode anu langkung optimal dumasar kana analisa karakteristik palaksanaan kode. Pilihan kasimpulan "-fprofile-pamakéan"Ayeuna kalebet modeu optimasi "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" sareng "-ftree-loop-distribution". Dipiceun citakan histograms kalawan counters dina file, nu ngurangan ukuran file kalawan propil (histograms ayeuna dihasilkeun dina laleur nalika ngalakukeun optimizations salila linking);
  • Ditingkatkeun Linking Time Optimizations (LTO). Nyederhanakeun jinis disayogikeun sateuacan ngahasilkeun hasilna, anu ngamungkinkeun pikeun ngirangan ukuran file objék LTO sacara signifikan, ngirangan konsumsi mémori dina tahap ngariung, sareng ningkatkeun paralélisasi operasi. Jumlah partitions (-param lto-partitions) geus ngaronjat tina 32 ka 128, nu ngaronjatkeun kinerja dina sistem kalawan angka nu gede ngarupakeun threads CPU. Parameter geus ditambahkeun pikeun ngadalikeun jumlah prosés optimizer
    "-param lto-max-streaming-parallelism";

    Hasilna, dibandingkeun sareng GCC 8.3, optimasi diwanohkeun dina GCC 9 diwenangkeun ngirangan waktos kompilasi Firefox 5 sareng LibreOffice 66 sakitar 6.2.3%. Ukuran file obyék turun ku 7%. Waktu ngariung dina CPU 8-inti turun ku 11%. Tahap optimasi sequential tina tahap linking ayeuna 28% leuwih gancang sarta meakeun 20% kirang memori. Konsumsi mémori unggal prosésor tina tahap parallelized of LTO turun ku 30%;

  • Kalolobaan spésifikasi programming paralel dilaksanakeun pikeun C, C ++ jeung basa Fortran OpenACC 2.5, nu nangtukeun parabot pikeun operasi offloading on GPUs jeung prosesor husus kayaning NVIDIA PTX;
  • Pangrojong parsial pikeun standar parantos dilaksanakeun pikeun C sareng C ++ Buka MP 5.0 (Open Multi-Processing), anu ngahartikeun API sareng metode nerapkeun metode program paralel pikeun basa C, C ++ sareng Fortran dina sistem multi-inti sareng hibrida (CPU + GPU / DSP) kalayan mémori sareng unit vectorization (SIMD) anu dibagi. ;
  • Peringatan anyar parantos ditambah pikeun basa C: "-Waddress-of-dipak-anggota" (Nilai pointer unaaligned ka anggota dipak tina struktur atawa union) jeung
    «-Wabsolute-nilai"(Nalika ngakses fungsi keur ngitung hiji nilai mutlak, lamun aya fungsi nu leuwih cocog pikeun argumen dieusian, contona, fabs (3.14) kudu dipake tinimbang abs (3.14). Peringatan anyar ditambahkeun pikeun C ++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" jeung "-Wclass-conversion". Loba warnings sadia saméméhna geus dimekarkeun;

  • Ditambahkeun pangrojong ékspérimén pikeun bagian tina standar basa C hareup, codenamed C2x. Pikeun ngaktifkeun dukungan C2x, paké pilihan "-std=c2x" sareng "-std=gnu2x" (pikeun ngaktipkeun ekstensi GNU). Standar masih dina tahap awal pangwangunan, ku kituna, kamampuanana, ngan ukur éksprési _Static_assert sareng hiji argumen anu dirojong (_Static_assert sareng dua argumen anu distandarisasi dina C11);
  • Rojongan pikeun standar C ++ 17 geus dinyatakeun stabil. Dina frontend nu, kamampuhan basa C ++ 17 pinuh dilaksanakeun, sarta di libstdc ++, fungsi perpustakaan didefinisikeun dina standar deukeut ka palaksanaan pinuh;
  • Dituluykeun palaksanaan elemen hareup C ++ 2a baku. Contona, kamampuhan pikeun ngawengku rentang salila initialization geus ditambahkeun, ekstensi pikeun ekspresi lambda geus dilaksanakeun, rojongan pikeun anggota kosong tina struktur data jeung kamungkinan / atribut saperti teu mirip geus ditambahkeun, kamampuhan pikeun nelepon fungsi virtual dina ekspresi kondisional geus disadiakeun. , jsb.
    Pikeun ngaktipkeun rojongan C ++ 2a, make "-std = c ++ 2a" jeung "-std = gnu ++ 2a" pilihan. Ditambahkeun bit sareng file header versi kana libstdc ++ pikeun C ++ 2a, std :: remove_cvref, std :: unwrap_reference, std :: unwrap_decay_ref, std :: is_nothrow_convertible na std :: type_identity Tret, std :: midpoint, std :: , std::bind_front,
    std :: neng, std :: is_constant_evaluated na std :: assume_aligned, ditambahkeun rojongan pikeun tipe char8_t, dilaksanakeun kamampuhan pikeun pariksa awalan jeung ahiran tina string (starts_with, ends_with);

  • Ditambahkeun dukungan pikeun prosesor ARM énggal
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE jeung Neoverse N1. Ditambahkeun dukungan pikeun paréntah anu diwanohkeun dina Armv8.3-A pikeun damel sareng nomer kompleks, generasi nomer pseudo-acak (rng) sareng tagging mémori (memtag), ogé paréntah pikeun meungpeuk serangan anu aya hubunganana sareng palaksanaan spekulatif sareng operasi unit prediksi cabang. . Pikeun arsitektur AArch64, mode panyalindungan geus ditambahkeun parapatan tumpukan sareng tumpukan (“-fstack-clash-protection”). Pikeun ngagunakeun fitur arsitektur Armv8.5-A, pilihan "-march=armv8.5-a" geus ditambahkeun.

  • Ieu ngawengku backend pikeun kode generating pikeun AMD GPUs dumasar kana microarchitecture GCN. Palaksanaan ayeuna dugi ka kompilasi aplikasi single-threaded (rojongan pikeun ngalaksanakeun itungan multi-threaded via OpenMP na OpenACC bakal ditawarkeun engké) jeung rojongan pikeun GPU Fiji jeung Vega 10;
  • Ditambahkeun backend anyar pikeun prosesor OpenRISC;
  • Ditambahkeun backend pikeun prosesor C-LANGIT V2, dihasilkeun ku parusahaan Cina tina nami nu sami pikeun sagala rupa alat konsumén;
  • Sadaya pilihan baris paréntah anu ngoperasikeun nilai bait ngadukung sufiks kb, KiB, MB, MiB, GB sareng GiB;
  • Dilaksanakeun pilihan "-flive-patching=[inline-only-static|inline-clone]" ngidinan Anjeun pikeun ngahontal kompilasi aman pikeun sistem live-patching alatan kontrol multi-tingkat dina pamakéan interprocedural (IPA) optimasi;
  • Ditambahkeun "--completion" pilihan pikeun kontrol fine-grained tina pilihan parantosan nalika maké bash;
  • Alat diagnostik nyadiakeun pidangan kutipan téks sumber anu nunjukkeun nomer garis sareng nyirian inpormasi anu aya hubunganana, sapertos jinis operan. Pikeun nganonaktipkeun tampilan nomer garis sareng labél, pilihan "-fno-diagnostics-show-line-numbers" sareng "-fno-diagnostics-show-labél" disadiakeun;

    Ngaleupaskeun GCC 9 kompiler suite

  • Dilegaan alat pikeun diagnosis kasalahan dina kode C ++, ningkat readability inpormasi ngeunaan nyababkeun kasalahan sarta panyorot parameter masalah;

    Ngaleupaskeun GCC 9 kompiler suite

  • Ditambahkeun pilihan "-fdiagnostics-format = json", anu ngamungkinkeun ngahasilkeun kaluaran diagnostik dina format anu tiasa dibaca mesin (JSON);
  • Nambahkeun pilihan profil anyar "-fprofile-filter-files" sareng "-fprofile-exclude-files" pikeun milih file sumber pikeun diolah;
  • AddressSanitizer nyayogikeun kodeu verifikasi anu langkung kompak pikeun variabel otomatis, anu ngirangan konsumsi mémori file anu tiasa dieksekusi anu dipariksa;
  • Ningkatkeun kaluaran dina "-fopt-inpo» (inpormasi lengkep ngeunaan optimasi tambihan). Ditambahkeun awalan anyar "dioptimalkeun" sareng "lasut", salian ti awalan "catetan" anu sayogi sateuacana. Katambah kaluaran inpormasi ngeunaan pembuatan kaputusan ngeunaan inline-unfolding sareng vectorization siklus;
  • Ditambahkeun pilihan "-fsave-optimization-record", lamun dieusian, GCC nyimpen file SRCFILE.opt-record.json.gz kalawan pedaran kaputusan ngeunaan pamakéan optimizations tangtu. Pilihan anyar béda ti mode "-fopt-info" ku kaasup metadata tambahan, kayaning informasi ngeunaan profil na ranté inline;
  • Ditambahkeun pilihan "-fipa-stack-alignment" jeung "-fipa-reference-addressable" pikeun ngadalikeun tumpukan alignment sarta pamakéan mode alamat (tulis-hijina atawa baca-pasti) pikeun variabel statik salila optimizations interprocedural;
  • Fungsi diwangun-di anyar diwanohkeun pikeun ngadalikeun atribut ngariung ogé paripolah patali prediksi cabang jeung palaksanaan instruksi spekulatif: "__builtin_has_attribute","__builtin_expect_with_probability"Jeung"__builtin_speculation_safe_value". A atribut anyar geus ditambahkeun pikeun fungsi, variabel jeung tipe salinan;
  • Pangrojong pinuh pikeun input/output asinkron geus dilaksanakeun pikeun basa Fortran;
  • Rojongan pikeun platform Solaris 10 (*-*-solaris2.10) sareng Cell / BE (Cell Broadband Engine SPU) parantos dicabut sareng bakal dipiceun dina sékrési utama salajengna. Rojongan pikeun arsitéktur Armv2, Armv3, Armv5 sareng Armv5E parantos dileungitkeun. Rojongan pikeun Intel MPX (Memori Protection Extensions) geus dieureunkeun.

sumber: opennet.ru

Tambahkeun komentar