Vydání sady kompilátorů LLVM 22

Po šesti měsících vývoje byl vydán LLVM 22.1.0. Vyvíjí nástroje (kompilátory, optimalizátory a generátory kódu), které kompilují programy do mezilehlé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 lze převést do strojového kódu pro danou cílovou platformu nebo jej použít kompilátorem just-in-time (JIT) ke generování strojových instrukcí přímo během provádění programu. Na základě technologií LLVM projekt vyvíjí kompilátor Clang, který podporuje programovací jazyky C, C++ a Objective-C. Počínaje větví 18.x projekt přešel na nové schéma číslování verzí, podle kterého se během vývoje používá vydání 0 („N.0“) a první stabilní verze je číslována „N.1“.

Vylepšení v Clang 22 zahrnují:

  • Přidána podpora pro tokeny alokace paměti (Alokační tokeny) pro označení operací alokace paměti prováděných pomocí funkcí, jako je malloc, jedinečným identifikátorem. Alokační tokeny umožňují strukturování informací o haldě, zjednodušení detekce úniků paměti a seskupování objektů na základě jejich účelu nebo vzorců modifikace (např. oddělení „horkých“ od „studených“ dat). Pro povolení použijte příznak „-fsanitize=alloc-token“.
  • Funkce související s jazykem C:
    • Byl implementován návrh specifikace definující mechanismus odloženého spuštění „defer“, který umožňuje spuštění akcí při ukončení aktuálního rozsahu. Byl přidán příznak „-fdefer-ts“, který umožňuje podporu „defer“.
    • Byla přidána vestavěná funkce __builtin_stack_address(), která zrcadlí podobnou funkci v GCC. Tato funkce vrací adresu zásobníku oddělující oblast zásobníku aktuální funkce, která volala __builtin_stack_address(), od následných funkcí, které volá.
  • Možnosti vyvíjené pro budoucí standard C2y:
    • Přidána podpora pro pojmenované smyčky, která umožňuje přiřazovat názvy smyčkám a příkazům switch. Tyto názvy lze zadat v příkazech break a continue a explicitně tak definovat smyčku, ze které se má smyčka ukončit. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // přechod na CONT1 continue outer; // přechod na CONT2 // CONT1 } // CONT2 }
    • Implementace vestavěného makra „__COUNTER__“, určeného pro generování jedinečných identifikátorů, byla rozšířena a zahrnuta do standardu. Byl nastaven limit 2147483647 volání tohoto makra; překročení tohoto limitu vygeneruje chybu.
    • Odstraněno varování (-Wstatic-in-inline) při použití statických funkcí nebo proměnných uvnitř funkcí deklarovaných jako „extern inline“.
  • Schopnosti definované ve standardu C23 C:
    • Záhlaví souboru float.h nyní podporuje makra FLT_SNAN, DBL_SNAN a LDBL_SNAN, která implementují signalizované (způsobující výjimku při použití v aritmetických operacích) hodnoty NaN pro typy float, double a long double.
    • Opravena chyba, kdy byly různé nepojmenované typy považovány za kompatibilní v rámci stejné překladové jednotky, pokud měly stejná pole.
    • Příznak „-MG“ používaný k ignorování chybějících hlavičkových souborů během skenování závislostí byl rozšířen na direktivy „#embed“ a nyní potlačuje chybu „soubor nenalezen“, když chybí soubor zadaný v direktivě „#embed“.
  • Funkce související s C++:
    • Byla přidána možnost používat strukturované vazby v kontextu „constexpr“, jak bylo vyvinuto ve specifikaci C++2c (C++26). To znamená, že odkazy na konstantní výrazy nyní mohou být samy o sobě konstantními výrazy. Je implementována podpora pro pole a jednoduché struktury (n-tice zatím nejsou podporovány). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
    • V souladu s požadavky standardu C++20 jsou nyní omezení před kontrolou převedena do standardního tvaru, což umožňuje přesnější diagnostické zprávy a správné zpracování chyb substituce v argumentech šablon používaných pouze v concept-id.
    • Přidána rodina vestavěných funkcí "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" pro zjištění, zda byly porovnávací operátory "<", ">", "<=" a ">=" syntetizovány z operátoru "<=>".
    • Parametr „-Wincompatible-pointer-types“ byl změněn tak, aby vypisoval chybu místo varování. Chcete-li se vrátit k předchozímu chování, použijte volbu „-Wno-error=incompatible-pointer-types“.
  • Přidány vestavěné funkce __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter a __builtin_dedup_pack. Například builtin_dedup_pack umožňuje odstranit duplikáty ze seznamu typů: using MyTypeList = TypeList<__builtin_dedup_pack …>; // výsledný typ bude TypeList
  • Při ladění nedefinovaného chování pomocí UBSan (-fsanitize=undefined -fsanitize-trap=undefined) jsou nyní informace o příčině chyby zahrnuty do generovaných ladicích informací. Byl přidán příznak „-fsanitize-debug-trap-reasons“ pro určení úrovně detailů v informacích o chybě. Lze jej nastavit na „základní“ pro obecné popisy (např. „Přetečení sčítání celočíselných čísel“) a na „podrobný“ pro zahrnutí podrobných informací (např. „Přetečení sčítání celočíselných čísel se znaménkem v 'a + b'“).
  • Přidány nové příznaky kompilátoru:
    • „-f[no-]sanitize-debug-trap-reasons“ pro kontrolu, zda jsou důvody zachycení výjimek vloženy do ladicích informací při kompilaci s režimem „-fsanitize-trap“.
    • „-fsanitize=alloc-token“, „-falloc-token-max“, „-fsanitize-alloc-token-fast-abi“ a „-fsanitize-alloc-token-extended“ pro správu tokenů alokace paměti.
    • „-fmatrix-memory-layout“ pro řízení rozložení paměti maticových typů (např. column-major pro column-major, row-major pro row-major).
  • Funkce nyní mají atribut „malloc_span“, podobný atributu malloc, ale použitelný pro funkce, které vracejí struktury podobné typu span obsahující ukazatel a pole s velikostí nebo ukazatel na konec bloku.
  • Přidán atribut „modular_format“ pro dynamický výběr požadované staticky linkované implementace funkce printf v době linkování.
  • Byly rozšířeny nástroje pro diagnostiku a statickou analýzu a byly přidány nové kontroly (několik desítek vylepšení souvisejících s diagnostikou).
  • Do backendu X86 byly přidány další intrinzické moduly pro rozšíření SSE, AVX a AVX512. Pro procesory Intel založené na mikroarchitekturách Wildcat Lake (-march=wildcatlake) a Nova Lake (-march=novalake) byly přidány režimy sestavení.
  • Backend AArch64 nyní podporuje procesory Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) a Arm C1-Ultra (c1-ultra). Pro instrukce FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] a FCVTA[US] byly přidány další vestavěné funkce. Podpora víceverzí funkcí (FMV) byla stabilizována. Uživatelé nyní mohou přepsat prioritu různých verzí funkcí.
  • Přidána podpora pro architekturu LoongArch32 (LA32R, LA32S).
  • Vylepšené backendy pro architektury ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly a PowerPC.

Zdroj: opennet.ru

Kupte si spolehlivý hosting pro stránky s DDoS ochranou, VPS VDS servery 🔥 Kupte si spolehlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster