Ngaleupaskeun suite kompiler LLVM 11.0

Sanggeus genep bulan pangwangunan ditepikeun release proyék LVM 11.0 - Alat anu cocog sareng GCC (compilers, optimizer sareng generator kode) anu nyusun program kana bitcode perantaraan paréntah virtual sapertos RISC (mesin virtual tingkat rendah sareng sistem optimasi multi-tingkat). pseudo-kode nu dihasilkeun bisa dirobah ku JIT compiler kana parentah mesin katuhu dina waktu palaksanaan program.

Parobahan konci dina release anyar éta citakan tina flange, frontend pikeun basa Fortran. Flang ngadukung Fortran 2018, OpenMP 4.5 sareng OpenACC 3.0, tapi pamekaran proyék éta henteu acan réngsé sareng payun-tungtung dugi ka parsing kode sareng mariksa kabeneran. Generasi kode panengah LLVM henteu acan dirojong, sareng pikeun ngahasilkeun file anu tiasa dieksekusi, kode canonical dibangkitkeun sareng dikirimkeun ka kompiler Fortran éksternal.

Perbaikan dina Clang 11.0:

  • Ditambahkeun kamampuan pikeun mulangkeun tangkal sintaksis abstrak (AST) pikeun kode C ++ lepat, nu bisa dipaké pikeun mantuan nangtukeun jenis panyakitna kasalahan jeung nyadiakeun émbaran tambahan pikeun Utiliti éksternal kayaning clang-rapi na clangd. Fitur ieu diaktipkeun sacara standar pikeun kode C ++ sareng dikawasa ku pilihan "-Xclang -f [no-] recovery-ast".
  • Ditambahkeun mode diagnostik anyar:
    • "-Wpointer-to-int-cast" mangrupakeun grup warnings ngeunaan casting pointers kana tipe int integer nu teu ngandung sakabéh nilai mungkin.
    • "-Wuninitialized-const-reference" - peringatan ngeunaan ngalirkeun variabel uninitialized dina parameter fungsi nu narima argumen rujukan jeung atribut "const".
    • "-Wimplicit-const-int-float-conversion" mangrupikeun peringatan ngeunaan sacara implisit ngarobih konstanta nyata kana jinis integer, diaktipkeun sacara standar.
  • Pikeun platform ARM, fungsi C diwangun kana kompiler disadiakeun (Intrinsik) diganti ku Arm v8.1-M MVE jeung CDE instruksi vektor efisien. Fungsi sadia diartikeun dina file lulugu arm_mve.h na arm_cde.h.
  • Ditambahkeun susunan tipe integer nambahan _ExtInt (N) nu ngidinan Anjeun pikeun nyieun tipe nu teu kakalian hiji kakuatan dua, nu bisa éfisién diolah dina FPGA / HLS. contona, _ExtInt(7) nangtukeun hiji tipe integer diwangun ku 7 bit.
  • Nambahkeun macros nu nangtukeun rojongan pikeun diwangun-di fungsi C dumasar kana ARM SVE (Scalable Vector Extension) parentah:
    __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. Contona, makro __ARM_FEATURE_SVE diartikeun nalika ngahasilkeun kode AArch64 kalawan pilihan garis paréntah "-march = armv8-a + sve" set.

  • Bandéra "-O" ayeuna dicirikeun ku mode optimasi "-O1" tinimbang "-O2".
  • Nambahkeun bandéra kompiler énggal:
    • "-fstack-clash-protection" - ngamungkinkeun panyalindungan ngalawan parapatan tumpukan sareng tumpukan.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - ngidinan Anjeun pikeun milih modeu panangan iwal pikeun angka floating point.
    • "-ffp-model={precise,strict,fast}" nyederhanakeun aksés ka runtuyan pilihan husus pikeun angka floating point.
    • "-fpch-codegen" jeung "-fpch-debuginfo" pikeun ngahasilkeun lulugu precompiled (PCH) kalawan file objék misah pikeun kode jeung debuginfo.
    • "-fsanitize-coverage-allowlist" sareng "-fsanitize-coverage-blocklist" pikeun pariksa whitelist sareng uji cakupan blacklist.
    • "-mtls-size={12,24,32,48}" pikeun milih ukuran TLS (thread-local storage).
    • "-menable-experimental-extension" pikeun ngaktipkeun ekstensi RISC-V ékspérimén.
  • Sacara standar, C nganggo mode "-fno-common", anu ngamungkinkeun aksés anu langkung éfisién kana variabel global dina sababaraha platform.
  • Dipindahkeun cache modul standar tina /tmp ka ~/.cache diréktori. Anjeun tiasa nganggo "-fmodules-cache-path =" bandéra pikeun override.
  • Standar C standar parantos diropéa tina gnu11 ka gnu17.
  • Ditambahkeun dukungan awal pikeun ekstensi GNU C "jalur asm»pikeun nambahkeun inserts assembler. Ekstensina ngan ukur diusir dugi ka ayeuna, tapi henteu diolah ku cara naon waé.
  • Kamampuhan dimekarkeun patali jeung rojongan pikeun OpenCL na CUDA. Ditambahkeun dukungan pikeun diagnostik blok OpenCL 2.0 sareng ngalaksanakeun fitur anyar OpenMP 5.0.
  • Ditambahkeun pilihan IndentExternBlock kana clang-format utiliti pikeun alignment jero extern "C" jeung extern "C ++" blok.
  • Ningkatkeun penanganan konstruktor anu diwariskeun dina C ++ dina analisa statik. Ditambahkeun cék anyar alpha.core.C11Lock sareng alpha.fuchsia.Lock pikeun mariksa konci, alpha.security.cert.pos.34c pikeun ngadeteksi pamakean putenv anu teu aman, webkit.NoUncountedMemberChecker sareng webkit.RefCntblBaseVirtualDtor pikeun ngadeteksi masalah sareng jinis anu teu kaétang, alfa. .cplusplus .SmartPtr pikeun mariksa null pinter pointer dereference.
  • Dina linter clang-rapi ditambahkeun bagian badag tina cék anyar.
  • Caching server clangd (Clang Server) parantos ningkatkeun kinerja sareng nambihan kamampuan diagnostik anyar.

