Paglabas ng LLVM 9.0 compiler suite

Pagkatapos ng anim na buwan ng pag-unlad ipinakita pagpapalabas ng proyekto LLVM 9.0 β€” GCC-compatible tool (compiler, optimizer at code generators), pag-compile ng mga program sa intermediate bitcode ng RISC-like virtual instructions (low-level virtual machine na may multi-level optimization system). Ang nabuong pseudocode ay maaaring i-convert gamit ang isang JIT compiler sa mga tagubilin sa makina nang direkta sa oras ng pagpapatupad ng programa.

Kasama sa mga bagong feature ng LLVM 9.0 ang pag-alis ng pang-eksperimentong tag ng disenyo mula sa target na platform ng RISC-V, suporta ng C++ para sa OpenCL, ang kakayahang hatiin ang isang programa sa mga dynamic na na-load na bahagi sa LLD, at ang pagpapatupad ng β€œasm goto", ginamit sa Linux kernel code. Nagdagdag ang libc++ ng suporta para sa WASI (WebAssembly System Interface), at nagdagdag ang LLD ng paunang suporta para sa dynamic na pag-link ng WebAssembly.

Mga pagpapabuti sa Clang 9.0:

  • Idinagdag pagpapatupad ng ekspresyong tukoy sa GCC "asm gotoβ€œ, na nagbibigay-daan sa iyong lumipat mula sa isang assembler inline block patungo sa isang label sa C code. Ang tampok na ito ay kinakailangan upang bumuo ng Linux kernel sa "CONFIG_JUMP_LABEL=y" mode gamit ang Clang sa mga system na may x86_64 architecture. Isinasaalang-alang ang mga pagbabagong idinagdag sa mga nakaraang release, ang Linux kernel ay maaari na ngayong itayo sa Clang para sa x86_64 na arkitektura (dating gusali lamang para sa mga arkitekturang braso, aarch64, ppc32, ppc64le at mips ang suportado). Bukod dito, ang mga proyekto ng Android at ChromeOS ay na-convert na upang gamitin ang Clang para sa pagbuo ng kernel, at sinusubukan ng Google ang Clang bilang pangunahing platform para sa pagbuo ng mga kernel para sa produksyon nitong mga Linux system. Sa hinaharap, maaaring gamitin ang iba pang bahagi ng LLVM sa proseso ng pagbuo ng kernel, kabilang ang LLD, llvm-objcopy, llvm-ar, llvm-nm, at llvm-objdump;
  • Nagdagdag ng pang-eksperimentong suporta para sa paggamit ng C++17 sa OpenCL. Kasama sa mga partikular na feature ang suporta para sa mga attribute ng address space, pagharang sa conversion space ng address ayon sa uri ng mga operator ng casting, probisyon ng mga uri ng vector tulad ng sa OpenCL para sa C, ang pagkakaroon ng mga partikular na uri ng OpenCL para sa mga larawan, kaganapan, channel, atbp.
  • Nagdagdag ng mga bagong flag ng compiler na "-ftime-trace" at "-ftime-trace-granularity=N" upang bumuo ng ulat sa oras ng pagpapatupad ng iba't ibang yugto ng frontend (pag-parse, pagsisimula) at backend (mga yugto ng pag-optimize). Ang ulat ay naka-save sa json na format, tugma sa chrome://tracing at speedscope.app;
  • Idinagdag ang pagpoproseso ng "__declspec(allocator)" specifier at pagbuo ng kasamang impormasyon sa pag-debug na nagbibigay-daan sa iyong subaybayan ang pagkonsumo ng memorya sa kapaligiran ng Visual Studio;
  • Para sa wikang C, idinagdag ang suporta para sa macro na "__FILE_NAME__", na kahawig ng macro na "__FILE__", ngunit kasama lang ang pangalan ng file na walang buong path;
  • Pinalawak ng C++ ang suporta para sa mga attribute ng address space upang masakop ang iba't ibang feature ng C++, kabilang ang mga pattern ng parameter at argument, mga uri ng sanggunian, inference ng uri ng pagbabalik, mga bagay, mga function na awtomatikong nabuo, mga built-in na operator, at higit pa.
  • Ang mga kakayahan na nauugnay sa suporta para sa OpenCL, OpenMP at CUDA ay pinalawak. Kabilang dito ang paunang suporta para sa implicit na pagsasama ng mga built-in na OpenCL function (ang flag na "-fdeclare-opencl-builtins" ay naidagdag na), ang extension ng cl_arm_integer_dot_product ay ipinatupad, at ang mga diagnostic tool ay pinalawak;
  • Ang gawain ng static analyzer ay napabuti at ang dokumentasyon sa pagsasagawa ng static analysis ay naidagdag. Nagdagdag ng mga flag para ipakita ang mga available na checker module at suportadong opsyon (β€œ-analyzer-checker[-option]-help”, β€œ-analyzer-checker[-option]-help-alpha” at β€œ-analyzer-checker[-option]-help ” -developer"). Idinagdag ang flag na "-analyzer-werror" upang ituring ang mga babala bilang mga error.
    Nagdagdag ng mga bagong verification mode:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling upang matukoy ang mga hindi ligtas na kasanayan para sa pagtatrabaho sa mga buffer;
    • osx.MIGCecker upang maghanap ng mga paglabag sa mga panuntunan sa tawag ng MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast upang mahanap ang maling XNU libkern object conversion;
    • apiModeling.llvm na may set ng modelling checking functions para makakita ng mga error sa LLVM codebase;
    • Pinatatag na code para sa pagsuri ng mga hindi nasimulang C++ na bagay (UninitializedObject sa optin.cplusplus package);
  • Ang clang-format na utility ay nagdagdag ng suporta para sa pag-format ng code sa C# na wika at nagbibigay ng suporta para sa code formatting style na ginagamit ng Microsoft;
  • Ang clang-cl, isang alternatibong interface ng command-line na nagbibigay ng pagiging tugma sa antas ng opsyon sa compiler ng cl.exe na kasama sa Visual Studio, ay nagdagdag ng heuristics upang ituring ang mga hindi umiiral na file bilang mga opsyon sa command-line at magpakita ng kaukulang babala (halimbawa, kapag tumatakbo ang "clang-cl /diagnostic :caret /c test.cc");
  • Malaking bahagi ng mga bagong tseke ang naidagdag sa linter clang-tidy, kabilang ang mga idinagdag na tseke na partikular sa OpenMP API;
  • Pinalawak mga kakayahan ng server clangd (Clang Server), kung saan ang background index building mode ay pinagana bilang default, ang suporta para sa mga aksyong ayon sa konteksto na may code ay idinagdag (variable retrieval, pagpapalawak ng auto at macro na mga kahulugan, conversion ng mga nakatakas na string sa mga hindi nakatakas), ang kakayahang ipakita mga babala mula sa Clang-tidy, pinalawak na diagnostic ng mga error sa mga file ng header at nagdagdag ng kakayahang magpakita ng impormasyon tungkol sa uri ng hierarchy;

Ang pangunahing mga inobasyon LLVM 9.0:

  • Ang isang tampok na pang-eksperimentong partitioning ay idinagdag sa linker ng LLD, na nagbibigay-daan sa iyong hatiin ang isang programa sa ilang bahagi, na ang bawat isa ay matatagpuan sa isang hiwalay na ELF file. Pinapayagan ka ng tampok na ito na ilunsad ang pangunahing bahagi ng programa, na maglo-load ng iba pang mga bahagi kung kinakailangan sa panahon ng operasyon (halimbawa, maaari mong paghiwalayin ang built-in na PDF viewer sa isang hiwalay na file, na maglo-load lamang kapag binuksan ng user ang PDF file).

    LLD Linker dinadala sa unahan sa isang estado na angkop para sa pag-link ng Linux kernel para sa arm32_7, arm64, ppc64le at x86_64 na mga arkitektura.
    Mga bagong opsyon "-" (output sa stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" at "-z common-page-size". Para sa arkitektura ng AArch64, idinagdag ang suporta para sa BTI (Branch Target Indicator) at PAC (Pointer Authentication Code). Ang suporta para sa mga platform ng MIPS, RISC-V at PowerPC ay makabuluhang napabuti. Nagdagdag ng paunang suporta para sa dynamic na pag-link para sa WebAssembly;

  • Sa libc++ ipinatupad function ssize, std::is_constant_evaluated, std::midpoint at std::lerp, mga pamamaraan na "harap" at "likod" ay naidagdag sa std::span, mga katangian ng mga uri std::is_unbounded_array at std::is_bounded_array ay naidagdag , pinalawak ang mga kakayahan ng std: :atomic. Ang suporta para sa GCC 4.9 ay hindi na ipinagpatuloy (maaaring magamit sa GCC 5.1 at mas bagong mga release). Nagdagdag ng suporta WASI (WebAssembly System Interface, isang interface para sa paggamit ng WebAssembly sa labas ng browser);
  • Ang mga bagong pag-optimize ay naidagdag. Pinagana ang conversion ng memcmp na mga tawag sa bcmp sa ilang sitwasyon. Ipinatupad ang pagtanggal ng range check para sa mga jump table kung saan hindi maabot ang mga bloke ng mas mababang switch o kapag hindi ginagamit ang mga tagubilin, halimbawa, kapag tumatawag sa mga function na may type void;
  • Ang backend para sa arkitektura ng RISC-V ay na-stabilize, na hindi na nakaposisyon bilang eksperimental at binuo bilang default. Nagbibigay ng buong suporta sa pagbuo ng code para sa mga variant ng set ng pagtuturo ng RV32I at RV64I na may mga extension ng MAFDC;
  • Maraming mga pagpapabuti ang ginawa sa mga backend para sa X86, AArch64, ARM, SystemZ, MIPS, AMDGPU at PowerPC na mga arkitektura. Halimbawa, para sa arkitektura
    Nagdagdag ang AArch64 ng suporta para sa SVE2 (Scalable Vector Extension 2) at MTE (Memory Tagging Extension) na mga tagubilin; sa ARM backend, idinagdag ang suporta para sa Armv8.1-M architecture at ang extension ng MVE (M-Profile Vector Extension). Ang suporta para sa arkitektura ng GFX10 (Navi) ay idinagdag sa AMDGPU backend, ang mga kakayahan sa pagtawag ng function ay pinagana bilang default, at ang pinagsamang pass ay na-activate. DPP (Data-Parallel Primitives).

  • Ang LLDB debugger ay mayroon na ngayong color highlighting para sa backtraces at nagdagdag ng suporta para sa DWARF4 debug_types at DWARF5 debug_info blocks;
  • Ang suporta para sa object at executable na mga file sa COFF na format ay naidagdag sa llvm-objcopy at llvm-strip na mga utility.

Pinagmulan: opennet.ru

Magdagdag ng komento