Rilis paket kompiler LLVM 11.0

Setelah enam bulan pengembangan disajikan rilis proyek LLVM 11.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.

Perubahan utama dalam rilis baru ini adalah penyertaan Mengapit, antarmuka untuk bahasa Fortran. Flang mendukung Fortran 2018, OpenMP 4.5 dan OpenACC 3.0, tetapi pengembangan proyek belum selesai dan front-end terbatas pada penguraian kode dan pemeriksaan kebenarannya. Pembuatan kode perantara LLVM belum didukung dan untuk menghasilkan file yang dapat dieksekusi, kode kanonik dibuat dan diteruskan ke kompiler Fortran eksternal.

Perbaikan di Dentang 11.0:

  • Menambahkan kemampuan untuk memulihkan pohon sintaksis abstrak (AST) untuk kode C++ yang rusak, yang dapat digunakan untuk membantu mendiagnosis kesalahan dan memberikan informasi tambahan ke utilitas eksternal seperti clang-tidy dan clangd. Fitur ini diaktifkan secara default untuk kode C++ dan dikontrol melalui opsi "-Xclang -f[no-]recovery-ast".
  • Menambahkan mode diagnostik baru:
    • β€œ-Wpointer-to-int-cast” adalah sekelompok peringatan tentang casting pointer ke tipe integer int yang tidak mengakomodasi semua nilai yang mungkin.
    • β€œ-Wuninitialized-const-reference” - peringatan tentang meneruskan variabel yang tidak diinisialisasi dalam parameter fungsi yang menerima argumen referensi dengan atribut β€œconst”.
    • "-Wimplicit-const-int-float-conversion" - diaktifkan secara default peringatan tentang konversi implisit dari konstanta nyata ke tipe integer.
  • Untuk platform ARM, fungsi C yang ada di dalam kompiler disediakan (intrinsik), digantikan oleh instruksi vektor yang efisien Arm v8.1-M MVE dan CDE. Fungsi yang tersedia ditentukan dalam file header arm_mve.h dan arm_cde.h.
  • Ditambahkan satu set tipe integer yang diperluas _ExtInt(N), memungkinkan Anda membuat tipe yang bukan kelipatan dua, yang dapat diproses secara efisien di FPGA/HLS. Misalnya, _ExtInt(7) mendefinisikan tipe integer yang terdiri dari 7 bit.
  • Menambahkan makro yang menentukan dukungan untuk fungsi C bawaan berdasarkan instruksi ARM SVE (Scalable Vector Extension):
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Misalnya, makro __ARM_FEATURE_SVE ditentukan saat membuat kode AArch64 dengan mengatur opsi baris perintah "-march=armv8-a+sve".

  • Bendera "-O" sekarang diidentifikasi dengan mode optimasi "-O1" dan bukan "-O2".
  • Menambahkan flag compiler baru:
    • "-fstack-clash-protection" - mengaktifkan perlindungan terhadap persimpangan tumpukan dan tumpukan.
    • "-ffp-Exception-behavior={ignore,maytrap,strict}" - memungkinkan Anda memilih mode pengendali pengecualian untuk bilangan floating point.
    • "-ffp-model={precise,strict,fast}" - Menyederhanakan akses ke serangkaian opsi khusus untuk bilangan floating point.
    • "-fpch-codegen" dan "-fpch-debuginfo" untuk menghasilkan header yang telah dikompilasi (PCH) dengan file objek terpisah untuk kode dan debuginfo.
    • β€œ-fsanitize-coverage-allowlist” dan β€œ-fsanitize-coverage-blocklist” untuk memeriksa pengujian cakupan daftar putih dan hitam.
    • β€œ-mtls-size={12,24,32,48}” untuk memilih ukuran TLS (penyimpanan lokal thread).
    • "-menable-experimental-extension" untuk mengaktifkan ekstensi eksperimental RISC-V.
  • Mode default untuk C adalah "-fno-common", yang memungkinkan akses lebih efisien ke variabel global pada beberapa platform.
  • Cache modul default telah dipindahkan dari /tmp ke direktori ~/.cache. Untuk menggantinya, Anda dapat menggunakan flag β€œ-fmodules-cache-path=”.
  • Standar bahasa C default telah diperbarui dari gnu11 ke gnu17.
  • Menambahkan dukungan awal untuk ekstensi GNU C "asm sebarisΒ» untuk menambahkan sisipan assembler. Ekstensi tersebut masih dianalisis, tetapi belum diproses dengan cara apa pun.
  • Kemampuan yang terkait dengan dukungan OpenCL dan CUDA telah diperluas. Menambahkan dukungan untuk diagnostik blok OpenCL 2.0 dan mengimplementasikan fitur OpenMP 5.0 baru.
  • Menambahkan opsi IndentExternBlock ke utilitas format dentang untuk penyelarasan dalam blok "C" eksternal dan "C++" eksternal.
  • Penganalisis statis telah meningkatkan penanganan konstruktor yang diwariskan di C++. Menambahkan pemeriksaan baru alpha.core.C11Lock dan alpha.fuchsia.Lock untuk memeriksa kunci, alpha.security.cert.pos.34c untuk mendeteksi penggunaan putenv yang tidak aman, webkit.NoUncountedMemberChecker dan webkit.RefCntblBaseVirtualDtor untuk mendeteksi masalah dengan tipe yang tak terhitung, alpha .cplusplus .SmartPtr untuk memeriksa dereferensi penunjuk cerdas nol.
  • Dalam linter dentang rapi ditambahkan sebagian besar cek baru.
  • Server caching clangd (Server Dentang) telah meningkatkan kinerja dan menambahkan kemampuan diagnostik baru.

