Keluaran suite pengkompil LLVM 11.0

Selepas enam bulan pembangunan dibentangkan keluaran projek LLVM 11.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.

Perubahan utama dalam keluaran baharu ialah kemasukan Flank, bahagian hadapan untuk bahasa Fortran. Flang menyokong Fortran 2018, OpenMP 4.5 dan OpenACC 3.0, tetapi pembangunan projek itu masih belum selesai dan bahagian hadapan terhad kepada penghuraian kod dan menyemak ketepatan. Penjanaan kod perantaraan LLVM belum lagi disokong dan untuk menjana fail boleh laku, kod kanonik dijana dan dihantar kepada pengkompil Fortran luaran.

Penambahbaikan dalam Clang 11.0:

  • Menambah keupayaan untuk memulihkan pokok sintaks abstrak (AST) untuk kod C++ yang rosak, yang boleh digunakan untuk membantu mendiagnosis ralat dan menyediakan maklumat tambahan kepada utiliti luaran seperti clang-tidy dan clangd. Ciri ini didayakan secara lalai untuk kod C++ dan dikawal melalui pilihan "-Xclang -f[no-]recovery-ast".
  • Menambah mod diagnostik baharu:
    • "-Wpointer-to-int-cast" ialah sekumpulan amaran tentang menghantar penunjuk kepada int jenis integer yang tidak menampung semua nilai yang mungkin.
    • "-Wuninitialized-const-reference" - amaran tentang menghantar pembolehubah tidak diinisialisasi dalam parameter fungsi yang menerima hujah rujukan dengan atribut "const".
    • "-Wimplicit-const-int-float-conversion" - didayakan secara lalai amaran tentang penukaran tersirat pemalar sebenar kepada jenis integer.
  • Untuk platform ARM, fungsi C terbina dalam pengkompil disediakan (Intrinsik), digantikan dengan arahan vektor yang cekap Arm v8.1-M MVE dan CDE. Fungsi yang tersedia ditakrifkan dalam fail pengepala arm_mve.h dan arm_cde.h.
  • Ditambah satu set jenis integer lanjutan _ExtInt(N), membolehkan anda mencipta jenis yang bukan gandaan kuasa dua, yang boleh diproses dengan cekap pada FPGA/HLS. Sebagai contoh, _ExtInt(7) mentakrifkan jenis integer yang terdiri daripada 7 bit.
  • Menambahkan makro yang mentakrifkan sokongan untuk fungsi C terbina dalam berdasarkan arahan ARM SVE (Scalable Vector Extension):
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __CIRI_LENGAN_SVE_MATMUL_FP32, __CIRI_LENGAN_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __CIRI_ARM_SVE2_SM4. Sebagai contoh, makro __ARM_FEATURE_SVE ditakrifkan apabila menjana kod AArch64 dengan menetapkan pilihan baris arahan "-march=armv8-a+sve".

  • Bendera "-O" kini dikenal pasti dengan mod pengoptimuman "-O1" dan bukannya "-O2".
  • Menambah bendera pengkompil baharu:
    • "-fstack-clash-protection" - membolehkan perlindungan terhadap persimpangan timbunan dan timbunan.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - membenarkan anda memilih mod pengendali pengecualian untuk nombor titik terapung.
    • "-ffp-model={precise,strict,fast}" - Memudahkan akses kepada satu siri pilihan khusus untuk nombor titik terapung.
    • "-fpch-codegen" dan "-fpch-debuginfo" untuk menjana pengepala prapenyusun (PCH) dengan fail objek berasingan untuk kod dan info debug.
    • "-fsanitize-coverage-allowlist" dan "-fsanitize-coverage-blocklist" untuk menyemak liputan menguji senarai putih dan hitam.
    • β€œ-mtls-size={12,24,32,48}” untuk memilih saiz TLS (thread-local storage).
    • "-menable-experimental-extension" untuk mendayakan sambungan RISC-V percubaan.
  • Mod lalai untuk C ialah "-fno-common", yang membolehkan akses yang lebih cekap kepada pembolehubah global pada beberapa platform.
  • Cache modul lalai telah dialihkan dari /tmp ke direktori ~/.cache. Untuk mengatasi, anda boleh menggunakan bendera "-fmodules-cache-path=".
  • Standard bahasa C lalai telah dikemas kini daripada gnu11 kepada gnu17.
  • Menambah sokongan awal untuk sambungan GNU C "asm sebarisΒ»untuk menambah sisipan pemasang. Sambungan masih dianalisis, tetapi tidak diproses dalam apa-apa cara.
  • Keupayaan yang dikaitkan dengan sokongan OpenCL dan CUDA telah diperluaskan. Menambah sokongan untuk diagnostik blok OpenCL 2.0 dan melaksanakan ciri OpenMP 5.0 baharu.
  • Menambahkan pilihan IndentExternBlock kepada utiliti format denting untuk penjajaran dalam blok "C" dan "C++" luaran.
  • Penganalisis statik telah meningkatkan pengendalian pembina yang diwarisi dalam C++. Menambah semakan baharu alpha.core.C11Lock dan alpha.fuchsia.Lock untuk menyemak kunci, alpha.security.cert.pos.34c untuk mengesan penggunaan putenv, webkit.NoUncountedMemberChecker dan webkit.RefCntblBaseVirtualDtor yang tidak selamat untuk mengesan masalah dengan jenis yang tidak boleh dikira, alpha .cplusplus .SmartPtr untuk menyemak penyahrujukan penunjuk pintar nol.
  • Dalam linter clang-kemas tambah sebahagian besar cek baharu.
  • Pelayan caching clangd (Clang Server) telah meningkatkan prestasi dan menambah keupayaan diagnostik baharu.

