Ngaleupaskeun suite kompiler LLVM 10.0

Sanggeus genep bulan pangwangunan ditepikeun release proyék LVM 10.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.

fitur anyar dina LLVM 10.0 ngawengku rojongan pikeun C ++ Konsep, euweuh ngajalankeun Clang salaku prosés misah, rojongan pikeun CFG (kontrol aliran hansip) cék pikeun Windows, sarta rojongan pikeun kamampuhan CPU anyar.

Perbaikan dina Clang 10.0:

  • Ditambahkeun dukungan pikeun "konsép", C ++ extension template nu bakal kaasup kana standar salajengna, codenamed C ++ 2a (dihurungkeun ku -std = c ++ 2a bandéra).
    Konsep ngidinan Anjeun pikeun nangtukeun sakumpulan sarat parameter template nu, dina waktu compile, ngawatesan susunan argumen nu bisa ditarima salaku parameter template. Konsep bisa dipaké pikeun nyingkahan inconsistencies logis antara sipat tipe data dipaké dina citakan jeung tipe data sipat parameter input.

    citakan
    konsep KasaruaanBandingkeun = merlukeun(T a, T b) {
    {a == b} -> std::boolean;
    {a!= b} -> std::boolean;
    };

  • Sacara standar, peluncuran prosés anu misah ("clang -cc1") dimana kompilasi dilaksanakeun dieureunkeun. Kompilasi ayeuna dilakukeun dina prosés utama, sareng pilihan "-fno-integrated-cc1" tiasa dianggo pikeun mulangkeun kabiasaan anu lami.
  • Modeu diagnostik anyar:
    • "-Wc99-designator" jeung "-Wreorder-init-list" ngingetkeun ngalawan ngagunakeun C99 initializers dina modeu C ++ dina kasus dimana aranjeunna bener dina C99 tapi teu di C ++ 20.
    • "-Wsizeof-array-div" - nyekel kaayaan sapertos "int arr [10]; …sizeof(arr) / sizeof(pondok)…” (kedahna “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - warns ngalawan pamakéan constructs kayaning pamakéan operator "^" (xor) dina operasi nu bisa pahili jeung éksponénsial (2 ^ 16).
    • "-Wfinal-dtor-non-final-class" - warns ngeunaan kelas nu teu ditandaan ku specifier "final", tapi boga destructor jeung atribut "final".
    • "-Wtautological-bitwise-compare" nyaéta grup peringatan pikeun ngadiagnosa perbandingan tautologis antara operasi bitwise sareng konstanta, sareng pikeun ngaidentipikasi babandingan anu leres-leres dimana operasi OR bitwise diterapkeun kana nomer non-négatip.
    • "-Wbitwise-conditional-parentheses" ngingetkeun masalah nalika nyampur operator logis AND (&) sareng OR (|) sareng operator kondisional (?:).
    • "-Wmisleading-indentation" mangrupakeun analog tina cék tina ngaran anu sarua ti GCC, nu warns ngeunaan ekspresi indented saolah-olah aranjeunna bagian tina hiji lamun / sejenna / keur / bari blok, tapi dina kanyataanana maranéhna teu kaasup dina blok ieu. .
    • Nalika netepkeun "-Wextra", cek "-Wdeprecated-copy" diaktipkeun, ngingetkeun ngeunaan panggunaan konstruktor.
      "move" jeung "copy" dina kelas kalawan harti destructor eksplisit.

    • Cék "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" geus dimekarkeun.
    • Cék "-Wbitwise-op-parentheses" sareng "-Wlogical-op-parentheses" dinonaktipkeun sacara standar.
  • Dina kode C jeung C ++, operasi arithmetic pointer ngan diwenangkeun dina arrays. The Undefined Behavior Sanitizer dina mode "-fsanitize=pointer-overflow" ayeuna nangkep kasus sapertos nambahkeun offset non-enol kana pointer null atawa nyieun pointer null nalika subtracting integer ti pointer non-null.
  • Modeu "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) diadaptasi pikeun ngaidentipikasi masalah sareng operasi increment sareng decrement pikeun jinis anu ukuranana sakedik langkung alit tibatan jinis "int".
  • Nalika milih arsitéktur target x86 "-march = skylake-avx512", "-march = icelake-client", "-march = icelake-server", "-march = cascadelake" sareng "-march = cooperlake" sacara standar dina vectorized The kode geus dieureunkeun maké 512-bit zmm registers, iwal indikasi langsung maranéhanana dina kode sumber. Alesanna nyaéta frékuénsi CPU turun nalika ngajalankeun operasi 512-bit, anu tiasa mangaruhan négatif kinerja sakabéh. Pikeun ngarobah kabiasaan anyar, pilihan "-mprefer-vector-width = 512" disadiakeun.
  • Paripolah bendera "-flax-vector-conversions" sami sareng GCC: konvérsi bit vektor implisit antara integer sareng vektor floating-point dilarang. Pikeun ngaleungitkeun watesan ieu, disarankeun pikeun nganggo bandéra
    "-flax-vector-conversions=all" anu mangrupikeun standar.

  • Ningkatkeun dukungan pikeun CPU MIPS kulawarga Octeon. Ditambahkeun "octeon +" kana daptar jinis CPU anu sah.
  • Nalika assembling kana kode panganteur WebAssembly, wasm-opt optimizer otomatis disebut, lamun sadia dina sistem.
  • Pikeun sistem dumasar kana arsitéktur RISC-V, pamakean register anu nyimpen nilai floating point diidinan dina blok kondisional sisipan inline assembler.
  • Ditambahkeun bandéra kompiler anyar: "-fgnuc-version" pikeun set nilai versi pikeun "__GNUC__" na macros sarupa; "-fmacro-prefix-map=OLD=NEW" pikeun ngagentos diréktori awalan OLD sareng NEW dina makro sapertos "__FILE__"; "-fpatchable-function-entry=N[,M]" pikeun ngahasilkeun sababaraha paréntah NOP sateuacan sareng saatos titik éntri fungsi. Pikeun RISC-V
    rojongan ditambahkeun pikeun "-fixed-xX", "-mcmodel = medany" jeung "-mcmodel = medlow" umbul.

  • Ditambahkeun dukungan pikeun atribut '__attribute__((target("cabang-perlindungan =..."))), pangaruhna sami sareng pilihan -mbranch-panyalindungan.
  • Dina platform Windows, nalika nangtukeun bendera "-cfguard", substitusi cék integritas aliran palaksanaan (Control Flow Guard) pikeun panggero fungsi teu langsung dilaksanakeun. Pikeun nganonaktipkeun substitusi cek, anjeun tiasa nganggo bendera "-cfguard-nochecks" atanapi modifier "__declspec (guard (nocf))".
  • Paripolah atribut gnu_inline sami sareng GCC dina kasus dimana éta dianggo tanpa kecap konci "extern".
  • Kamampuhan anu aya hubunganana sareng dukungan OpenCL sareng CUDA parantos dilegakeun. Ditambahkeun dukungan pikeun fitur OpenMP 5.0 anyar.
  • Hiji pilihan Standar geus ditambahkeun kana utiliti clang-format, nu ngidinan Anjeun pikeun nangtukeun versi tina standar C ++ dipaké nalika parsing jeung kode pormat (panganyarna, Otomatis, c ++ 03, c ++ 11, c ++ 14, c++17, c++20).
  • cék anyar geus ditambahkeun kana analisa statik: alpha.cplusplus.PlacementNew pikeun nangtukeun naha aya spasi gudang cukup, fuchsia.HandleChecker pikeun ngadeteksi bocor patali panangan Fuchsia, security.insecureAPI.decodeValueOfObjCType pikeun ngadeteksi poténsi overflows panyangga lamun maké [NSCoder decodeValueypeOfOf :di:] .
  • The Undefined Behavior Sanitizer (UBSan) parantos ngalegaan cék overflow pointer pikeun nyekel aplikasi offset non-enol kana pointer NULL atanapi tambahan hasilna tina offset pointer NULL.
  • Dina linter clang-rapi ditambahkeun bagian badag tina cék anyar.

