Izdaja zbirke prevajalnikov LLVM 9.0

Po šestih mesecih razvoja predstavljeno izdaja projekta LLVM 9.0 - Orodja, združljiva z GCC (prevajalniki, optimizatorji in generatorji kode), ki prevajajo programe v vmesno bitno kodo virtualnih navodil, podobnih RISC (nizkonivojski virtualni stroj z večnivojskim optimizacijskim sistemom). Ustvarjeno psevdo kodo lahko prevajalnik JIT pretvori v strojna navodila takoj ob izvajanju programa.

Nove funkcije LLVM 9.0 vključujejo odstranitev oznake eksperimentalne zasnove s ciljne platforme RISC-V, podporo C++ za OpenCL, možnost razdelitve programa na dinamično naložene dele v LLD in implementacijo “asm goto", ki se uporablja v kodi jedra Linuxa. libc++ je dodal podporo za WASI (sistemski vmesnik WebAssembly), LLD pa je dodal začetno podporo za dinamično povezovanje WebAssembly.

Izboljšave v Clang 9.0:

  • Dodano implementacija izraza, specifičnega za GCC "asm goto“, ki vam omogoča, da se premaknete iz vgrajenega bloka asemblerja v oznako v kodi C. Ta funkcija je potrebna za gradnjo jedra Linuxa v načinu »CONFIG_JUMP_LABEL=y« z uporabo Clang v sistemih z arhitekturo x86_64. Ob upoštevanju sprememb, dodanih v prejšnjih izdajah, je jedro Linuxa zdaj mogoče zgraditi v Clangu za arhitekturo x86_64 (prej je bila podprta samo izgradnja za arhitekture arm, aarch64, ppc32, ppc64le in mips). Poleg tega so bili projekti Android in ChromeOS že spremenjeni za uporabo Clanga za gradnjo jedra, Google pa preizkuša Clang kot glavno platformo za gradnjo jeder za svoje proizvodne sisteme Linux. V prihodnosti je mogoče v procesu gradnje jedra uporabiti druge komponente LLVM, vključno z LLD, llvm-objcopy, llvm-ar, llvm-nm in llvm-objdump;
  • Dodana eksperimentalna podpora za uporabo C++17 v OpenCL. Posebne funkcije vključujejo podporo za atribute naslovnega prostora, blokiranje pretvorbe naslovnega prostora z operaterji za pretvorbo tipa, zagotavljanje vektorskih vrst kot v OpenCL za C, prisotnost posebnih vrst OpenCL za slike, dogodke, kanale itd.
  • Dodani novi zastavici prevajalnika »-ftime-trace« in »-ftime-trace-granularity=N« za ustvarjanje poročila o času izvajanja različnih stopenj sprednjega dela (razčlenjevanje, inicializacija) in zaledja (stopnje optimizacije). Poročilo je shranjeno v formatu json, združljivem s chrome://tracing in speedscope.app;
  • Dodana obdelava specifikatorja “__declspec(allocator)” in generiranje spremljajočih informacij za odpravljanje napak, ki vam omogoča spremljanje porabe pomnilnika v okolju Visual Studio;
  • Za jezik C je bila dodana podpora za makro »__FILE_NAME__«, ki spominja na makro »__FILE__«, vendar vključuje samo ime datoteke brez celotne poti;
  • C++ je razširil podporo za atribute naslovnega prostora, da pokrije različne funkcije C++, vključno z vzorci parametrov in argumentov, referenčnimi vrstami, sklepanjem vrnjenih vrst, objekti, samodejno generiranimi funkcijami, vgrajenimi operatorji in še več.
  • Zmogljivosti, povezane s podporo za OpenCL, OpenMP in CUDA, so bile razširjene. To vključuje začetno podporo za implicitno vključitev vgrajenih funkcij OpenCL (dodana je bila zastavica »-fdeclare-opencl-builtins«), implementirana je bila razširitev cl_arm_integer_dot_product in diagnostična orodja so bila razširjena;
  • Izboljšano je delo statičnega analizatorja in dodana dokumentacija o izvajanju statične analize. Dodane zastavice za prikaz razpoložljivih modulov preverjanja in podprtih možnosti (»-analyzer-checker[-možnost]-pomoč«, »-analyzer-checker[-možnost]-pomoč-alfa« in »-analyzer-checker[-možnost]-pomoč ” -razvijalec"). Dodana zastavica »-analyzer-werror« za obravnavanje opozoril kot napak.
    Dodani novi načini preverjanja:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling za prepoznavanje nevarnih praks za delo z medpomnilniki;
    • osx.MIGChecker za iskanje kršitev klicnih pravil MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast za iskanje nepravilnih pretvorb objektov XNU libkern;
    • apiModeling.llvm z nizom funkcij preverjanja modeliranja za odkrivanje napak v kodni bazi LLVM;
    • Stabilizirana koda za preverjanje neinicializiranih objektov C++ (UninitializedObject v paketu optin.cplusplus);
  • Pripomoček clang-format je dodal podporo za oblikovanje kode v jeziku C# in zagotavlja podporo za slog oblikovanja kode, ki ga uporablja Microsoft;
  • clang-cl, alternativni vmesnik ukazne vrstice, ki zagotavlja združljivost na ravni možnosti s prevajalnikom cl.exe, vključenim v Visual Studio, je dodal hevristiko za obravnavanje neobstoječih datotek kot možnosti ukazne vrstice in prikaz ustreznega opozorila (na primer pri izvajanju "clang-cl /diagnostic :caret /c test.cc");
  • V linter clang-tidy je bil dodan velik del novih preverjanj, vključno z dodanimi preverjanji, specifičnimi za API OpenMP;
  • Razširjeno zmogljivosti strežnika clangd (Clang Server), v katerem je privzeto omogočen način gradnje indeksa v ozadju, dodana je podpora za kontekstualna dejanja s kodo (pridobivanje spremenljivk, razširitev samodejnih in makro definicij, pretvorba ubežnih nizov v neubežne), možnost prikaza opozorila iz Clang-tidy, razširjena diagnostika napak v datotekah glave in dodana možnost prikaza informacij o hierarhiji tipov;

Glavni inovacije LLVM 9.0:

  • Povezovalniku LLD je bila dodana eksperimentalna funkcija particioniranja, ki vam omogoča, da en program razdelite na več delov, od katerih se vsak nahaja v ločeni datoteki ELF. Ta funkcija vam omogoča zagon glavnega dela programa, ki bo med delovanjem po potrebi naložil druge komponente (na primer, vgrajen pregledovalnik PDF lahko ločite v ločeno datoteko, ki se bo naložila šele, ko uporabnik odpre PDF mapa).

    LLD povezovalnik postavili v ospredje v stanje, primerno za povezovanje jedra Linuxa za arhitekture arm32_7, arm64, ppc64le in x86_64.
    Nove možnosti "-" (izhod v stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" in "-z common-page-size". Za arhitekturo AArch64 je bila dodana podpora za navodila BTI (Branch Target Indicator) in PAC (Pointer Authentication Code). Podpora za platforme MIPS, RISC-V in PowerPC je bila bistveno izboljšana. Dodana začetna podpora za dinamično povezovanje za WebAssembly;

  • V libc++ izvajati funkcije ssize, std::is_constant_evaluated, std::midpoint in std::lerp, metodi “front” in “back” sta bili dodani v std::span, dodani so bili atributi tipov std::is_unbounded_array in std::is_bounded_array , std zmogljivosti so bile razširjene: :atomic. Podpora za GCC 4.9 je bila ukinjena (lahko se uporablja z GCC 5.1 in novejšimi izdajami). Dodana podpora SEM BIL JAZ (WebAssembly System Interface, vmesnik za uporabo WebAssembly zunaj brskalnika);
  • Dodane so bile nove optimizacije. V nekaterih primerih omogočena pretvorba klicev memcmp v bcmp. Implementirana opustitev preverjanja obsega za preskočne tabele, v katerih nižji stikalni bloki niso dosegljivi ali ko navodila niso uporabljena, na primer pri klicanju funkcij s tipom void;
  • Stabilizirano je bilo zaledje za arhitekturo RISC-V, ki ni več postavljeno kot eksperimentalno in je privzeto zgrajeno. Zagotavlja popolno podporo za ustvarjanje kode za različice nabora navodil RV32I in RV64I z razširitvami MAFDC;
  • Zaledja za arhitekture X86, AArch64, ARM, SystemZ, MIPS, AMDGPU in PowerPC so bile narejene številne izboljšave. Na primer za arhitekturo
    AArch64 je dodal podporo za navodila SVE2 (Scalable Vector Extension 2) in MTE (Memory Tagging Extensions); v ozadju ARM je bila dodana podpora za arhitekturo Armv8.1-M in razširitev MVE (M-Profile Vector Extension). Podpora za arhitekturo GFX10 (Navi) je bila dodana v zaledje AMDGPU, zmožnosti klicanja funkcij so privzeto omogočene in aktiviran je kombinirani prehod DPP (Data-Parallel Primitives).

  • Razhroščevalnik LLDB ima zdaj barvno označevanje za povratne sledi in dodano podporo za bloka DWARF4 debug_types in DWARF5 debug_info;
  • Pripomočkoma llvm-objcopy in llvm-strip je bila dodana podpora za objektne in izvršljive datoteke v formatu COFF.

Vir: opennet.ru

Dodaj komentar