Izdanje paketa prevoditelja LLVM 9.0

Nakon šest mjeseci razvoja predstavio izdanje projekta LLVM 9.0 — GCC-kompatibilni alati (prevoditelji, optimizatori i generatori koda), kompajliranje programa u međubitni kod virtualnih instrukcija sličnih RISC-u (virtualni stroj niske razine sa sustavom optimizacije na više razina). Generirani pseudokod može se pretvoriti pomoću JIT kompajlera u strojne instrukcije izravno u trenutku izvođenja programa.

Nove značajke LLVM 9.0 uključuju uklanjanje oznake eksperimentalnog dizajna s ciljane RISC-V platforme, C++ podršku za OpenCL, mogućnost dijeljenja programa u dinamički učitavane dijelove u LLD-u i implementaciju “asm goto", koji se koristi u kodu jezgre Linuxa. libc++ je dodao podršku za WASI (WebAssembly System Interface), a LLD je dodao početnu podršku za WebAssembly dinamičko povezivanje.

Poboljšanja u Clangu 9.0:

  • Dodano implementacija GCC-specifičnog izraza "asm goto“, koji vam omogućuje prelazak s ugrađenog bloka asemblera na oznaku u C kodu. Ova značajka je potrebna za izgradnju Linux kernela u “CONFIG_JUMP_LABEL=y” načinu rada koristeći Clang na sustavima s x86_64 arhitekturom. Uzimajući u obzir promjene dodane u prethodnim izdanjima, Linux kernel se sada može izgraditi u Clangu za x86_64 arhitekturu (ranije je bila podržana samo izgradnja za arm, aarch64, ppc32, ppc64le i mips arhitekture). Štoviše, Android i ChromeOS projekti već su pretvoreni u korištenje Clanga za izgradnju kernela, a Google testira Clang kao glavnu platformu za izgradnju kernela za svoje proizvodne Linux sustave. U budućnosti, druge LLVM komponente mogu se koristiti u procesu izgradnje kernela, uključujući LLD, llvm-objcopy, llvm-ar, llvm-nm i llvm-objdump;
  • Dodana je eksperimentalna podrška za korištenje C++17 u OpenCL-u. Specifične značajke uključuju podršku za atribute adresnog prostora, blokiranje pretvorbe adresnog prostora operatorima za pretvaranje tipa, pružanje vektorskih tipova kao u OpenCL-u za C, prisutnost specifičnih OpenCL tipova za slike, događaje, kanale itd.
  • Dodane su nove oznake prevoditelja “-ftime-trace” i “-ftime-trace-granularity=N” za generiranje izvješća o vremenu izvršenja različitih faza sučelja (parsiranje, inicijalizacija) i pozadine (faze optimizacije). Izvješće se sprema u json formatu, kompatibilnom s chrome://tracing i speedscope.app;
  • Dodana obrada specifikatora “__declspec(allocator)” i generiranje popratnih informacija o ispravljanju pogrešaka koje vam omogućuju praćenje potrošnje memorije u okruženju Visual Studio;
  • Za jezik C dodana je podrška za makronaredbu “__FILE_NAME__”, koja nalikuje makronaredbi “__FILE__”, ali uključuje samo naziv datoteke bez punog puta;
  • C++ je proširio podršku za atribute adresnog prostora kako bi pokrio različite C++ značajke, uključujući uzorke parametara i argumenata, tipove referenci, zaključak povratnog tipa, objekte, automatski generirane funkcije, ugrađene operatore i više.
  • Proširene su mogućnosti povezane s podrškom za OpenCL, OpenMP i CUDA. Ovo uključuje početnu podršku za implicitno uključivanje ugrađenih OpenCL funkcija (dodana je zastavica "-fdeclare-opencl-builtins"), proširenje cl_arm_integer_dot_product je implementirano, a dijagnostički alati su prošireni;
  • Unaprijeđen je rad statičkog analizatora i dodana dokumentacija o izvođenju statičke analize. Dodane oznake za prikaz dostupnih modula provjere i podržanih opcija (“-analyzer-checker[-opcija]-pomoć”, “-analyzer-checker[-opcija]-pomoć-alfa” i “-analyzer-checker[-opcija]-pomoć ” -programer"). Dodana je zastavica "-analyzer-werror" za tretiranje upozorenja kao grešaka.
    Dodani novi načini provjere:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling za prepoznavanje nesigurnih praksi za rad s međuspremnicima;
    • osx.MIGChecker za traženje kršenja MIG (Mach Interface Generator) pravila poziva;
    • optin.osx.OSObjectCStyleCast za pronalaženje netočnih konverzija XNU libkern objekata;
    • apiModeling.llvm sa skupom funkcija provjere modeliranja za otkrivanje pogrešaka u LLVM bazi koda;
    • Stabilizirani kod za provjeru neinicijaliziranih C++ objekata (UninitializedObject u paketu optin.cplusplus);
  • Uslužni program clang-format dodao je podršku za oblikovanje koda u jeziku C# i pruža podršku za stil oblikovanja koda koji koristi Microsoft;
  • clang-cl, alternativno sučelje naredbenog retka koje pruža kompatibilnost na razini opcija s kompajlerom cl.exe uključenim u Visual Studio, ima dodanu heuristiku za tretiranje nepostojećih datoteka kao opcija naredbenog retka i prikaz odgovarajućeg upozorenja (na primjer, prilikom pokretanja "clang-cl /diagnostic :caret /c test.cc");
  • Velik dio novih provjera dodan je u linter clang-tidy, uključujući dodane provjere specifične za OpenMP API;
  • Prošireno mogućnosti poslužitelja clangd (Clang Server), u kojem je način građenja pozadinskog indeksa omogućen prema zadanim postavkama, dodana je podrška za kontekstualne radnje s kodom (dohvaćanje varijabli, proširenje auto i makro definicija, konverzija escaped stringova u neescaped), mogućnost prikaza upozorenja iz Clang-tidyja, proširena dijagnostika pogrešaka u datotekama zaglavlja i dodana mogućnost prikaza informacija o hijerarhiji tipa;

Glavni inovacije LLVM 9.0:

  • LLD povezivaču dodana je eksperimentalna značajka particioniranja, koja vam omogućuje da jedan program podijelite na nekoliko dijelova, od kojih se svaki nalazi u zasebnoj ELF datoteci. Ova značajka vam omogućuje pokretanje glavnog dijela programa, koji će učitavati ostale komponente po potrebi tijekom rada (na primjer, možete odvojiti ugrađeni PDF preglednik u zasebnu datoteku, koja će se učitati samo kada korisnik otvori PDF datoteka).

    LLD povezivač iznio u prvi plan u stanje prikladno za povezivanje Linux kernela za arm32_7, arm64, ppc64le i x86_64 arhitekture.
    Nove opcije "-" (izlaz u stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" i "-z common-page-size". Za AArch64 arhitekturu, dodana je podrška za BTI (Branch Target Indicator) i PAC (Pointer Authentication Code) upute. Podrška za MIPS, RISC-V i PowerPC platforme značajno je poboljšana. Dodana početna podrška za dinamičko povezivanje za WebAssembly;

  • U libc++ implementiran funkcije ssize, std::is_constant_evaluated, std::midpoint i std::lerp, metode “front” i “back” dodane su u std::span, dodani su atributi tipova std::is_unbounded_array i std::is_bounded_array , std mogućnosti su proširene: :atomic. Podrška za GCC 4.9 je ukinuta (može se koristiti s GCC 5.1 i novijim izdanjima). Dodana podrška WASI (WebAssembly System Interface, sučelje za korištenje WebAssembly izvan preglednika);
  • Dodane su nove optimizacije. Omogućena konverzija memcmp poziva u bcmp u nekim situacijama. Implementirano izostavljanje provjere raspona za tablice skokova u kojima su niži blokovi prekidača nedostupni ili kada se upute ne koriste, na primjer, kada se pozivaju funkcije s tipom void;
  • Stabilizirana je pozadina za RISC-V arhitekturu, koja se više ne postavlja kao eksperimentalna i izgrađena je prema zadanim postavkama. Pruža potpunu podršku za generiranje koda za varijante skupa instrukcija RV32I i RV64I s MAFDC ekstenzijama;
  • Brojna poboljšanja napravljena su na pozadinama za X86, AArch64, ARM, SystemZ, MIPS, AMDGPU i PowerPC arhitekture. Na primjer, za arhitekturu
    AArch64 je dodao podršku za SVE2 (Scalable Vector Extension 2) i MTE (Memory Tagging Extensions) upute; u pozadini ARM-a dodana je podrška za Armv8.1-M arhitekturu i MVE (M-Profile Vector Extension) ekstenziju. Podrška za GFX10 (Navi) arhitekturu dodana je u AMDGPU pozadinu, mogućnosti pozivanja funkcija omogućene su prema zadanim postavkama, a kombinirani prolaz je aktiviran DPP (Data-Parallel Primitives).

  • LLDB debugger sada ima isticanje boja za povratne tragove i dodanu podršku za DWARF4 debug_types i DWARF5 debug_info blokove;
  • Podrška za objektne i izvršne datoteke u COFF formatu dodana je uslužnim programima llvm-objcopy i llvm-strip.

Izvor: opennet.ru

Dodajte komentar