LLVM 9.0 kompilaatorikomplekti väljalase

Pärast kuuekuulist arengut esitatakse projekti vabastamine LLVM 9.0 — GCC-ga ühilduvad tööriistad (kompilaatorid, optimeerijad ja koodigeneraatorid), programmide kompileerimine RISC-laadsete virtuaalsete käskude vahepealsesse bitikoodi (madala tasemega virtuaalmasin mitmetasandilise optimeerimissüsteemiga). Loodud pseudokoodi saab JIT-kompilaatori abil teisendada masinakäskudeks vahetult programmi täitmise ajal.

LLVM 9.0 uute funktsioonide hulka kuuluvad eksperimentaalse disaini sildi eemaldamine siht-RISC-V platvormilt, OpenCL-i C++ tugi, võimalus jagada programm LLD-s dünaamiliselt laaditud osadeks ja "asm goto", mida kasutatakse Linuxi tuuma koodis. libc++ lisas toe WASI-le (WebAssembly System Interface) ja LLD lisas esialgse toe WebAssembly dünaamilisele linkimisele.

Parandused Clang 9.0-s:

  • Lisatud GCC-spetsiifilise väljendi rakendamine "asm goto“, mis võimaldab liikuda komplekteerija sisesest plokist C-koodi sildile. See funktsioon on vajalik Linuxi kerneli ehitamiseks režiimis "CONFIG_JUMP_LABEL=y", kasutades Clangi x86_64 arhitektuuriga süsteemides. Võttes arvesse eelmistes versioonides tehtud muudatusi, saab nüüd Linuxi kerneli Clangis ehitada x86_64 arhitektuuri jaoks (varem toetati ainult arm, aarch64, ppc32, ppc64le ja mips arhitektuuri ehitamist). Lisaks on Androidi ja ChromeOS-i projektid juba teisendatud nii, et need kasutaksid tuuma ehitamiseks Clangi ning Google katsetab Clangi kui peamist platvormi oma Linuxi tootmissüsteemide tuumade ehitamiseks. Tulevikus saab kerneli ehitusprotsessis kasutada muid LLVM-i komponente, sealhulgas LLD, llvm-objcopy, llvm-ar, llvm-nm ja llvm-objdump;
  • Lisatud eksperimentaalne tugi C++17 kasutamiseks OpenCL-is. Spetsiifiliste funktsioonide hulka kuuluvad aadressiruumi atribuutide tugi, aadressiruumi teisendamise blokeerimine tüübi ülekandmise operaatorite abil, vektoritüüpide pakkumine nagu OpenCL-is C jaoks, konkreetsete OpenCL-tüüpide olemasolu piltide, sündmuste, kanalite jne jaoks.
  • Lisatud uued kompilaatori lipud “-ftime-trace” ja “-ftime-trace-granularity=N”, et genereerida aruanne esiprogrammi erinevate etappide (parsimine, lähtestamine) ja taustaprogrammi (optimeerimisetapid) täitmisaja kohta. Aruanne salvestatakse json-vormingus, mis ühildub aadressidega chrome://tracing ja speedscope.app;
  • Lisatud spetsifikaatori “__declspec(allocator)” töötlemine ja kaasneva silumisinfo genereerimine, mis võimaldab jälgida mälutarbimist Visual Studio keskkonnas;
  • C-keele jaoks on lisatud tugi makrole „__FILE_NAME__”, mis sarnaneb makroga „__FILE__”, kuid sisaldab ainult failinime ilma täieliku teeta;
  • C++ on laiendanud aadressiruumi atribuutide tuge, et hõlmata erinevaid C++ funktsioone, sealhulgas parameetrite ja argumentide mustreid, viitetüüpe, tagastustüübi järeldusi, objekte, automaatselt genereeritud funktsioone, sisseehitatud operaatoreid ja palju muud.
  • Laiendatud on OpenCLi, OpenMP ja CUDA toega seotud võimalusi. See hõlmab esialgset tuge sisseehitatud OpenCL-i funktsioonide kaudsele kaasamisele (lipp "-fdeclare-opencl-builtins" on lisatud), tootelaiendus cl_arm_integer_dot_ on juurutatud ja diagnostikatööriistad on laiendatud;
  • Täiustatud on staatilise analüsaatori tööd ning lisatud on dokumentatsioon staatilise analüüsi tegemise kohta. Lisatud lipud saadaolevate kontrollimoodulite ja toetatud valikute kuvamiseks ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" ja "-analyzer-checker[-option]-help" " -arendaja"). Hoiatuste käsitlemiseks vigadena on lisatud lipp "-analyzer-werror".
    Lisatud uued kinnitusrežiimid:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling, et tuvastada puhvritega töötamise ohtlikud tavad;
    • osx.MIGChecker MIG (Mach Interface Generator) kõnereeglite rikkumiste otsimiseks;
    • optin.osx.OSObjectCStyleCast valede XNU libkerni objektide teisenduste leidmiseks;
    • apiModeling.llvm koos modelleerimise kontrollimise funktsioonide komplektiga, et tuvastada LLVM-i koodibaasis olevaid vigu;
    • Stabiliseeritud kood initsialiseerimata C++ objektide kontrollimiseks (UninitializedObject paketis optin.cplusplus);
  • Clang-format utiliit on lisanud C#-keeles koodi vormindamise toe ja toetab Microsofti kasutatavat koodivormingu stiili;
  • clang-cl, alternatiivne käsurea liides, mis pakub suvandite tasemel ühilduvust Visual Studios sisalduva cl.exe kompilaatoriga, on lisanud heuristika, et käsitleda olematuid faile käsurea suvanditena ja kuvada vastava hoiatuse (näiteks kui käivitate "clang-cl /diagnostic :caret /c test.cc");
  • Suur osa uutest tšekkidest on lisatud linteri klappimise tagamiseks, sealhulgas OpenMP API-le spetsiifilised kontrollid;
  • Laiendatud serveri võimalused kõlisema (Clang Server), milles on vaikimisi sisse lülitatud taustaindeksi koostamise režiim, lisatud on koodiga kontekstuaalsete toimingute tugi (muutujate otsimine, automaatsete ja makrode definitsioonide laiendamine, paastringide teisendamine paokoodita stringideks), kuvamisvõimalus Clang-tidy hoiatused, laiendatud päisefailide vigade diagnostika ja lisatud võimalus kuvada teavet tüübihierarhia kohta;

