Rilis paket kompiler LLVM 10.0

Setelah enam bulan pengembangan disajikan rilis proyek LLVM 10.0 β€” Alat yang kompatibel dengan GCC (kompiler, pengoptimal, dan pembuat kode), mengkompilasi program menjadi bitcode perantara dari instruksi virtual mirip RISC (mesin virtual tingkat rendah dengan sistem pengoptimalan multi-level). Pseudocode yang dihasilkan dapat diubah menggunakan kompiler JIT menjadi instruksi mesin secara langsung pada saat eksekusi program.

Fitur baru di LLVM 10.0 mencakup dukungan untuk Konsep C++, tidak lagi menjalankan Clang sebagai proses terpisah, dukungan untuk pemeriksaan CFG (control flow guard) untuk Windows, dan dukungan untuk kemampuan CPU baru.

Perbaikan di Dentang 10.0:

  • Menambahkan dukungan untuk "konsep", ekstensi templat C++ yang akan disertakan dalam standar berikutnya, dengan nama kode C++2a (diaktifkan oleh flag -std=c++2a).
    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.

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

  • Secara default, peluncuran proses terpisah (β€œclang -cc1”) di mana kompilasi dilakukan dihentikan. Kompilasi sekarang dilakukan di proses utama, dan opsi "-fno-integrated-cc1" dapat digunakan untuk memulihkan perilaku lama.
  • Mode diagnostik baru:
    • "-Wc99-designator" dan "-Wreorder-init-list" memperingatkan agar tidak menggunakan inisialisasi C99 dalam mode C++ jika inisialisasi tersebut benar di C99 tetapi tidak di C++20.
    • "-Wsizeof-array-div" - menangkap situasi seperti "int arr[10]; …sizeof(arr) / sizeof(short)…” (seharusnya β€œsizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - memperingatkan terhadap penggunaan konstruksi seperti penggunaan operator "^" (xor) dalam operasi yang dapat dikacaukan dengan eksponensial (2^16).
    • "-Wfinal-dtor-non-final-class" - memperingatkan tentang kelas yang tidak ditandai dengan penentu "final", tetapi memiliki destruktor dengan atribut "final".
    • "-Wtautological-bitwise-compare" adalah sekelompok peringatan untuk mendiagnosis perbandingan tautologis antara operasi bitwise dan konstanta, dan untuk mengidentifikasi perbandingan yang selalu benar di mana operasi bitwise OR diterapkan pada bilangan non-negatif.
    • "-Wbitwise-conditional-parentheses" memperingatkan masalah saat mencampurkan operator logika AND (&) dan OR (|) dengan operator kondisional (?:).
    • β€œ-Wmisleading-indentation” adalah analog dari cek dengan nama yang sama dari GCC, yang memperingatkan tentang ekspresi yang menjorok ke dalam seolah-olah itu adalah bagian dari blok if/else/for/sementara, tetapi sebenarnya tidak termasuk dalam blok ini .
    • Saat menentukan "-Wextra", centang "-Wdeprecated-copy" diaktifkan, memperingatkan tentang penggunaan konstruktor
      "pindahkan" dan "salin" di kelas dengan definisi destruktor eksplisit.

    • Pemeriksaan "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-lysis" telah diperluas.
    • Pemeriksaan "-Wbitwise-op-parentheses" dan "-Wlogical-op-parentheses" dinonaktifkan secara default.
  • Dalam kode C dan C++, operasi aritmatika pointer hanya diperbolehkan dalam array. Sanitizer Perilaku Tidak Terdefinisi dalam mode "-fsanitize=pointer-overflow" sekarang menangkap kasus seperti menambahkan offset bukan nol ke penunjuk nol atau membuat penunjuk nol saat mengurangkan bilangan bulat dari penunjuk bukan nol.
  • Mode "-fsanitize=implicit-conversion" (Pembersih Konversi Implisit) diadaptasi untuk mengidentifikasi masalah dengan operasi penambahan dan pengurangan untuk tipe dengan ukuran bit lebih kecil daripada tipe "int".
  • Saat memilih arsitektur target x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" dan "-march=cooperlake" secara default dalam vektorisasi kode telah berhenti menggunakan register zmm 512-bit, kecuali untuk indikasi langsungnya dalam kode sumber. Alasannya adalah frekuensi CPU menurun saat menjalankan operasi 512-bit, yang dapat berdampak buruk pada kinerja secara keseluruhan. Untuk mengubah perilaku baru, opsi "-mprefer-vector-width=512" disediakan.
  • Perilaku flag "-flax-vector-conversions" mirip dengan GCC: konversi bit vektor implisit antara vektor integer dan floating-point dilarang. Untuk menghilangkan batasan ini, diusulkan untuk menggunakan bendera
    "-flax-vector-conversions=all" yang merupakan default.

  • Peningkatan dukungan untuk CPU MIPS dari keluarga Octeon. Menambahkan "octeon+" ke daftar jenis CPU yang valid.
  • Saat dirakit ke dalam kode perantara WebAssembly, pengoptimal wasm-opt dipanggil secara otomatis, jika tersedia di sistem.
  • Untuk sistem berdasarkan arsitektur RISC-V, penggunaan register yang menyimpan nilai floating point diperbolehkan dalam blok bersyarat dari sisipan inline assembler.
  • Menambahkan tanda kompiler baru: "-fgnuc-version" untuk menyetel nilai versi untuk "__GNUC__" dan makro serupa; "-fmacro-prefix-map=OLD=NEW" untuk mengganti awalan direktori OLD dengan NEW di makro seperti "__FILE__"; "-fpatchable-function-entry=N[,M]" untuk menghasilkan sejumlah instruksi NOP tertentu sebelum dan sesudah titik masuk fungsi. Untuk RISC-V
    menambahkan dukungan untuk flag "-ffixed-xX", "-mcmodel=medany" dan "-mcmodel=medlow".

  • Menambahkan dukungan untuk atribut '__attribute__((target(β€œbranch-protection=..."))) yang efeknya mirip dengan opsi -perlindungan cabang.
  • Pada platform Windows, saat menentukan tanda β€œ-cfguard”, penggantian pemeriksaan integritas aliran eksekusi (Control Flow Guard) untuk pemanggilan fungsi tidak langsung diterapkan. Untuk menonaktifkan substitusi cek, Anda dapat menggunakan flag β€œ-cfguard-nochecks” atau pengubah β€œ__declspec(guard(nocf))”.
  • Perilaku atribut gnu_inline mirip dengan GCC jika digunakan tanpa kata kunci "extern".
  • Kemampuan yang terkait dengan dukungan OpenCL dan CUDA telah diperluas. Menambahkan dukungan untuk fitur OpenMP 5.0 baru.
  • Opsi Standar telah ditambahkan ke utilitas format dentang, yang memungkinkan Anda menentukan versi standar C++ yang digunakan saat menguraikan dan memformat kode (Terbaru, Otomatis, c++03, c++11, c++14, c++17, c++20 ).
  • Pemeriksaan baru telah ditambahkan ke penganalisis statis: alpha.cplusplus.PlacementNew untuk menentukan apakah ada cukup ruang penyimpanan, fuchsia.HandleChecker untuk mendeteksi kebocoran yang terkait dengan penangan Fuchsia, security.insecureAPI.decodeValueOfObjCType untuk mendeteksi potensi buffer overflow saat menggunakan [NSCoder decodeValueOfObjCType :pada:] .
  • Sanitizer Perilaku Tidak Terdefinisi (UBSan) telah memperluas pemeriksaan luapan penunjuknya untuk menangkap penerapan offset bukan nol ke penunjuk NULL atau hasil penambahan offset penunjuk NULL.
  • Dalam linter dentang rapi ditambahkan sebagian besar cek baru.