utama inovasi LLVM 10.0:

  • Ka kerangka Attributor optimizations interprocedural anyar jeung analis geus ditambahkeun. Kaayaan 19 atribut anu béda diprediksi, kalebet 12 atribut 12 LLVM IR sareng 7 atribut abstrak sapertos liveness.
  • Nambahkeun fungsi matematik matriks anyar anu diwangun kana kompiler (Intrinsik), nu diganti ku parentah vektor efisien salila kompilasi.
  • Seueur perbaikan parantos dilakukeun pikeun backends pikeun X86, AArch64, ARM, SystemZ, MIPS, AMDGPU sareng arsitéktur PowerPC. Ditambahkeun rojongan CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 jeung Neoverse N1. Pikeun ARMv8.1-M, ​​prosés ngahasilkeun kode geus dioptimalkeun (contona, rojongan pikeun loop kalawan overhead minimal geus mucunghul) jeung rojongan pikeun autovectorization geus ditambahkeun ngagunakeun extension MVE. Ningkatkeun dukungan CPU MIPS Octeon. Pikeun PowerPC, vektorisasi subrutin matematik nganggo perpustakaan MASSV (Mathematical Acceleration SubSystem) diaktipkeun, generasi kode ningkat, sareng aksés mémori tina loop dioptimalkeun. Pikeun x86, penanganan jinis vektor v2i32, v4i16, v2i16, v8i8, v4i8 sareng v2i8 parantos dirobih.

  • Ningkatkeun generator kode pikeun WebAssembly. rojongan ditambahkeun pikeun TLS (Thread-Lokal Panyimpenan) jeung atomic.fence parentah. rojongan SIMD geus nyata dimekarkeun. File obyék WebAssembly ayeuna gaduh kamampuan ngagunakeun tanda tangan fungsi multi-nilai.
  • Analyzer dianggo nalika ngolah puteran MémoriSSA, nu ngidinan Anjeun pikeun nangtukeun dependensi antara operasi memori béda. MemorySSA tiasa ngirangan kompilasi sareng waktos palaksanaan atanapi tiasa dianggo tibatan AliasSetTracker tanpa kaleungitan kinerja.
  • Debugger LLDB parantos ningkatkeun dukungan pikeun format DWARF v5. Ningkatkeun dukungan pikeun ngawangun sareng MinGW
    sareng nambihan kamampuan awal pikeun debug executable Windows pikeun arsitéktur ARM sareng ARM64. Katerangan tambahan ngeunaan pilihan anu ditawarkeun nalika ngalengkepan input otomatis ku mencét tab.

  • Dilegaan LLD linker kamampuhan. Ningkatkeun rojongan pikeun format ELF, kaasup kasaluyuan pinuh ku témplat glob jeung linker GNU, ditambahkeun rojongan pikeun bagian debug dikomprés ".zdebug", ditambahkeun sipat PT_GNU_PROPERTY pikeun ngartikeun bagian .note.gnu.property (bisa dipaké dina Linux Ubuntu hareup. kernel),
    The "-z noseparate-kode", "-z misah-kode" jeung "-z misah-loadable-segmén" geus dilaksanakeun. Ningkatkeun dukungan pikeun MinGW sareng WebAssembly.

sumber: opennet.ru

Tambahkeun komentar