Kõik uuendused LLVM 9.0:

  • LLD linkerile on lisatud eksperimentaalne partitsioonifunktsioon, mis võimaldab jagada ühe programmi mitmeks osaks, millest igaüks asub eraldi ELF-failis. See funktsioon võimaldab käivitada programmi põhiosa, mis laadib töö käigus vajadusel ka muid komponente (näiteks saab sisseehitatud PDF-vaaturi eraldada eraldi failiks, mis laaditakse alles siis, kui kasutaja PDF-i avab fail).

    LLD linker esile tõstetud olekusse, mis sobib Linuxi kerneli linkimiseks arm32_7, arm64, ppc64le ja x86_64 arhitektuuride jaoks.
    Uued valikud "-" (väljund stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" ja "-z common-page-size". AArch64 arhitektuuri jaoks on lisatud BTI (Branch Target Indicator) ja PAC (pointer Authentication Code) juhiste tugi. MIPS, RISC-V ja PowerPC platvormide tugi on oluliselt paranenud. Lisatud WebAssembly dünaamilise linkimise esialgne tugi;

  • Libc++-s rakendatud funktsioonid ssize, std::is_constant_evaluated, std::midpoint ja std::lerp, meetodid "front" ja "back" on lisatud std::spanile, on lisatud tüüpide std::is_unbounded_array ja std::is_bounded_array atribuudid , std-võimalusi on laiendatud: :atomic. GCC 4.9 tugi on lõpetatud (saab kasutada GCC 5.1 ja uuemate väljalasetega). Lisatud tugi WASI (WebAssembly System Interface, liides WebAssembly kasutamiseks väljaspool brauserit);
  • Lisatud on uusi optimeerimisi. Mõnes olukorras on lubatud memcmp-kõnede teisendamine bcmp-ks. Vahemaa kontrollimata jätmine hüpatabelite puhul, kus alumised lülitiplokid on kättesaamatud või kui käske ei kasutata, näiteks funktsioonide kutsumisel tüübiga void;
  • RISC-V arhitektuuri taustaprogramm on stabiliseeritud, mis ei ole enam eksperimentaalne ja on vaikimisi ehitatud. Pakub täielikku koodi genereerimise tuge MAFDC laiendustega RV32I ja RV64I käsukomplekti variantidele;
  • X86, AArch64, ARM-i, SystemZ-i, MIPS-i, AMDGPU ja PowerPC-arhitektuuride taustaprogramme on tehtud arvukalt täiustusi. Näiteks arhitektuuri jaoks
    AArch64 lisas toe SVE2 (Scalable Vector Extension 2) ja MTE (Memory Tagging Extensions) juhistele; ARM-i taustaprogrammis lisati tugi Armv8.1-M arhitektuurile ja MVE (M-Profile Vector Extension) laiendusele. AMDGPU taustaprogrammile on lisatud GFX10 (Navi) arhitektuuri tugi, funktsioonide kutsumise võimalused on vaikimisi lubatud ja kombineeritud pääse on aktiveeritud DPP (Andmeparalleelprimitiivid).

  • LLDB siluril on nüüd värvide esiletõstmine tagasijälgede jaoks ja lisatud tugi DWARF4 debug_types ja DWARF5 debug_info plokkidele;
  • Utiliitidele llvm-objcopy ja llvm-strip on lisatud COFF-vormingus objekti- ja käivitatavate failide tugi.

Allikas: opennet.ru

Lisa kommentaar