Rilis set kompiler LLVM 9.0

Sawise nem sasi pembangunan diwenehi release proyek LLVM 9.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 LLVM 9.0 kalebu mbusak tag desain eksperimen saka platform RISC-V target, dhukungan C++ kanggo OpenCL, kemampuan kanggo pamisah program dadi bagean sing dimuat kanthi dinamis ing LLD, lan implementasine "asm goto", digunakake ing kode kernel Linux. libc++ nambahake dhukungan kanggo WASI (WebAssembly System Interface), lan LLD nambahake dhukungan awal kanggo link dinamis WebAssembly.

Dandan ing Clang 9.0:

  • Ditambahake implementasi ekspresi spesifik GCC "asm goto", sing ngidini sampeyan pindhah saka blok inline assembler menyang label ing kode C. Fitur iki dibutuhake kanggo mbangun kernel Linux ing mode "CONFIG_JUMP_LABEL = y" nggunakake Clang ing sistem kanthi arsitektur x86_64. Nganggep owah-owahan sing ditambahake ing rilis sadurunge, kernel Linux saiki bisa dibangun ing Clang kanggo arsitektur x86_64 (sadurunge mung dibangun kanggo lengen, aarch64, ppc32, ppc64le lan arsitektur mips sing didhukung). Kajaba iku, proyek Android lan ChromeOS wis diowahi kanggo nggunakake Clang kanggo mbangun kernel, lan Google nyoba Clang minangka platform utama kanggo mbangun kernel kanggo sistem produksi Linux. Ing mangsa ngarep, komponen LLVM liyane bisa digunakake ing proses mbangun kernel, kalebu LLD, llvm-objcopy, llvm-ar, llvm-nm, lan llvm-objdump;
  • Nambahake dhukungan eksperimen kanggo nggunakake C++ 17 ing OpenCL. Fitur khusus kalebu dhukungan kanggo atribut ruang alamat, mblokir konversi ruang alamat miturut operator casting jinis, panyedhiya jinis vektor kaya ing OpenCL kanggo C, ananΓ© jinis OpenCL tartamtu kanggo gambar, acara, saluran, lsp.
  • Nambahake panji kompiler anyar "-ftime-trace" lan "-ftime-trace-granularity = N" kanggo ngasilake laporan babagan wektu eksekusi saka macem-macem tahapan frontend (parsing, initialization) lan backend (tahap optimasi). Laporan kasebut disimpen ing format json, kompatibel karo chrome://tracing lan speedscope.app;
  • Added Processing saka "__declspec (allocator)" specifier lan generasi informasi debugging gawan sing ngijini sampeyan kanggo ngawasi konsumsi memori ing lingkungan Visual Studio;
  • Kanggo basa C, dhukungan wis ditambahake kanggo makro "__FILE_NAME__", sing meh padha karo makro "__FILE__", nanging mung kalebu jeneng berkas tanpa path lengkap;
  • C ++ wis nggedhekake dhukungan kanggo atribut spasi alamat kanggo nutupi macem-macem fitur C ++, kalebu pola parameter lan argumen, jinis referensi, inferensi jinis bali, obyek, fungsi sing digawe kanthi otomatis, operator sing dibangun, lan liya-liyane.
  • Kapabilitas sing ana gandhengane karo dhukungan kanggo OpenCL, OpenMP lan CUDA wis ditambahi. Iki kalebu dhukungan awal kanggo inklusi implisit saka fungsi OpenCL sing dibangun (gendera "-fdeclare-opencl-builtins" wis ditambahake), ekstensi cl_arm_integer_dot_product wis dileksanakake, lan alat diagnostik wis ditambahi;
  • Pakaryan penganalisa statis wis ditingkatake lan dokumentasi babagan nindakake analisis statis wis ditambahake. GendΓ©ra sing ditambahake kanggo nampilake modul checker sing kasedhiya lan opsi sing didhukung ("-analyzer-checker [-option] -help", "-analyzer-checker [-option] -help-alpha" lan "-analyzer-checker [-option] -help "- pangembang"). Nambahake gendera "-analyzer-werror" kanggo nganggep bebaya minangka kesalahan.
    Nambahake mode verifikasi anyar:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling kanggo ngenali praktik sing ora aman kanggo nggarap buffer;
    • osx.MIGCecker kanggo nelusuri nglanggar aturan telpon MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast kanggo nemokake konversi obyek XNU libkern sing salah;
    • apiModeling.llvm karo pesawat saka modeling mriksa fungsi kanggo ndeteksi kasalahan ing codebase LLVM;
    • Kode stabil kanggo mriksa uninitialized C ++ obyek (UninitializedObject ing paket optin.cplusplus);
  • Utilitas format clang wis nambahake dhukungan kanggo format kode ing basa C # lan menehi dhukungan kanggo gaya format kode sing digunakake dening Microsoft;
  • clang-cl, antarmuka baris printah alternatif sing nyedhiyakake kompatibilitas tingkat pilihan karo compiler cl.exe sing kalebu ing Visual Studio, wis nambah heuristik kanggo nambani file sing ora ana minangka pilihan baris perintah lan nampilake bebaya sing cocog (contone, nalika mlaku "clang-cl / diagnostik: caret / c test.cc");
  • A bagean gedhe saka kir anyar wis ditambahake kanggo linter clang-rapi, kalebu ditambahake mriksa khusus kanggo OpenMP API;
  • Digedhekake kapabilitas server clangd (Server Clang), ing ngendi mode bangunan indeks latar mburi diaktifake kanthi gawan, dhukungan kanggo tumindak kontekstual kanthi kode wis ditambahake (pengambilan variabel, ekspansi definisi otomatis lan makro, konversi string sing lolos dadi sing ora bisa lolos), kemampuan kanggo nampilake bebaya saka Clang-tidy, nggedhekake diagnostik kasalahan ing file header lan nambah kemampuan kanggo nampilake informasi babagan hirarki jinis;

Utama inovasi LLVM 9.0:

  • Fitur pemisahan eksperimen wis ditambahake menyang linker LLD, sing ngidini sampeyan mbagi siji program dadi sawetara bagean, sing saben ana ing file ELF sing kapisah. Fitur iki ngidini sampeyan miwiti bagean utama program, sing bakal mbukak komponen liyane sing dibutuhake sajrone operasi (contone, sampeyan bisa misahake panampil PDF sing dibangun dadi file sing kapisah, sing bakal dimuat mung nalika pangguna mbukak PDF. berkas).

    Penghubung LLD digawa menyang negara sing cocog kanggo ngubungake kernel Linux kanggo arsitektur arm32_7, arm64, ppc64le lan x86_64.
    Opsi anyar "-" (output kanggo stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", "- z ifunc-noplt" lan "-z umum-ukuran-kaca". Kanggo arsitektur AArch64, dhukungan kanggo instruksi BTI (Indikator Target Cabang) lan PAC (Kode Authentication Point). Dhukungan kanggo platform MIPS, RISC-V lan PowerPC wis apik banget. Ditambahake dhukungan awal kanggo ngubungake dinamis kanggo WebAssembly;

  • Ing libc++ dipun ginakaken fungsi ssize, std :: is_constant_evaluated, std :: midpoint lan std :: lerp, metode "ngarep" lan "mburi" wis ditambahake menyang std :: span, atribut jinis std :: is_unbounded_array lan std :: is_bounded_array wis ditambahake , Kapabilitas std wis ditambahi:: atom. Dhukungan kanggo GCC 4.9 wis mandheg (bisa digunakake karo GCC 5.1 lan rilis sing luwih anyar). Dhukungan ditambahake WASI (WebAssembly System Interface, antarmuka kanggo nggunakake WebAssembly njaba browser);
  • Optimisasi anyar wis ditambahake. Ngaktifake konversi panggilan memcmp menyang bcmp ing sawetara kahanan. Dileksanakake ngilangi sawetara mriksa tabel mlumpat ing ngendi blok switch ngisor ora bisa digayuh utawa nalika instruksi ora digunakake, contone, nalika nelpon fungsi kanthi jinis void;
  • Backend kanggo arsitektur RISC-V wis stabil, sing ora ana maneh minangka eksperimen lan dibangun kanthi standar. Nyedhiyani dhukungan generasi kode lengkap kanggo varian pesawat instruksi RV32I lan RV64I kanthi ekstensi MAFDC;
  • Akeh dandan wis digawe kanggo backends kanggo arsitektur X86, AArch64, ARM, SystemZ, MIPS, AMDGPU lan PowerPC. Contone, kanggo arsitektur
    AArch64 nambahake dhukungan kanggo instruksi SVE2 (Scalable Vector Extension 2) lan MTE (Memory Tagging Extensions); ing backend ARM, dhukungan kanggo arsitektur Armv8.1-M lan ekstensi MVE (M-Profile Vector Extension). Dhukungan kanggo arsitektur GFX10 (Navi) wis ditambahake menyang backend AMDGPU, kapabilitas panggilan fungsi diaktifake kanthi gawan, lan pass gabungan diaktifake. DPP (Data-Paralel Primitif).

  • Debugger LLDB saiki nduweni sorotan werna kanggo backtraces lan nambahake dhukungan kanggo pamblokiran DWARF4 debug_types lan DWARF5 debug_info;
  • Dhukungan kanggo file obyek lan eksekusi ing format COFF wis ditambahake menyang llvm-objcopy lan llvm-strip keperluan.

Source: opennet.ru

Add a comment