Pagkatapos ng anim na buwang pag-develop, inilabas na ang LLVM 22.1.0. Bumubuo ito ng mga tool (mga compiler, optimizer, at code generator) na nagko-compile ng mga programa sa intermediate bitcode ng mga virtual instruction na parang RISC (isang low-level virtual machine na may multi-level optimization system). Ang nabuong pseudocode ay maaaring i-convert sa machine code para sa isang partikular na target platform o gamitin ng isang just-in-time (JIT) compiler upang direktang makabuo ng mga instruction ng makina habang isinasagawa ang programa. Batay sa mga teknolohiya ng LLVM, binubuo ng proyekto ang Clang compiler, na sumusuporta sa mga C, C++, at Objective-C programming language. Simula sa 18.x branch, lumipat ang proyekto sa isang bagong version numbering scheme, kung saan ang release 0 ("N.0") ay ginagamit habang nag-develop, at ang unang stable na bersyon ay may numerong "N.1."
Ang mga pagpapabuti sa Clang 22 ay kinabibilangan ng:
- Nagdagdag ng suporta para sa mga token ng alokasyon ng memorya (Mga Token ng Alokasyon) para sa pagmamarka ng mga operasyon ng alokasyon ng memorya na isinagawa gamit ang mga function tulad ng malloc na may natatanging identifier. Pinapayagan ng mga token ng alokasyon ang pagbubuo ng impormasyon ng heap, pagpapasimple ng pagtuklas ng tagas ng memorya, at pagpapagana ng pagpapangkat ng mga bagay batay sa kanilang layunin o mga pattern ng pagbabago (hal., paghihiwalay ng "mainit" mula sa "malamig" na data). Para paganahin, gamitin ang flag na "-fsanitize=alloc-token".
- Mga Katangiang Kaugnay ng Wikang C:
- Isang draft na espesipikasyon na tumutukoy sa mekanismo ng deferred execution na "defer" ay naipatupad na, na nagpapahintulot sa mga aksyon na maisagawa kapag lumabas na ang kasalukuyang saklaw. Idinagdag ang "-fdefer-ts" flag upang paganahin ang suporta sa "defer".
- Ang built-in na function na __builtin_stack_address() ay naidagdag na, na sumasalamin sa katulad na function sa GCC. Ibinabalik ng function na ito ang stack address na naghihiwalay sa stack area ng kasalukuyang function na tumawag sa __builtin_stack_address() at sa mga kasunod na function na tinatawag nito.
- Mga kakayahan na binuo para sa hinaharap na pamantayan ng C2y:
- Nagdagdag ng suporta para sa mga pinangalanang loop, na nagbibigay-daan sa iyong magtalaga ng mga pangalan sa mga loop at switch statement, na maaaring tukuyin sa mga break at continue statement upang tahasang tukuyin ang loop na lalabasan. 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 }
- Ang implementasyon ng built-in na "__COUNTER__" macro, na idinisenyo upang makabuo ng mga natatanging pangalan ng identifier, ay pinalawak at isinama sa pamantayan. Isang limitasyon na 2147483647 na tawag sa macro na ito ang naitakda; ang paglampas sa limitasyong ito ay magbubuo ng error.
- Tinanggal ang babala (-Wstatic-in-inline) kapag gumagamit ng mga static function o variable sa loob ng mga function na idineklara bilang "extern inline".
- Mga kakayahan na tinukoy sa pamantayan ng C23 C:
- Sinusuportahan na ngayon ng float.h header file ang mga macro na FLT_SNAN, DBL_SNAN, at LDBL_SNAN, na nagpapatupad ng mga signaled (na nagiging sanhi ng exception kapag ginamit sa mga operasyong aritmetika) na mga halaga ng NaN para sa mga float, double, at long double na uri.
- Inayos ang isang bug kung saan ang iba't ibang walang pangalang uri ay itinuring na tugma sa loob ng parehong yunit ng pagsasalin kung mayroon silang parehong mga field.
- Ang flag na "-MG" na ginagamit upang balewalain ang mga nawawalang header file habang nag-i-scan ng dependency ay pinalawak na sa mga direktiba na "#embed" at ngayon ay pinipigilan ang error na "file not found" kapag nawawala ang isang file na tinukoy sa isang direktiba na "#embed".
- Mga tampok na nauugnay sa C++:
- Ang kakayahang gumamit ng mga nakabalangkas na binding sa kontekstong "constexpr", gaya ng binuo sa ispesipikasyon ng C++2c (C++26). Nangangahulugan ito na ang mga sanggunian sa mga constant expression ay maaari na ngayong maging constant expression. Ipinapatupad ang suporta para sa mga array at simpleng istruktura (hindi pa sinusuportahan ang mga tuple). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Gaya ng hinihingi ng pamantayan ng C++20, ang mga constraint ay kino-convert na ngayon sa standard form bago ito suriin, na nagbibigay-daan para sa mas tumpak na mga mensahe ng diagnostic at wastong paghawak ng mga error sa pagpapalit sa mga argumento ng template na ginagamit lamang sa mga concept-id.
- Nagdagdag ng isang pamilya ng mga built-in na function na "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" upang malaman kung ang mga operator ng paghahambing na "<", ">", "<=", at ">=" ay na-synthesize mula sa operator na "<=>".
- Binago ang parameter na "-Wincompatible-pointer-types" para maglabas ng error sa halip na babala. Para bumalik sa nakaraang gawi, gamitin ang opsyong "-Wno-error=incompatible-pointer-types".
- Nagdagdag ng mga built-in na function na __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, at __builtin_dedup_pack. Halimbawa, pinapayagan ka ng builtin_dedup_pack na mag-alis ng mga duplicate mula sa isang listahan ng mga uri: gamit ang MyTypeList = TypeList<__builtin_dedup_pack β¦>; // ang magiging resultang uri ay magiging TypeList
- Kapag nagde-debug ng hindi natukoy na pag-uugali gamit ang UBSan (-fsanitize=undefined -fsanitize-trap=undefined), ang impormasyon tungkol sa sanhi ng error ay kasama na ngayon sa nabuong impormasyon sa pag-debug. Ang flag na "-fsanitize-debug-trap-reasons" ay idinagdag upang tukuyin ang antas ng detalye sa impormasyon ng error. Maaari itong itakda sa "basic" para sa mga pangkalahatang paglalarawan (hal., "Integer addition overflowed") at "detailed" upang isama ang detalyadong impormasyon (hal., "signed integer addition overflow in 'a + b'").
- Nagdagdag ng mga bagong flag ng compiler:
- "-f[no-]sanitize-debug-trap-reasons" para kontrolin kung ang mga dahilan ng exception trap ay naka-embed sa impormasyon ng debug kapag kino-compile gamit ang "-fsanitize-trap" mode.
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", at "-fsanitize-alloc-token-extended" para pamahalaan ang mga token ng alokasyon ng memorya.
- "-fmatrix-memory-layout" para kontrolin ang layout ng memorya ng mga uri ng matrix (hal. column-major para sa column-major, row-major para sa row-major).
- Ang mga function ngayon ay mayroon nang "malloc_span" na katangian, katulad ng malloc attribute ngunit naaangkop sa mga function na nagbabalik ng mga istrukturang parang span na naglalaman ng pointer at isang field na may sukat o pointer sa dulo ng block.
- Idinagdag ang katangiang "modular_format" upang dynamic na piliin ang kinakailangang staticly linked na implementasyon ng printf function sa oras ng link.
- Pinalawak ang mga kagamitan sa pagsusuri ng diagnostic at static, naidagdag ang mga bagong pagsusuri (ilang dosenang mga pagpapabuti na may kaugnayan sa diagnostic).
- Nagdagdag ng mga karagdagang intrinsic para sa mga extension ng SSE, AVX, at AVX512 sa X86 backend. Nagdagdag din ng mga Build mode para sa mga Intel CPU batay sa mga microarchitecture ng Wildcat Lake (-march=wildcatlake) at Nova Lake (-march=novalake).
- Sinusuportahan na ngayon ng AArch64 backend ang Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium), at Arm C1-Ultra (c1-ultra) processors. May mga karagdagang built-in na function na idinagdag para sa mga instruksyon ng FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US], at FCVTA[US]. Na-stabilize na ang suporta sa Function Multi-Versioning (FMV). Maaari na ngayong i-override ng mga user ang priority ng iba't ibang bersyon ng function.
- Nagdagdag ng suporta para sa arkitektura ng LoongArch32 (LA32R, LA32S).
- Pinahusay na mga backend para sa mga arkitektura ng ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly, at PowerPC.
Pinagmulan: opennet.ru
