Post ses monatoj da disvolviĝo, LLVM 22.1.0 estis publikigita. Ĝi disvolvas ilojn (kompililojn, optimumigilojn kaj kodgeneratorojn) kiuj kompilas programojn en mezan bitkodon de RISC-similaj virtualaj instrukcioj (malaltnivela virtuala maŝino kun plurnivela optimumiga sistemo). La generita pseŭdokodo povas esti konvertita en maŝinkodon por difinita cela platformo aŭ uzata de ĝustatempa (JIT) kompililo por generi maŝininstrukciojn rekte dum programplenumo. Bazite sur LLVM-teknologioj, la projekto disvolvas la Clang-kompililon, subtenante la programlingvojn C, C++ kaj Objective-C. Ekde la branĉo 18.x, la projekto ŝanĝis al nova versia numera skemo, laŭ kiu eldono 0 ("N.0") estas uzata dum disvolviĝo, kaj la unua stabila versio estas numerita "N.1".
Inter la plibonigoj en Clang 22:
- Aldonita subteno por memoraj asignaj ĵetonoj (Asignaj Ĵetonoj) por marki memorajn asignajn operaciojn faritajn per funkcioj kiel malloc kun unika identigilo. Asignaj ĵetonoj ebligas strukturi stakajn informojn, simpligi detekton de memorlikoj, kaj ebligi grupigon de objektoj laŭ ilia celo aŭ modifŝablonoj (ekz., apartigi "varmajn" de "malvarmaj" datumoj). Por ebligi, uzu la flagon "-fsanitize=alloc-token".
- Trajtoj rilataj al la lingvo C:
- Skiza specifo difinanta la mekanismon de prokrastita plenumo "prokrastita" estis efektivigita, permesante plenumi agojn kiam la nuna amplekso eliras. La flago "-fdefer-ts" estis aldonita por ebligi subtenon por "prokrastita".
- La enkonstruita funkcio __builtin_stack_address() estis aldonita, spegulante la similan funkcion en GCC. Ĉi tiu funkcio redonas la stakadreson, apartigante la stakregionon de la nuna funkcio, kiu vokis __builtin_stack_address(), kaj la postajn funkciojn, kiujn ĝi vokas.
- Kapabloj disvolvataj por la estonta normo C2y:
- Aldonita subteno por nomitaj bukloj, kiu permesas al vi asigni nomojn al bukloj kaj switch-deklaroj, kiuj povas esti specifitaj en break- kaj continue-deklaroj por eksplicite difini la buklon el kiu eliri. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // iru al CONT1 continue outer; // iru al CONT2 // CONT1 } // CONT2 }
- La efektivigo de la enkonstruita makro "__COUNTER__", destinita por generi unikajn identigilojn, estis vastigita kaj inkluzivita en la normon. Limo de 2147483647 vokoj al ĉi tiu makro estis difinita; superi ĉi tiun limon generos eraron.
- Forigis averton (-Wstatic-in-inline) dum uzado de statikaj funkcioj aŭ variabloj ene de funkcioj deklaritaj kiel "extern inline".
- Kapabloj difinitaj en la normo C23 C:
- La kapdosiero float.h nun subtenas la makroojn FLT_SNAN, DBL_SNAN, kaj LDBL_SNAN, kiuj efektivigas signalitajn (kaŭzante escepton kiam uzataj en aritmetikaj operacioj) NaN valorojn por tipoj float, double, kaj long double.
- Riparis cimon, kie malsamaj nenomitaj tipoj estis traktataj kiel kongruaj ene de la sama tradukunuo se ili havis la samajn kampojn.
- La flago "-MG" uzata por ignori mankantajn kapdosierojn dum dependeca skanado estis etendita al direktivoj "#embed" kaj nun subpremas la eraron "dosiero ne trovita" kiam dosiero specifita en direktivo "#embed" mankas.
- Trajtoj rilataj al C++:
- La kapablo uzi strukturitajn ligadojn en la kunteksto "constexpr", kiel evoluigite en la specifo C++2c (C++26), estis aldonita. Tio signifas, ke referencoj al konstantaj esprimoj nun povas mem esti konstantaj esprimoj. Subteno estas efektivigita por tabeloj kaj simplaj strukturoj (tuploj ankoraŭ ne estas subtenataj). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Kiel postulite de la normo C++20, limigoj nun estas konvertitaj al norma formo antaŭ ol esti kontrolitaj, ebligante pli precizajn diagnozajn mesaĝojn kaj ĝustan traktadon de anstataŭigaj eraroj en ŝablonargumentoj uzataj nur en koncepto-identigiloj.
- Aldonis familion de enkonstruitaj funkcioj "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" por ekscii ĉu la komparaj operatoroj "<", ">", "<=", kaj ">=" estis sintezitaj el la operatoro "<=>".
- La parametro "-Wincompatible-pointer-types" estis ŝanĝita por eligi eraron anstataŭ averton. Por reveni al la antaŭa konduto, uzu la opcion "-Wno-error=incompatible-pointer-types".
- Aldonitaj enkonstruitaj funkcioj __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, kaj __builtin_dedup_pack. Ekzemple, builtin_dedup_pack permesas forigi duplikatojn el listo de tipoj: uzante MyTypeList = TypeList<__builtin_dedup_pack ...>; // la rezulta tipo estos TipoListo
- Kiam oni sencimigas nedifinitan konduton per UBSan (-fsanitize=undefined -fsanitize-trap=undefined), informoj pri la kaŭzo de eraro nun estas inkluzivitaj en la generitaj sencimigaj informoj. La flago "-fsanitize-debug-trap-reasons" estis aldonita por specifi la nivelon de detalo en erarinformoj. Ĝi povas esti agordita al "baza" por ĝeneralaj priskriboj (ekz., "Entjera adicio superfluis") kaj al "detala" por inkluzivi detalajn informojn (ekz., "signita entjera adicio superfluis en 'a + b'").
- Aldonitaj novaj kompililoj:
- "-f[no-]sanitize-debug-trap-reasons" por kontroli ĉu esceptaj kaptilaj kialoj estas enigitaj en sencimigajn informojn dum kompilado kun la reĝimo "-fsanitize-trap".
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", kaj "-fsanitize-alloc-token-extended" por administri memorajn asigno-ĵetonojn.
- "-fmatrix-memory-layout" por regi la memoraranĝon de matricaj tipoj (ekz. kolumno-ĉefa por kolumno-ĉefa, vico-ĉefa por vico-ĉefa).
- Funkcioj nun havas atributon "malloc_span", similan al la atributo malloc sed aplikeblan al funkcioj kiuj redonas span-similajn strukturojn enhavantajn montrilon kaj kampon kun la grandeco aŭ montrilon al la fino de la bloko.
- Aldonis la atributon "modular_format" por dinamike elekti la bezonatan statike ligitan efektivigon de la funkcio printf dum la ligtempo.
- Diagnozaj kaj statikaj analizaj iloj estis vastigitaj, novaj kontroloj estis aldonitaj (pluraj dekduoj da diagnozaj plibonigoj).
- Pliaj internaj elementoj por la etendaĵoj SSE, AVX, kaj AVX512 estis aldonitaj al la X86-fonto. Konstrureĝimoj estis aldonitaj por Intel-procesoroj bazitaj sur la mikroarkitekturoj Wildcat Lake (-march=wildcatlake) kaj Nova Lake (-march=novalake).
- La AArch64-fonto nun subtenas la procesorojn Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium), kaj Arm C1-Ultra (c1-ultra). Pliaj enkonstruitaj funkcioj estis aldonitaj por la instrukcioj FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US], kaj FCVTA[US]. La subteno por Funkcia Multversiigo (FMV) estis stabiligita. Uzantoj nun povas superregi la prioritaton de malsamaj funkciaj versioj.
- Aldonita subteno por la arkitekturo LoongArch32 (LA32R, LA32S).
- Plibonigitaj fonaj sistemoj por arkitekturoj ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly kaj PowerPC.
fonto: opennet.ru
