Vydanie sady kompilátorov LLVM 9.0

Po šiestich mesiacoch vývoja predložené vydanie projektu LLVM 9.0 — Nástroje kompatibilné s GCC (kompilátory, optimalizátory a generátory kódu), kompilujúce programy do stredného bitového kódu virtuálnych inštrukcií podobných RISC (nízkoúrovňový virtuálny stroj s viacúrovňovým optimalizačným systémom). Vygenerovaný pseudokód je možné previesť pomocou JIT kompilátora na strojové inštrukcie priamo v čase vykonávania programu.

Medzi nové funkcie LLVM 9.0 patrí odstránenie tagu experimentálneho dizajnu z cieľovej platformy RISC-V, podpora C++ pre OpenCL, možnosť rozdeliť program na dynamicky načítané časti v LLD a implementácia „asm goto“, ktorý sa používa v kóde jadra Linuxu. libc++ pridal podporu pre WASI (WebAssembly System Interface) a LLD pridal počiatočnú podporu pre dynamické prepojenie WebAssembly.

Vylepšenia v Clang 9.0:

  • Pridané implementácia výrazu špecifického pre GCC "asm goto“, ktorý vám umožňuje prejsť z inline bloku assemblera na štítok v kóde C. Táto funkcia je potrebná na zostavenie linuxového jadra v režime „CONFIG_JUMP_LABEL=y“ pomocou Clang na systémoch s architektúrou x86_64. Berúc do úvahy zmeny pridané v predchádzajúcich vydaniach, linuxové jadro je teraz možné zostaviť v Clang pre architektúru x86_64 (predtým bola podporovaná iba zostava pre architektúry arm, aarch64, ppc32, ppc64le a mips). Navyše, projekty Android a ChromeOS už boli prevedené na používanie Clang na vytváranie jadra a Google testuje Clang ako hlavnú platformu na vytváranie jadier pre svoje produkčné systémy Linux. V budúcnosti môžu byť v procese zostavovania jadra použité ďalšie komponenty LLVM, vrátane LLD, llvm-objcopy, llvm-ar, llvm-nm a llvm-objdump;
  • Pridaná experimentálna podpora pre používanie C++ 17 v OpenCL. Špecifické funkcie zahŕňajú podporu atribútov adresného priestoru, blokovanie konverzie adresného priestoru operátormi pretypovania, poskytovanie vektorových typov ako v OpenCL pre C, prítomnosť špecifických typov OpenCL pre obrázky, udalosti, kanály atď.
  • Pridané nové príznaky kompilátora „-ftime-trace“ a „-ftime-trace-granularity=N“ na generovanie správy o čase vykonávania rôznych fáz frontendu (analýza, inicializácia) a backendu (fázy optimalizácie). Správa je uložená vo formáte json, kompatibilnom s chrome://tracing a speedscope.app;
  • Pridané spracovanie špecifikátora „__declspec(allocator)“ a generovanie sprievodných informácií o ladení, ktoré vám umožňujú sledovať spotrebu pamäte v prostredí Visual Studio;
  • Pre jazyk C bola pridaná podpora pre makro „__FILE_NAME__“, ktoré sa podobá na makro „__FILE__“, ale obsahuje iba názov súboru bez úplnej cesty;
  • C++ rozšírilo podporu pre atribúty adresného priestoru, aby pokrylo rôzne funkcie jazyka C++, vrátane vzorov parametrov a argumentov, typov odkazov, odvodzovania návratových typov, objektov, automaticky generovaných funkcií, vstavaných operátorov a ďalších.
  • Rozšírili sa možnosti spojené s podporou OpenCL, OpenMP a CUDA. To zahŕňa počiatočnú podporu pre implicitné zahrnutie vstavaných funkcií OpenCL (bol pridaný príznak „-fdeclare-opencl-builtins“), implementovalo sa rozšírenie produktu cl_arm_integer_dot_product a rozšírili sa diagnostické nástroje;
  • Zlepšila sa práca statického analyzátora a pribudla dokumentácia o vykonávaní statickej analýzy. Pridané príznaky na zobrazenie dostupných modulov kontroly a podporovaných možností („-analyzer-checker[-option]-help“, „-analyzer-checker[-option]-help-alpha“ a „-analyzer-checker[-option]-help “ -vývojár”). Pridaný príznak „-analyzer-werror“, aby sa varovania považovali za chyby.
    Pridané nové režimy overovania:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling na identifikáciu nebezpečných praktík pri práci s vyrovnávacími pamäťami;
    • osx.MIGChecker na vyhľadávanie porušení pravidiel volania MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast na nájdenie nesprávnych konverzií objektov XNU libkern;
    • apiModeling.llvm so sadou funkcií na kontrolu modelovania na zisťovanie chýb v kódovej základni LLVM;
    • Stabilizovaný kód na kontrolu neinicializovaných objektov C++ (UninitializedObject v balíku optin.cplusplus);
  • Pomôcka clang-format pridala podporu pre formátovanie kódu v jazyku C# a poskytuje podporu pre štýl formátovania kódu používaný spoločnosťou Microsoft;
  • clang-cl, alternatívne rozhranie príkazového riadka, ktoré poskytuje kompatibilitu na úrovni možností s kompilátorom cl.exe, ktorý je súčasťou Visual Studio, pridalo heuristiku na spracovanie neexistujúcich súborov ako možností príkazového riadka a zobrazovanie zodpovedajúceho varovania (napr. pri spustení "clang-cl /diagnostic :caret /c test.cc");
  • Do linter clang-tidy bola pridaná veľká časť nových kontrol, vrátane pridaných kontrol špecifických pre OpenMP API;
  • Rozšírené schopnosti servera cinkal (Clang Server), v ktorom je štandardne povolený režim vytvárania indexu na pozadí, bola pridaná podpora pre kontextové akcie s kódom (variabilné získavanie, rozširovanie auto a makro definícií, konverzia uniknutých reťazcov na neuskočené), možnosť zobrazenia upozornenia od Clang-tidy, rozšírená diagnostika chýb v hlavičkových súboroch a pridaná možnosť zobrazenia informácií o hierarchii typov;

