Vydání sady kompilátorů LLVM 9.0

Po šesti měsících vývoje prezentovány vydání projektu LLVM 9.0 - Nástroje kompatibilní s GCC (kompilátory, optimalizátory a generátory kódu), které kompilují programy do středního bitového kódu virtuálních instrukcí podobných RISC (nízkoúrovňový virtuální stroj s víceúrovňovým optimalizačním systémem). Vygenerovaný pseudokód je možné převést JIT kompilátorem na strojové instrukce přímo v době provádění programu.

Mezi nové funkce LLVM 9.0 patří odstranění tagu experimental design z cílové platformy RISC-V, podpora C++ pro OpenCL, možnost rozdělit program na dynamicky načítané části v LLD a implementace „asm goto“, používaný v kódu jádra Linuxu. libc++ přidal podporu pro WASI (WebAssembly System Interface) a LLD přidal počáteční podporu pro dynamické propojení WebAssembly.

Vylepšení v Clang 9.0:

  • Přidal implementace výrazu specifického pro GCC "asm goto“, což vám umožňuje přejít z inline bloku assembleru na štítek v kódu C. Tato funkce je vyžadována pro sestavení linuxového jádra v režimu „CONFIG_JUMP_LABEL=y“ pomocí Clang na systémech s architekturou x86_64. Vezmeme-li v úvahu změny přidané v předchozích verzích, linuxové jádro lze nyní sestavit v Clang pro architekturu x86_64 (dříve bylo podporováno pouze sestavení pro architektury arm, aarch64, ppc32, ppc64le a mips). Projekty Android a ChromeOS již byly převedeny na použití Clang pro vytváření jádra a Google testuje Clang jako hlavní platformu pro vytváření jader pro své produkční systémy Linux. V budoucnu mohou být v procesu sestavování jádra použity další komponenty LLVM, včetně LLD, llvm-objcopy, llvm-ar, llvm-nm a llvm-objdump;
  • Přidána experimentální podpora pro použití C++17 v OpenCL. Mezi specifické vlastnosti patří podpora atributů adresního prostoru, blokování konverze adresního prostoru operátory přetypování typu, poskytování vektorových typů jako v OpenCL pro C, přítomnost specifických typů OpenCL pro obrázky, události, kanály atd.
  • Přidány nové příznaky kompilátoru „-ftime-trace“ a „-ftime-trace-granularity=N“ pro generování zprávy o době provádění různých fází frontendu (analýza, inicializace) a backendu (fáze optimalizace). Zpráva je uložena ve formátu json, kompatibilním s chrome://tracing a speedscope.app;
  • Přidáno zpracování specifikátoru „__declspec(allocator)“ a generování doprovodných informací o ladění, které vám umožní sledovat spotřebu paměti v prostředí Visual Studio;
  • Pro jazyk C byla přidána podpora pro makro „__FILE_NAME__“, které se podobá makru „__FILE__“, ale obsahuje pouze název souboru bez úplné cesty;
  • C++ rozšířilo podporu pro atributy adresního prostoru, aby pokrylo různé funkce jazyka C++, včetně vzorů parametrů a argumentů, typů odkazů, odvození návratových typů, objektů, automaticky generovaných funkcí, vestavěných operátorů a dalších.
  • Možnosti spojené s podporou OpenCL, OpenMP a CUDA byly rozšířeny. To zahrnuje počáteční podporu pro implicitní zahrnutí vestavěných funkcí OpenCL (byl přidán příznak „-fdeclare-opencl-builtins“), bylo implementováno rozšíření cl_arm_integer_dot_product a byly rozšířeny diagnostické nástroje;
  • Byla vylepšena práce statického analyzátoru a přidána dokumentace o provádění statické analýzy. Přidány příznaky pro zobrazení dostupných modulů kontroly a podporovaných možností („-analyzer-checker[-option]-help“, „-analyzer-checker[-option]-help-alpha“ a „-analyzer-checker[-option]-help "-vývojář"). Přidán příznak "-analyzer-werror", aby bylo varování považováno za chyby.
    Přidány nové ověřovací režimy:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling k identifikaci nebezpečných postupů pro práci s vyrovnávací paměti;
    • osx.MIGChecker pro vyhledávání porušení pravidel volání MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast k nalezení nesprávných konverzí objektů XNU libkern;
    • apiModeling.llvm se sadou funkcí pro kontrolu modelování pro detekci chyb v kódové základně LLVM;
    • Stabilizovaný kód pro kontrolu neinicializovaných objektů C++ (UninitializedObject v balíčku optin.cplusplus);
  • Obslužný program clang-format přidal podporu pro formátování kódu v jazyce C# a poskytuje podporu pro styl formátování kódu používaný společností Microsoft;
  • clang-cl, alternativní rozhraní příkazového řádku, které poskytuje kompatibilitu na úrovni možností s kompilátorem cl.exe obsaženým v sadě Visual Studio, přidalo heuristiku pro zpracování neexistujících souborů jako možností příkazového řádku a zobrazení odpovídajícího varování (např. při spuštění "clang-cl /diagnostic :caret /c test.cc");
  • Velká část nových kontrol byla přidána do linter clang-tidy, včetně přidaných kontrol specifických pro OpenMP API;
  • Rozšířený schopnosti serveru cinkal (Clang Server), ve kterém je standardně povolen režim vytváření indexu na pozadí, byla přidána podpora pro kontextové akce s kódem (variabilní načítání, rozšíření auto a makro definic, převod uniklých řetězců na neuescaped), možnost zobrazení varování od Clang-tidy, rozšířená diagnostika chyb v hlavičkových souborech a přidána možnost zobrazení informací o hierarchii typů;

