No sechs Méint Entwécklung gouf LLVM 22.1.0 verëffentlecht. Et entwéckelt Tools (Compiler, Optimisatoren a Codegeneratoren), déi Programmer an intermediäre Bitcode vu RISC-ähnlechen virtuelle Instruktiounen (eng Low-Level virtuell Maschinn mat engem Multi-Level Optimiséierungssystem) kompiléieren. De generéierte Pseudocode kann a Maschinncode fir eng bestëmmt Zilplattform ëmgewandelt ginn oder vun engem Just-in-Time (JIT) Compiler benotzt ginn, fir Maschinninstruktiounen direkt während der Programmausféierung ze generéieren. Baséierend op LLVM Technologien entwéckelt de Projet de Clang Compiler, deen d'Programméiersprooche C, C++ an Objective-C ënnerstëtzt. Ugefaange mat der 18.x Branche ass de Projet op en neit Versiounsnummeréierungsschema gewiesselt, no deem Versioun 0 ("N.0") während der Entwécklung benotzt gëtt, an déi éischt stabil Versioun "N.1" nummeréiert ass.
Verbesserungen am Clang 22 enthalen:
- Ënnerstëtzung fir Speicherallokatiounstoken (Allocation Tokens) gouf bäigefüügt fir Speicherallokatiounsoperatiounen, déi mat Funktiounen wéi Malloc duerchgefouert ginn, mat engem eenzegaartegen Identifizéierer ze markéieren. Allokatiounstoken erlaben d'Strukturéierung vun Heap-Informatiounen, d'Vereinfachung vun der Detektioun vu Speicherlecken an d'Gruppéierung vun Objeten op Basis vun hirem Zweck oder Modifikatiounsmuster (z.B. d'Trennung vun "waarmen" vun "kalen" Daten). Fir dëst z'aktivéieren, benotzt de Fändel "-fsanitize=alloc-token".
- Funktiounen am Zesummenhang mat der C-Sprooch:
- En Entworf vun enger Spezifikatioun, déi de Mechanismus fir d'Ausféierung vun enger "defer" definéiert, gouf implementéiert, wat et erlaabt, Aktiounen auszeféieren, wann den aktuellen Ëmfang verléisst. De "-fdefer-ts"-Fändel gouf bäigefüügt, fir d'Ënnerstëtzung vun "defer" z'erméiglechen.
- Déi agebaute Funktioun __builtin_stack_address() gouf bäigefüügt, déi déi ähnlech Funktioun am GCC spigelt. Dës Funktioun gëtt d'Stack-Adress zréck, déi de Stackberäich vun der aktueller Funktioun, déi __builtin_stack_address() opgeruff huet, an déi spéider Funktiounen, déi se oprufft, trennt.
- Fäegkeeten, déi fir den zukünftege C2y-Standard entwéckelt ginn:
- Ënnerstëtzung fir benannt Schleifen gouf bäigefüügt, wat Iech erlaabt, Nimm un Schleifen zouzeweisen an Switch-Aussoen ze benotzen, déi a break- an continue-Aussoen spezifizéiert kënne ginn, fir explizit d'Schleif ze definéieren, aus där se erausgeet. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // go to CONT1 continue outer; // go to CONT2 // CONT1 } // CONT2 }
- D'Ëmsetzung vum agebaute Makro "__COUNTER__", deen entwéckelt gouf fir eenzegaarteg Identifikatiounsnimm ze generéieren, gouf erweidert an am Standard integréiert. Et gouf eng Limit vun 2147483647 Uruff un dëse Makro festgeluecht; wann dës Limit iwwerschratt gëtt, gëtt e Feeler generéiert.
- Warnung (-Wstatic-in-inline) gouf ewechgeholl wann statesch Funktiounen oder Variabelen an de Funktiounen benotzt goufen, déi als "extern inline" deklaréiert goufen.
- Fäegkeeten, déi am C23 C Standard definéiert sinn:
- D'Header-Datei float.h ënnerstëtzt elo d'Makroen FLT_SNAN, DBL_SNAN an LDBL_SNAN, déi signaliséiert NaN-Wäerter fir Float-, Double- a Long-Double-Typen implementéieren (wat eng Ausnam verursaacht wann se an arithmeteschen Operatiounen benotzt ginn).
- E Bug gouf behoben, wou verschidden onbenannt Typen an der selwechter Iwwersetzungseenheet als kompatibel behandelt goufen, wa se déiselwecht Felder haten.
- De Fändel "-MG", deen benotzt gëtt fir fehlend Header-Dateien beim Ofhängegkeetsscannen ze ignoréieren, gouf op "#embed"-Direktiven erweidert an ënnerdréckt elo de Feeler "Datei net fonnt", wann eng Datei, déi an enger "#embed"-Direktiv spezifizéiert ass, fehlt.
- C++-bezunn Funktiounen:
- D'Méiglechkeet, strukturéiert Bindungen am Kontext "constexpr" ze benotzen, wéi se an der C++2c (C++26) Spezifikatioun entwéckelt gouf, gouf bäigefüügt. Dëst bedeit, datt Referenzen op konstant Ausdréck elo selwer konstant Ausdréck kënne sinn. Ënnerstëtzung gëtt fir Arrays an einfach Strukturen implementéiert (Tupelen ginn nach net ënnerstëtzt). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Wéi vum C++20 Standard verlaangt, ginn Aschränkungen elo an d'Standardform ëmgewandelt, ier se iwwerpréift ginn, wat méi genee Diagnosmeldungen an eng korrekt Behandlung vu Substitutiounsfeeler an Template-Argumenter erméiglecht, déi nëmmen a Concept-IDs benotzt ginn.
- Eng Famill vun agebaute Funktiounen "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" gouf bäigefüügt fir erauszefannen, ob d'Vergläichsoperatoren "<", ">", "<=" an ">=" aus dem Operator "<=>" synthetiséiert goufen.
- De Parameter "-Wincompatible-pointer-types" gouf geännert, fir e Feeler amplaz vun enger Warnung auszeginn. Fir op dat viregt Verhalen zréckzekommen, benotzt d'Optioun "-Wno-error=incompatible-pointer-types".
- Agebaute Funktiounen __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, an __builtin_dedup_pack goufen derbäigesat. Zum Beispill erlaabt Iech builtin_dedup_pack Duplikater aus enger Lëscht vun Typen ze läschen: andeems Dir MyTypeList = TypeList<__builtin_dedup_pack benotzt. …>; // den resultéierenden Typ wäert TypeList sinn
- Beim Debug vun ondefinéiertem Verhalen mat UBSan (-fsanitize=undefined -fsanitize-trap=undefined), ginn d'Informatiounen iwwer d'Ursaach vum Feeler elo an den generéierten Debug-Informatiounen abegraff. De Fändel "-fsanitize-debug-trap-reasons" gouf bäigefüügt fir den Detailniveau an de Feelerinformatiounen ze spezifizéieren. E kann op "Basis" fir allgemeng Beschreiwungen (z.B. "Integer Addition Overflow") an op "Detailéiert" gesat ginn, fir detailléiert Informatiounen anzebannen (z.B. "Signed Integer Addition Overflow in 'a + b'").
- Nei Compiler Fändelen dobäigesat:
- "-f[no-]sanitize-debug-trap-reasons" fir ze kontrolléieren, ob Grënn fir Ausnam-Traps an der Debuginformatioun integréiert sinn, wann am Modus "-fsanitize-trap" kompiléiert gëtt.
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", an "-fsanitize-alloc-token-extended" fir d'Speicherallokatiounstoken ze verwalten.
- "-fmatrix-memory-layout" fir d'Speicherlayout vu Matrixtypen ze kontrolléieren (z.B. column-major fir column-major, row-major fir row-major).
- Funktiounen hunn elo en "malloc_span" Attribut, ähnlech wéi den malloc Attribut, awer uwendbar fir Funktiounen, déi span-ähnlech Strukturen zréckginn, déi e Zeiger an e Feld mat der Gréisst oder engem Zeiger um Enn vum Block enthalen.
- Den Attribut "modular_format" gouf bäigefüügt fir déi erfuerderlech statesch verlinkt Implementatioun vun der printf-Funktioun zum Zäitpunkt vun der Verlinkung dynamesch auszewielen.
- Diagnosesch an statesch Analysetools goufen erweidert, nei Kontrollen goufen derbäigesat (e puer Dosen diagnostesch Verbesserungen).
- Zousätzlech Intrinsik fir d'SSE-, AVX- an AVX512-Extensiounen goufen am X86-Backend bäigefüügt. Build-Modi goufen fir Intel-CPUs bäigefüügt, déi op de Wildcat Lake- (-march=wildcatlake)- an Nova Lake- (-march=novalake)-Mikroarchitekturen baséieren.
- Den AArch64 Backend ënnerstëtzt elo d'Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) an Arm C1-Ultra (c1-ultra) Prozessoren. Zousätzlech agebaute Funktiounen goufen fir d'FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] an FCVTA[US] Instruktiounen bäigefüügt. D'Ënnerstëtzung fir Function Multi-Versioning (FMV) gouf stabiliséiert. Benotzer kënnen elo d'Prioritéit vun ënnerschiddleche Funktiounsversiounen iwwerschreiwen.
- Ënnerstëtzung fir d'LoongArch32 (LA32R, LA32S) Architektur gouf bäigefüügt.
- Verbessert Backends fir ARM-, AMDGPU-, RISC-V-, LoongArch64-, MIPS-, WebAssembly- a PowerPC-Architekturen.
Source: opennet.ru
