Rilis set kompiler LLVM 10.0

Sawise nem sasi pembangunan diwenehi release proyek LLVM 10.0 - Piranti sing kompatibel karo GCC (kompiler, pangoptimal lan generator kode), nyusun program menyang bitcode penengah instruksi virtual kaya RISC (mesin virtual tingkat rendah kanthi sistem optimasi multi-level). Pseudocode sing digawe bisa diowahi nggunakake compiler JIT menyang instruksi mesin langsung nalika eksekusi program.

Fitur anyar ing LLVM 10.0 kalebu support kanggo C ++ Concepts, ora maneh mbukak Clang minangka proses kapisah, support kanggo CFG (kontrol aliran njaga) mriksa kanggo Windows, lan support kanggo Kapabilitas CPU anyar.

Dandan ing Clang 10.0:

  • Ditambahake dhukungan kanggo "konsep", ekstensi cithakan C ++ sing bakal dilebokake ing standar sabanjure, kanthi jeneng kode C ++ 2a (diuripake dening -std = c ++ 2a flag).
    Konsep ngidini sampeyan nemtokake set syarat parameter cithakan sing, ing wektu kompilasi, mbatesi set argumen sing bisa ditampa minangka parameter cithakan. Konsep kasebut bisa digunakake kanggo ngindhari inconsistencies logis antarane sifat jinis data sing digunakake ing cithakan lan sifat jinis data saka parameter input.

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

  • Kanthi gawan, peluncuran proses kapisah ("clang -cc1") sing kompilasi ditindakake mandheg. Kompilasi saiki wis rampung ing proses utama, lan pilihan "-fno-integrated-cc1" bisa digunakake kanggo mulihake prilaku lawas.
  • Mode diagnostik anyar:
    • "-Wc99-designator" lan "-Wreorder-init-list" ngelingake supaya ora nggunakake initializers C99 ing mode C ++ ing kasus sing bener ing C99 nanging ora ing C ++ 20.
    • "-Wsizeof-array-div" - nyekel kahanan kayata "int arr[10]; …sizeof(arr) / sizeof(short)…” (kudu β€œsizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - ngelingake marang panggunaan konstruksi kayata panggunaan operator "^" (xor) ing operasi sing bisa bingung karo eksponensial (2 ^ 16).
    • "-Wfinal-dtor-non-final-class" - warns bab kelas sing ora ditandhani karo specifier "final", nanging duwe destructor karo atribut "final".
    • "-Wtautological-bitwise-compare" iku klompok bebaya kanggo diagnosa bandingaken tautological antarane operasi bitwise lan pancet, lan kanggo ngenali bandingaken tansah bener kang operasi UTAWA bitwise ditrapake kanggo nomer non-negatif.
    • "-Wbitwise-conditional-parentheses" ngelingake masalah nalika nyampur operator logis AND (&) lan UTAWA (|) karo operator kondisional (?:).
    • "-Wmisleading-indentation" minangka analog saka mriksa kanthi jeneng sing padha saka GCC, sing ngelingake babagan ekspresi indentasi kaya-kaya minangka bagean saka blok if / else / for / while, nanging nyatane ora kalebu ing blok iki. .
    • Nalika nemtokake "-Wextra", mriksa "-Wdeprecated-copy" diaktifake, ngelingake babagan panggunaan konstruktor
      "mindhah" lan "nyalin" ing kelas karo definisi destruktor eksplisit.

    • "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" wis ditambahi.
    • Priksa "-Wbitwise-op-parentheses" lan "-Wlogical-op-parentheses" dipateni kanthi gawan.
  • Ing kode C lan C ++, operasi aritmetika pointer mung diijini ing array. Undefined Behavior Sanitizer ing mode "-fsanitize=pointer-overflow" saiki nyekel kasus kayata nambah offset non-nol menyang pointer null utawa nggawe pointer null nalika nyuda integer saka pointer non-null.
  • Mode "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) diadaptasi kanggo ngenali masalah karo operasi increment lan decrement kanggo jinis sing ukurane rada cilik tinimbang jinis "int".
  • Nalika milih arsitektur target x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" lan "-march=cooperlake" minangka standar ing vectorized The kode wis mandegake nggunakake 512-dicokot zmm register, kajaba indikasi langsung ing kode sumber. Alesane yaiku frekuensi CPU nyuda nalika nindakake operasi 512-bit, sing bisa mengaruhi kinerja sakabΓ¨hΓ©. Kanggo ngganti prilaku anyar, pilihan "-mprefer-vector-width=512" kasedhiya.
  • Prilaku bendera "-flax-vector-conversions" padha karo GCC: konversi bit vektor implisit antarane vektor integer lan floating-point dilarang. Kanggo ngilangi watesan iki, disaranake nggunakake gendera
    "-flax-vector-conversions=all" sing minangka standar.

  • Dhukungan apik kanggo CPU MIPS saka kulawarga Octeon. Ditambahake "octeon +" menyang dhaptar jinis CPU sing bener.
  • Nalika ngrakit menyang kode intermediate WebAssembly, wasm-opt optimizer kanthi otomatis disebut, yen kasedhiya ing sistem.
  • Kanggo sistem adhedhasar arsitektur RISC-V, panggunaan register sing nyimpen nilai floating point diijini ing blok bersyarat saka sisipan inline assembler.
  • Added flag compiler anyar: "-fgnuc-version" kanggo nyetel Nilai versi kanggo "__GNUC__" lan macro padha; "-fmacro-prefix-map=OLD=NEW" kanggo ngganti awalan direktori OLD karo NEW ing makro kayata "__FILE__"; "-fpatchable-function-entry=N[,M]" kanggo ngasilake sawetara instruksi NOP sadurunge lan sawise titik entri fungsi. Kanggo RISC-V
    ditambahakΓ© support kanggo flag "-fixed-xX", "-mcmodel = Medany" lan "-mcmodel = medlow".

  • Dhukungan ditambahake kanggo atribut '__attribute__((target("perlindungan cabang =..."))), efek sing padha karo pilihan - mbranch-proteksi.
  • Ing platform Windows, nalika nemtokake gendera "-cfguard", panggantos mriksa integritas aliran eksekusi (Control Flow Guard) kanggo panggilan fungsi ora langsung dileksanakake. Kanggo mateni substitusi mriksa, sampeyan bisa nggunakake gendΓ©ra "-cfguard-nochecks" utawa modifier "__declspec (guard (nocf))".
  • Prilaku atribut gnu_inline padha karo GCC ing kasus sing digunakake tanpa tembung kunci "eksternal".
  • Kapabilitas sing ana gandhengane karo dhukungan OpenCL lan CUDA wis ditambahi. Dhukungan ditambahake kanggo fitur OpenMP 5.0 anyar.
  • Opsi Standar wis ditambahake menyang sarana format clang, sing ngidini sampeyan nemtokake versi standar C ++ sing digunakake nalika parsing lan kode format (Latest, Auto, c ++ 03, c ++ 11, c ++ 14, c++17, c++20).
  • Pemriksaan anyar wis ditambahake menyang analisa statis: alpha.cplusplus.PlacementNew kanggo nemtokake manawa ana papan panyimpenan sing cukup, fuchsia.HandleChecker kanggo ndeteksi bocor sing ana gandhengane karo panangan Fuchsia, security.insecureAPI.decodeValueOfObjCType kanggo ndeteksi kebanjiran buffer potensial nalika nggunakake [NSCoder decodeValueypeOf :ing:] .
  • Undefined Behavior Sanitizer (UBSan) wis nggedhekake mriksa overflow pointer kanggo nyekel aplikasi offset non-nol menyang pointer NULL utawa tambahan saka offset pointer NULL.
  • Ing linter clang-tidy ditambahake bagean gedhe saka mriksa anyar.

