Keluaran suite pengkompil LLVM 10.0

Selepas enam bulan pembangunan dibentangkan keluaran projek LLVM 10.0 β€” Alat serasi GCC (penyusun, pengoptimum dan penjana kod), menyusun atur cara ke dalam kod bit perantaraan arahan maya seperti RISC (mesin maya peringkat rendah dengan sistem pengoptimuman berbilang peringkat). Pseudokod yang dihasilkan boleh ditukar menggunakan pengkompil JIT ke dalam arahan mesin secara langsung pada masa pelaksanaan program.

Ciri baharu dalam LLVM 10.0 termasuk sokongan untuk Konsep C++, tidak lagi menjalankan Clang sebagai proses berasingan, sokongan untuk semakan CFG (pengawal aliran kawalan) untuk Windows dan sokongan untuk keupayaan CPU baharu.

Penambahbaikan dalam Clang 10.0:

  • Menambah sokongan untuk "konsep", sambungan templat C++ yang akan disertakan dalam standard seterusnya, dengan nama kod C++2a (dihidupkan oleh bendera -std=c++2a).
    Konsep membolehkan anda mentakrifkan satu set keperluan parameter templat yang, pada masa penyusunan, mengehadkan set hujah yang boleh diterima sebagai parameter templat. Konsep boleh digunakan untuk mengelakkan ketidakkonsistenan logik antara sifat jenis data yang digunakan dalam templat dan sifat jenis data parameter input.

    templat
    konsep EqualityComparable = memerlukan(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Secara lalai, pelancaran proses berasingan (β€œclang -cc1”) di mana kompilasi dilakukan dihentikan. Penyusunan kini dilakukan dalam proses utama, dan pilihan "-fno-integrated-cc1" boleh digunakan untuk memulihkan tingkah laku lama.
  • Mod diagnostik baharu:
    • "-Wc99-designator" dan "-Wreorder-init-list" memberi amaran terhadap penggunaan pemula C99 dalam mod C++ dalam kes di mana ia betul dalam C99 tetapi tidak dalam C++20.
    • "-Wsizeof-array-div" - menangkap situasi seperti "int arr[10]; …sizeof(arr) / sizeof(short)…” (sepatutnya β€œsizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - memberi amaran terhadap penggunaan binaan seperti penggunaan operator "^" (xor) dalam operasi yang boleh dikelirukan dengan eksponen (2^16).
    • "-Wfinal-dtor-non-final-class" - memberi amaran tentang kelas yang tidak ditandakan dengan penentu "final", tetapi mempunyai pemusnah dengan atribut "final".
    • "-Wtautological-bitwise-compare" ialah sekumpulan amaran untuk mendiagnosis perbandingan tautologi antara operasi bitwise dan pemalar, dan untuk mengenal pasti perbandingan sentiasa benar di mana operasi OR bitwise digunakan pada nombor bukan negatif.
    • "-Wbitwise-conditional-parentheses" memberi amaran tentang masalah apabila mencampurkan operator logik DAN (&) dan OR (|) dengan operator bersyarat (?:).
    • "-Wmisleading-indentation" ialah analog cek dengan nama yang sama daripada GCC, yang memberi amaran tentang ungkapan inden seolah-olah ia adalah sebahagian daripada blok if/else/for/while, tetapi sebenarnya ia tidak termasuk dalam blok ini .
    • Apabila menentukan "-Wextra", semakan "-Wdeprecated-copy" didayakan, memberi amaran tentang penggunaan pembina
      "move" dan "copy" dalam kelas dengan definisi pemusnah yang jelas.

    • Semakan "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" telah diperluaskan.
    • Semakan "-Wbitwise-op-parentheses" dan "-Wlogical-op-parentheses" dilumpuhkan secara lalai.
  • Dalam kod C dan C++, operasi aritmetik penunjuk hanya dibenarkan dalam tatasusunan. Pembersih Gelagat Tidak Ditakrifkan dalam mod "-fsanitize=pointer-overflow" kini menangkap kes seperti menambah offset bukan sifar pada penuding nol atau mencipta penuding nol apabila menolak integer daripada penuding bukan nol.
  • Mod "-fsanitize=implicit-conversion" (Pembersih Penukaran Tersirat) disesuaikan untuk mengenal pasti masalah dengan operasi kenaikan dan pengurangan untuk jenis dengan saiz bit lebih kecil daripada jenis "int".
  • Apabila memilih seni bina sasaran x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" dan "-march=cooperlake" secara lalai dalam vektor kod telah berhenti menggunakan daftar zmm 512-bit, kecuali untuk petunjuk langsung mereka dalam kod sumber. Sebabnya ialah kekerapan CPU berkurangan apabila melakukan operasi 512-bit, yang boleh menjejaskan prestasi keseluruhan secara negatif. Untuk menukar tingkah laku baharu, pilihan "-mprefer-vector-width=512" disediakan.
  • Tingkah laku bendera "-flax-vector-conversions" adalah serupa dengan GCC: penukaran bit vektor tersirat antara integer dan vektor titik terapung adalah dilarang. Untuk menghapuskan had ini, adalah dicadangkan untuk menggunakan bendera
    "-flax-vector-conversions=all" yang merupakan lalai.

  • Sokongan yang lebih baik untuk CPU MIPS keluarga Octeon. Menambahkan "octeon+" pada senarai jenis CPU yang sah.
  • Apabila memasang ke dalam kod perantaraan WebAssembly, pengoptimum wasm-opt dipanggil secara automatik, jika tersedia dalam sistem.
  • Untuk sistem berdasarkan seni bina RISC-V, penggunaan daftar yang menyimpan nilai titik terapung dibenarkan dalam blok bersyarat bagi sisipan sebaris pemasang.
  • Menambah bendera pengkompil baharu: "-fgnuc-version" untuk menetapkan nilai versi untuk "__GNUC__" dan makro yang serupa; "-fmacro-prefix-map=OLD=NEW" untuk menggantikan awalan direktori LAMA dengan BARU dalam makro seperti "__FILE__"; "-fpatchable-function-entry=N[,M]" untuk menjana sejumlah arahan NOP sebelum dan selepas titik masuk fungsi. Untuk RISC-V
    menambah sokongan untuk bendera "-ffixed-xX", "-mcmodel=medany" dan "-mcmodel=medlow".

  • Menambah sokongan untuk atribut '__attribute__((target("perlindungan cawangan=..."))), yang kesannya serupa dengan pilihan -perlindungan-mbranch.
  • Pada platform Windows, apabila menentukan bendera "-cfguard", penggantian semakan integriti aliran pelaksanaan (Pengawal Aliran Kawalan) untuk panggilan fungsi tidak langsung dilaksanakan. Untuk melumpuhkan penggantian cek, anda boleh menggunakan bendera "-cfguard-nochecks" atau pengubah suai "__declspec(guard(nocf))".
  • Tingkah laku atribut gnu_inline adalah serupa dengan GCC dalam kes di mana ia digunakan tanpa kata kunci "luar".
  • Keupayaan yang dikaitkan dengan sokongan OpenCL dan CUDA telah diperluaskan. Menambah sokongan untuk ciri OpenMP 5.0 baharu.
  • Pilihan Standard telah ditambahkan pada utiliti format dentang, yang membolehkan anda menentukan versi standard C++ yang digunakan semasa menghurai dan memformat kod (Terbaru, Auto, c++03, c++11, c++14, c++17, c++20).
  • Pemeriksaan baharu telah ditambahkan pada penganalisis statik: alpha.cplusplus.PlacementNew untuk menentukan sama ada terdapat ruang storan yang mencukupi, fuchsia.HandleChecker untuk mengesan kebocoran yang berkaitan dengan pengendali Fuchsia, security.insecureAPI.decodeValueOfObjCType untuk mengesan potensi limpahan penimbal apabila menggunakan [NSCoder decodeValueypeOf :pada:] .
  • Pembersih Tingkah Laku Tidak Ditakrifkan (UBSan) telah memperluaskan semakan limpahan penudingnya untuk menangkap penggunaan offset bukan sifar pada penunjuk NULL atau penambahan offset penunjuk NULL yang terhasil.
  • Dalam linter clang-kemas tambah sebahagian besar cek baharu.

Utama inovasi LLVM 10.0:

  • Kepada rangka kerja Atributor Pengoptimuman antara prosedur dan penganalisis baharu telah ditambah. Keadaan 19 atribut berbeza diramalkan, termasuk 12 atribut 12 LLVM IR dan 7 atribut abstrak seperti liveness.
  • Menambah fungsi matematik matriks baharu yang dibina ke dalam pengkompil (Intrinsik), yang digantikan dengan arahan vektor yang cekap semasa penyusunan.
  • Banyak penambahbaikan telah dibuat pada bahagian belakang untuk seni bina X86, AArch64, ARM, SystemZ, MIPS, AMDGPU dan PowerPC. Menambah sokongan CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 dan Neoverse N1. Untuk ARMv8.1-M, ​​​​proses penjanaan kod telah dioptimumkan (contohnya, sokongan untuk gelung dengan overhed minimum telah muncul) dan sokongan untuk autovektorisasi telah ditambah menggunakan sambungan MVE. Sokongan CPU MIPS Octeon yang dipertingkatkan. Untuk PowerPC, vektorisasi subrutin matematik menggunakan perpustakaan MASSV (Mathematical Acceleration SubSystem) didayakan, penjanaan kod dipertingkatkan dan akses memori daripada gelung dioptimumkan. Untuk x86, pengendalian jenis vektor v2i32, v4i16, v2i16, v8i8, v4i8 dan v2i8 telah diubah.

  • Penjana kod yang dipertingkatkan untuk WebAssembly. Menambah sokongan untuk arahan TLS (Thread-Local Storage) dan atomic.fence. Sokongan SIMD telah diperluaskan dengan ketara. Fail objek WebAssembly kini mempunyai keupayaan untuk menggunakan tandatangan fungsi berbilang nilai.
  • Penganalisis digunakan semasa memproses gelung MemoriSSA, yang membolehkan anda menentukan kebergantungan antara operasi memori yang berbeza. MemorySSA boleh mengurangkan masa kompilasi dan pelaksanaan atau boleh digunakan sebagai ganti AliasSetTracker tanpa kehilangan prestasi.
  • Penyahpepijat LLDB telah meningkatkan sokongan dengan ketara untuk format DWARF v5. Sokongan yang lebih baik untuk membina dengan MinGW
    dan menambahkan keupayaan awal untuk menyahpepijat executable Windows untuk seni bina ARM dan ARM64. Menambah penerangan tentang pilihan yang ditawarkan semasa autolengkap input dengan menekan tab.

  • Dikembangkan Keupayaan penghubung LLD. Sokongan yang dipertingkatkan untuk format ELF, termasuk keserasian penuh templat glob dengan pemaut GNU, menambah sokongan untuk bahagian nyahpepijat termampat ".zdebug", menambah sifat PT_GNU_PROPERTY untuk menentukan bahagian .note.gnu.property (boleh digunakan dalam Linux masa hadapan biji),
    Mod "-z noseparate-code", "-z separate-code" dan "-z separate-loadable-segments" telah dilaksanakan. Sokongan yang lebih baik untuk MinGW dan WebAssembly.

Sumber: opennet.ru

Tambah komen