Utama inovasi LLVM 11.0:

  • Sistem binaan telah ditukar kepada menggunakan Python 3. Jika Python 3 tidak tersedia, adalah mungkin untuk melancarkan semula menggunakan Python 2.
  • Bahagian hadapan dengan pengkompil untuk bahasa Go (llgo) dikecualikan daripada keluaran, yang mungkin disusun semula pada masa hadapan.
  • Atribut vektor-fungsi-abi-varian telah ditambahkan pada perwakilan perantaraan (IR) untuk menerangkan pemetaan antara fungsi skalar dan vektor untuk mengvektorkan panggilan. Daripada llvm::VectorType terdapat dua jenis vektor berasingan llvm::FixedVectorType dan llvm::ScalableVectorType.
  • Percabangan berdasarkan nilai udef dan menghantar nilai undef kepada fungsi perpustakaan standard diiktiraf sebagai tingkah laku yang tidak ditentukan. DALAM
    memset/memcpy/memmove membenarkan penunjuk undef lulus, tetapi jika parameter dengan saiz adalah sifar.

  • LLJIT telah menambah sokongan untuk melaksanakan pemulaan statik melalui kaedah LLJIT::initialize dan LLJIT::deinitialize. Keupayaan untuk menambah perpustakaan statik pada JITdylib menggunakan kelas StaticLibraryDefinitionGenerator telah dilaksanakan. Menambah C API untuk ORCv2 (API untuk membina penyusun JIT).
  • Sokongan untuk pemproses Cortex-A64, Cortex-A34, Cortex-A77 dan Cortex-X78 telah ditambahkan pada bahagian belakang untuk seni bina AArch1. Pelanjutan ARMv8.2-BF16 (BFloat16) dan ARMv8.6-A yang dilaksanakan, termasuk RMv8.6-ECV (Penmayaran Kaunter Dipertingkatkan), ARMv8.6-FGT (Perangkap Berbutir Halus), ARMv8.6-AMU (pemayaan Pemantauan Aktiviti) dan ARMv8.0-DGH (Petunjuk pengumpulan data). Keupayaan untuk menjana kod untuk pengikatan fungsi terbina dalam kepada arahan vektor SVE disediakan.
  • Sokongan untuk pemproses Cortex-M55, Cortex-A77, Cortex-A78 dan Cortex-X1 telah ditambahkan pada bahagian belakang untuk seni bina ARM. Sambungan dilaksanakan
    Armv8.6-A Matriks Darab dan RMv8.2-AA32BF16 BFloat16.

  • Sokongan untuk penjanaan kod untuk pemproses POWER10 telah ditambahkan pada bahagian belakang untuk seni bina PowerPC. Pengoptimuman gelung telah diperluaskan dan sokongan titik terapung telah dipertingkatkan.
  • Bahagian belakang untuk seni bina RISC-V membenarkan penerimaan tampalan yang menyokong set arahan lanjutan eksperimen yang belum lagi diluluskan secara rasmi.
  • Bahagian belakang untuk seni bina AVR telah dipindahkan daripada kategori eksperimen kepada stabil, termasuk dalam pengedaran asas.
  • Bahagian belakang untuk seni bina x86 menyokong arahan Intel AMX dan TSXLDTRK. Perlindungan tambahan terhadap serangan LVI (Suntikan Nilai Muatan), dan juga melaksanakan mekanisme Penindasan Kesan Sampingan Pelaksanaan Spekulatif umum untuk menyekat serangan yang disebabkan oleh pelaksanaan operasi spekulatif pada CPU.
  • Di bahagian belakang untuk seni bina SystemZ, sokongan untuk MemorySanitizer dan LeakSanitizer telah ditambah.
  • Menambah sokongan untuk fail pengepala dengan pemalar matematik kepada Libc++ .
  • Dikembangkan Keupayaan penghubung LLD. Sokongan yang dipertingkatkan untuk format ELF, termasuk pilihan tambahan "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- single-modul", "-unique", "-rosegment", "-threads=N". Menambahkan pilihan "--time-trace" untuk menyimpan jejak pada fail, yang kemudiannya boleh dianalisis melalui antara muka chrome://tracing dalam Chrome.

Sumber: opennet.ru

Tambah komen