hlavní inovace LLVM 9.0:

  • Do LLD linkeru byla přidána experimentální funkce rozdělení, která umožňuje rozdělit jeden program na několik částí, z nichž každá je umístěna v samostatném souboru ELF. Tato funkce umožňuje spustit hlavní část programu, která bude během provozu podle potřeby načítat další součásti (například můžete oddělit vestavěný prohlížeč PDF do samostatného souboru, který se načte, až když uživatel otevře PDF soubor).

    LLD Linker přinesl do stavu vhodného pro propojení linuxového jádra pro architektury 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". Pro architekturu AArch64 byla přidána podpora instrukcí BTI (Branch Target Indicator) a PAC (Pointer Authentication Code). Podpora platforem MIPS, RISC-V a PowerPC byla výrazně vylepšena. Přidána počáteční podpora pro dynamické propojení pro WebAssembly;

  • V libc++ implementováno funkce ssize, std::is_constant_evaluated, std::midpoint a std::lerp, metody „front“ a „back“ byly přidány do std::span, byly přidány atributy typů std::is_unbounded_array a std::is_bounded_array , std schopnosti byly rozšířeny: :atomic. Podpora pro GCC 4.9 byla ukončena (lze použít s GCC 5.1 a novějšími verzemi). Přidána podpora BYL JSEM (WebAssembly System Interface, rozhraní pro použití WebAssembly mimo prohlížeč);
  • Byly přidány nové optimalizace. V některých situacích povolen převod volání memcmp na bcmp. Implementováno vynechání kontroly rozsahu pro tabulky skoků, ve kterých jsou nižší bloky přepínačů nedosažitelné nebo když se instrukce nepoužívají, například při volání funkcí typu void;
  • Byl stabilizován backend pro architekturu RISC-V, který již není umístěn jako experimentální a je ve výchozím nastavení postaven. Poskytuje plnou podporu generování kódu pro varianty instrukční sady RV32I a RV64I s rozšířením MAFDC;
  • Byla provedena řada vylepšení backendů pro architektury X86, AArch64, ARM, SystemZ, MIPS, AMDGPU a PowerPC. Například pro architekturu
    AArch64 přidal podporu pro instrukce SVE2 (Scalable Vector Extension 2) a MTE (Memory Tagging Extensions), v backendu ARM byla přidána podpora architektury Armv8.1-M a rozšíření MVE (M-Profile Vector Extension). Do backendu AMDGPU byla přidána podpora architektury GFX10 (Navi), funkce volání funkcí jsou ve výchozím nastavení povoleny a je aktivován kombinovaný průchod DPP (Data-Parallel Primitives).

  • Ladicí program LLDB má nyní barevné zvýraznění pro zpětné stopy a přidanou podporu pro bloky DWARF4 debug_types a DWARF5 debug_info;
  • Do obslužných programů llvm-objcopy a llvm-strip byla přidána podpora pro objektové a spustitelné soubory ve formátu COFF.

Zdroj: opennet.ru

Přidat komentář