Utama inovasi LLVM 10.0:

  • Untuk kerangka Atributor Pengoptimalan dan penganalisis antarprosedural baru telah ditambahkan. Keadaan dari 19 atribut berbeda diprediksi, termasuk 12 atribut, 12 LLVM IR dan 7 atribut abstrak seperti keaktifan.
  • Menambahkan fungsi matematika matriks baru yang dibangun ke dalam kompiler (intrinsik), yang digantikan oleh instruksi vektor yang efisien selama kompilasi.
  • Banyak perbaikan telah dilakukan pada backend untuk arsitektur X86, AArch64, ARM, SystemZ, MIPS, AMDGPU dan PowerPC. Menambahkan dukungan CPU
    Korteks-A65, Korteks-A65AE, Neoverse E1 dan Neoverse N1. Untuk ARMv8.1-M, ​​​​proses pembuatan kode telah dioptimalkan (misalnya, dukungan untuk loop dengan overhead minimal telah muncul) dan dukungan untuk vektorisasi otomatis telah ditambahkan menggunakan ekstensi MVE. Peningkatan dukungan CPU MIPS Octeon. Untuk PowerPC, vektorisasi subrutin matematika menggunakan perpustakaan MASSV (Mathematical Acceleration SubSystem) diaktifkan, pembuatan kode ditingkatkan, dan akses memori dari loop dioptimalkan. Untuk x86, penanganan vektor tipe v2i32, v4i16, v2i16, v8i8, v4i8 dan v2i8 telah diubah.

  • Generator kode yang ditingkatkan untuk WebAssembly. Menambahkan dukungan untuk instruksi TLS (Thread-Local Storage) dan atom.fence. Dukungan SIMD telah diperluas secara signifikan. File objek WebAssembly sekarang memiliki kemampuan untuk menggunakan tanda tangan fungsi multi-nilai.
  • Penganalisis digunakan saat memproses loop MemoriSSA, yang memungkinkan Anda menentukan ketergantungan antara operasi memori yang berbeda. MemorySSA dapat mengurangi waktu kompilasi dan eksekusi atau dapat digunakan sebagai pengganti AliasSetTracker tanpa kehilangan performa.
  • Debugger LLDB telah meningkatkan dukungan secara signifikan untuk format DWARF v5. Peningkatan dukungan untuk membangun dengan MinGW
    dan menambahkan kemampuan awal untuk men-debug executable Windows untuk arsitektur ARM dan ARM64. Menambahkan deskripsi opsi yang ditawarkan saat melengkapi input secara otomatis dengan menekan tab.

  • Diperluas Kemampuan penghubung LLD. Peningkatan dukungan untuk format ELF, termasuk memastikan kompatibilitas penuh templat glob dengan linker GNU, menambahkan dukungan untuk bagian debug terkompresi ".zdebug", menambahkan properti PT_GNU_PROPERTY untuk menentukan bagian .note.gnu.property (dapat digunakan di masa mendatang kernel Linux),
    Mode β€œ-z noseparate-code”, β€œ-z Separate-code” dan β€œ-z Separate-loadable-segments” telah diterapkan. Peningkatan dukungan untuk MinGW dan WebAssembly.

Sumber: opennet.ru

Tambah komentar