utama inovasi LLVM 11.0:

  • Sistim ngawangun geus switched ngagunakeun Python 3. Mun Python 3 teu sadia, lajeng kamampuhan pikeun gulung deui ngagunakeun Python 2 geus dilaksanakeun.
  • Hareup-tungtung kalawan compiler pikeun basa Go (llgo) ieu kaasup ti release, nu bisa jadi restructured dina mangsa nu bakal datang.
  • Vektor-fungsi-abi-varian atribut geus ditambahkeun kana ngagambarkeun panengah (IR) pikeun ngajelaskeun pemetaan antara skalar jeung fungsi vektor pikeun vectorization panggero. Dua jenis vektor misah llvm :: FixedVectorType na llvm :: ScalableVectorType dipisahkeun tina llvm :: VectorType.
  • Hal ieu dianggap kabiasaan undefined kana cabang dumasar kana nilai udef tur ngalirkeun nilai undef kana fungsi perpustakaan baku. DI
    memset / memcpy / memmove ngalirkeun pointers undef diwenangkeun, tapi lamun parameter jeung ukuranana enol.

  • LLJIT parantos nambihan dukungan pikeun ngalakukeun inisialisasi statik ngalangkungan metode LLJIT :: initialize sareng LLJIT :: deinitialize. Ngalaksanakeun kamampuan pikeun nambihan perpustakaan statik ka JITDylib nganggo kelas StaticLibraryDefinitionGenerator. Ditambahkeun C API pikeun ORCv2 (API pikeun ngawangun kompiler JIT).
  • Ditambahkeun dukungan pikeun prosesor Cortex-A64, Cortex-A34, Cortex-A77, sareng Cortex-X78 kana backend arsitektur AArch1. Dilaksanakeun ARMv8.2-BF16 (BFloat16) jeung ekstensi ARMv8.6-A, kaasup RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Sarap Grained Rupa), ARMv8.6-AMU (Aktivitas Monitor virtualization) sarta ARMv8.0-DGH (Hint ngumpulkeun data). Kamampuhan pikeun ngahasilkeun kode pikeun fungsi wrapping diwangun-di pikeun instruksi vektor SVE disadiakeun.
  • Rojongan pikeun prosesor Cortex-M55, Cortex-A77, Cortex-A78 sareng Cortex-X1 parantos diasupkeun kana backend arsitéktur ARM. Dilaksanakeun ekstensi
    Armv8.6-A Matrix Multiply na RMv8.2-AA32BF16 BFloat16.

  • Ditambahkeun dukungan generasi kode pikeun prosesor POWER10 kana backend arsitéktur PowerPC. Optimasi loop diperpanjang sareng dukungan ningkat pikeun operasi floating point.
  • Backend pikeun arsitéktur RISC-V diidinan nampi patches kalayan dukungan pikeun set instruksi ékspérimén ékspérimén anu henteu acan disatujuan sacara resmi.
  • Backend pikeun arsitéktur AVR geus dipindahkeun tina kategori eksperimen ka stabil, kaasup dina pakét dasar.
  • Backend pikeun arsitektur x86 ngarojong Intel AMX na TSXLDTRK parentah. Ditambahkeun panyalindungan serangan LVI (Beban Niley Injection), kitu ogé mékanisme Pangaruh Sisi Eksekusi Spekulatif umum pikeun meungpeuk serangan anu disababkeun ku palaksanaan operasi spekulatif dina CPU.
  • Ditambahkeun dukungan pikeun MemorySanitizer sareng LeakSanitizer dina tonggong SystemZ.
  • Rojongan pikeun file lulugu jeung konstanta matematik geus ditambahkeun kana Libc ++ .
  • Dilegaan LLD linker kamampuhan. Ningkatkeun rojongan format ELF, kaasup nambahkeun "--lto-emit-asm", "--lto-sakabéh-program-visibility", "--print-archive-stats", "--shuffle-sections", "-- thinlto- modul tunggal", "--unik", "--rosegment", "--threads = N". Nambahkeun pilihan "--time-trace" pikeun nyimpen jejak ka file, anu teras tiasa dianalisis via chrome: // tracing interface dina Chrome.

sumber: opennet.ru

Tambahkeun komentar