Utama inovasi LLVM 11.0:

  • Sistem pembangunan telah dialihkan menggunakan Python 3. Jika Python 3 tidak tersedia, dimungkinkan untuk melakukan rollback menggunakan Python 2.
  • Front end dengan kompiler untuk bahasa Go (llgo) tidak termasuk dalam rilis, yang mungkin akan direstrukturisasi di masa mendatang.
  • Atribut fungsi-vektor-abi-varian telah ditambahkan ke representasi perantara (IR) untuk mendeskripsikan pemetaan antara fungsi skalar dan vektor untuk membuat panggilan menjadi vektor. Dari llvm::VectorType ada dua tipe vektor terpisah llvm::FixedVectorType dan llvm::ScalableVectorType.
  • Percabangan berdasarkan nilai udef dan meneruskan nilai undef ke fungsi perpustakaan standar dikenali sebagai perilaku tidak terdefinisi. DI DALAM
    memset/memcpy/memmove memungkinkan meneruskan pointer undef, tetapi jika parameter dengan ukuran nol.

  • LLJIT telah menambahkan dukungan untuk melakukan inisialisasi statis melalui metode LLJIT::initialize dan LLJIT::deinitialize. Kemampuan untuk menambahkan perpustakaan statis ke JITDylib menggunakan kelas StaticLibraryDefinitionGenerator telah diterapkan. Menambahkan C API untuk ORCv2 (API untuk membangun kompiler JIT).
  • Dukungan untuk prosesor Cortex-A64, Cortex-A34, Cortex-A77 dan Cortex-X78 telah ditambahkan ke backend untuk arsitektur AArch1. Menerapkan ekstensi ARMv8.2-BF16 (BFloat16) dan ARMv8.6-A, termasuk RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (virtualisasi Monitor Aktivitas) dan ARMv8.0-DGH (Petunjuk pengumpulan data). Kemampuan untuk menghasilkan kode untuk pengikatan fungsi bawaan ke instruksi vektor SVE disediakan.
  • Dukungan untuk prosesor Cortex-M55, Cortex-A77, Cortex-A78 dan Cortex-X1 telah ditambahkan ke backend untuk arsitektur ARM. Ekstensi diterapkan
    Perkalian Matriks Armv8.6-A dan RMv8.2-AA32BF16 BFloat16.

  • Dukungan untuk pembuatan kode untuk prosesor POWER10 telah ditambahkan ke backend arsitektur PowerPC. Optimalisasi loop telah diperluas dan dukungan floating point telah ditingkatkan.
  • Backend untuk arsitektur RISC-V memungkinkan penerimaan patch yang mendukung rangkaian instruksi eksperimental yang diperluas yang belum disetujui secara resmi.
  • Backend untuk arsitektur AVR telah dipindahkan dari kategori eksperimental ke stabil, termasuk dalam distribusi dasar.
  • Backend untuk arsitektur x86 mendukung instruksi Intel AMX dan TSXLDTRK. Menambahkan perlindungan terhadap serangan LVI (Load Value Injection), dan juga mengimplementasikan mekanisme Penekanan Efek Samping Eksekusi Spekulatif umum untuk memblokir serangan yang disebabkan oleh eksekusi operasi spekulatif pada CPU.
  • Di backend arsitektur SystemZ, dukungan untuk MemorySanitizer dan LeakSanitizer telah ditambahkan.
  • Menambahkan dukungan untuk file header dengan konstanta matematika ke Libc++ .
  • Diperluas Kemampuan penghubung LLD. Peningkatan dukungan untuk format ELF, termasuk opsi tambahan "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -tipis- modul tunggal", "-unik", "-rosegment", "-threads=N". Menambahkan opsi "--time-trace" untuk menyimpan jejak ke file, yang kemudian dapat dianalisis melalui antarmuka chrome://tracing di Chrome.

Sumber: opennet.ru

Tambah komentar