Utama inovasi LLVM 10.0:

  • Kanggo kerangka Atributor Optimisasi lan analisa interprosedural anyar wis ditambahake. Kahanan 19 atribut sing beda-beda diprediksi, kalebu 12 atribut 12 LLVM IR lan 7 atribut abstrak kayata liveness.
  • Nambahake fungsi matematika matriks anyar sing dibangun ing kompiler (Intrinsik), sing diganti karo instruksi vektor sing efisien sajrone kompilasi.
  • Akeh dandan wis digawe kanggo backends kanggo arsitektur X86, AArch64, ARM, SystemZ, MIPS, AMDGPU lan PowerPC. Dhukungan CPU ditambahake
    Cortex-A65, Cortex-A65AE, Neoverse E1 lan Neoverse N1. Kanggo ARMv8.1-M, ​​proses nggawe kode wis dioptimalake (contone, dhukungan kanggo puteran kanthi overhead minimal wis muncul) lan dhukungan kanggo autovektorisasi wis ditambahake nggunakake ekstensi MVE. Apik CPU MIPS Octeon support. Kanggo PowerPC, vektorisasi subrutin matematika nggunakake perpustakaan MASSV (Mathematical Acceleration SubSystem) diaktifake, nggawe kode ditingkatake, lan akses memori saka loop dioptimalake. Kanggo x86, penanganan jinis vektor v2i32, v4i16, v2i16, v8i8, v4i8 lan v2i8 wis diganti.

  • Apik generator kode kanggo WebAssembly. Dhukungan ditambahake kanggo TLS (Thread-Local Storage) lan instruksi atomic.fence. Dhukungan SIMD wis ditambahi sacara signifikan. File obyek WebAssembly saiki duwe kemampuan kanggo nggunakake teken fungsi multi-nilai.
  • Analyzer digunakake nalika ngolah puteran MemoriSSA, sing ngijini sampeyan kanggo nemtokake dependensi antarane operasi memori beda. MemorySSA bisa nyuda kompilasi lan wektu eksekusi utawa bisa digunakake tinimbang AliasSetTracker tanpa mundhut kinerja.
  • Debugger LLDB wis ningkatake dhukungan kanggo format DWARF v5. Dhukungan sing luwih apik kanggo mbangun karo MinGW
    lan nambah kemampuan awal kanggo debug eksekusi Windows kanggo arsitektur ARM lan ARM64. Nambahake katrangan babagan opsi sing ditawakake nalika ngrampungake input kanthi mencet tab.

  • Digedhekake Kapabilitas linker LLD. Dhukungan sing luwih apik kanggo format ELF, kalebu kompatibilitas lengkap template glob karo linker GNU, nambahake dhukungan kanggo bagean debug sing dikompres ".zdebug", nambahake properti PT_GNU_PROPERTY kanggo nemtokake bagean .note.gnu.property (bisa digunakake ing Linux mangsa ngarep. kernel),
    Mode "-z noseparate-code", "-z kapisah-kode" lan "-z kapisah-loadable-segmen" wis dipun ginakaken. Dhukungan sing luwih apik kanggo MinGW lan WebAssembly.

Source: opennet.ru

Add a comment