Hlavné inovácie LLVM 9.0:

  • Do LLD linkera bola pridaná experimentálna funkcia delenia, ktorá umožňuje rozdeliť jeden program na niekoľko častí, z ktorých každá je umiestnená v samostatnom súbore ELF. Táto funkcia umožňuje spustiť hlavnú časť programu, ktorá počas prevádzky načíta ďalšie komponenty podľa potreby (napríklad vstavaný prehliadač PDF môžete oddeliť do samostatného súboru, ktorý sa načíta až vtedy, keď používateľ otvorí PDF súbor).

    LLD Linker dostal do popredia do stavu vhodného na prepojenie linuxového jadra pre architektúry arm32_7, arm64, ppc64le a x86_64.
    Nové možnosti "-" (výstup do stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" a "-z common-page-size". Pre architektúru AArch64 bola pridaná podpora inštrukcií BTI (Branch Target Indicator) a PAC (Pointer Authentication Code). Podpora platforiem MIPS, RISC-V a PowerPC bola výrazne vylepšená. Pridaná počiatočná podpora pre dynamické prepojenie pre WebAssembly;

  • V libc++ implementovaná funkcie ssize, std::is_constant_evaluated, std::midpoint a std::lerp, metódy „front“ a „back“ boli pridané do std::span, boli pridané atribúty typov std::is_unbounded_array a std::is_bounded_array , std schopnosti boli rozšírené: :atomic. Podpora pre GCC 4.9 bola ukončená (dá sa použiť s GCC 5.1 a novšími vydaniami). Pridaná podpora BOL SOM (WebAssembly System Interface, rozhranie na používanie WebAssembly mimo prehliadača);
  • Boli pridané nové optimalizácie. Povolená konverzia volaní memcmp na bcmp v niektorých situáciách. Implementované vynechanie kontroly rozsahu pre tabuľky skokov, v ktorých sú spodné bloky spínačov nedosiahnuteľné alebo keď sa inštrukcie nepoužívajú, napríklad pri volaní funkcií typu void;
  • Stabilizoval sa backend pre architektúru RISC-V, ktorý už nie je umiestnený ako experimentálny a je štandardne zostavený. Poskytuje plnú podporu generovania kódu pre varianty inštrukčnej sady RV32I a RV64I s rozšíreniami MAFDC;
  • Boli vykonané početné vylepšenia backendov pre architektúry X86, AArch64, ARM, SystemZ, MIPS, AMDGPU a PowerPC. Napríklad pre architektúru
    AArch64 pridal podporu pre inštrukcie SVE2 (Scalable Vector Extension 2) a MTE (Memory Tagging Extensions) v backende ARM, bola pridaná podpora pre architektúru Armv8.1-M a rozšírenie MVE (M-Profile Vector Extension). Do backendu AMDGPU bola pridaná podpora pre architektúru GFX10 (Navi), možnosti volania funkcií sú predvolene povolené a je aktivovaný kombinovaný priechod DPP (Dátovo-paralelné primitívy).

  • Ladiaci nástroj LLDB má teraz farebné zvýraznenie pre spätné stopy a pridanú podporu pre bloky DWARF4 debug_types a DWARF5 debug_info;
  • Do pomocných programov llvm-objcopy a llvm-strip bola pridaná podpora pre objektové a spustiteľné súbory vo formáte COFF.

Zdroj: opennet.ru

Pridať komentár