ఆరు నెలల అభివృద్ధి తర్వాత, LLVM 22.1.0 విడుదలైంది. ఇది RISC-వంటి వర్చువల్ సూచనల (బహుళ-స్థాయి ఆప్టిమైజేషన్ సిస్టమ్తో కూడిన తక్కువ-స్థాయి వర్చువల్ మెషిన్) ఇంటర్మీడియట్ బిట్కోడ్గా ప్రోగ్రామ్లను కంపైల్ చేసే సాధనాలను (కంపైలర్లు, ఆప్టిమైజర్లు మరియు కోడ్ జనరేటర్లు) అభివృద్ధి చేస్తుంది. ఉత్పత్తి చేయబడిన సూడోకోడ్ను ఇచ్చిన లక్ష్య ప్లాట్ఫారమ్ కోసం మెషిన్ కోడ్గా మార్చవచ్చు లేదా ప్రోగ్రామ్ అమలు సమయంలో నేరుగా మెషిన్ సూచనలను రూపొందించడానికి జస్ట్-ఇన్-టైమ్ (JIT) కంపైలర్ ద్వారా ఉపయోగించబడుతుంది. LLVM టెక్నాలజీల ఆధారంగా, ప్రాజెక్ట్ C, C++ మరియు ఆబ్జెక్టివ్-C ప్రోగ్రామింగ్ భాషలకు మద్దతు ఇచ్చే క్లాంగ్ కంపైలర్ను అభివృద్ధి చేస్తోంది. 18.x బ్రాంచ్తో ప్రారంభించి, ప్రాజెక్ట్ కొత్త వెర్షన్ నంబరింగ్ స్కీమ్కు మారింది, దీని ప్రకారం విడుదల 0 ("N.0") అభివృద్ధి సమయంలో ఉపయోగించబడుతుంది మరియు మొదటి స్థిరమైన వెర్షన్ "N.1" సంఖ్యతో ఉంటుంది.
క్లాంగ్ 22లో మెరుగుదలలు:
- మాలోక్ వంటి ఫంక్షన్లను ఉపయోగించి నిర్వహించే మెమరీ కేటాయింపు కార్యకలాపాలను ఒక ప్రత్యేక ఐడెంటిఫైయర్తో గుర్తించడానికి మెమరీ కేటాయింపు టోకెన్లకు (అలోకేషన్ టోకెన్లు) మద్దతు జోడించబడింది. కేటాయింపు టోకెన్లు హీప్ సమాచారాన్ని స్ట్రక్చర్ చేయడానికి, మెమరీ లీక్ డిటెక్షన్ను సరళీకృతం చేయడానికి మరియు వాటి ప్రయోజనం లేదా సవరణ నమూనాల ఆధారంగా వస్తువులను సమూహపరచడానికి అనుమతిస్తాయి (ఉదా., "హాట్" నుండి "కోల్డ్" డేటాను వేరు చేయడం). ప్రారంభించడానికి, "-fsanitize=alloc-token" ఫ్లాగ్ను ఉపయోగించండి.
- సి భాషకు సంబంధించిన లక్షణాలు:
- "defer" డిఫర్డ్ ఎగ్జిక్యూషన్ మెకానిజంను నిర్వచించే డ్రాఫ్ట్ స్పెసిఫికేషన్ అమలు చేయబడింది, ఇది ప్రస్తుత స్కోప్ నుండి నిష్క్రమించినప్పుడు చర్యలను అమలు చేయడానికి అనుమతిస్తుంది. "defer" మద్దతును ప్రారంభించడానికి "-fdefer-ts" ఫ్లాగ్ జోడించబడింది.
- అంతర్నిర్మిత ఫంక్షన్ __builtin_stack_address() జోడించబడింది, ఇది GCC లోని ఇలాంటి ఫంక్షన్ను ప్రతిబింబిస్తుంది. ఈ ఫంక్షన్ __builtin_stack_address() అని పిలువబడే ప్రస్తుత ఫంక్షన్ యొక్క స్టాక్ ప్రాంతాన్ని మరియు అది పిలిచే తదుపరి ఫంక్షన్లను వేరు చేసే స్టాక్ చిరునామాను తిరిగి ఇస్తుంది.
- భవిష్యత్ C2y ప్రమాణం కోసం అభివృద్ధి చేయబడుతున్న సామర్థ్యాలు:
- నేమ్డ్ లూప్లకు మద్దతు జోడించబడింది, ఇది లూప్లకు పేర్లను కేటాయించడానికి మరియు స్టేట్మెంట్లను మార్చడానికి మిమ్మల్ని అనుమతిస్తుంది, వీటిని బ్రేక్ మరియు కంటిన్యు స్టేట్మెంట్లలో పేర్కొనవచ్చు, దీని నుండి నిష్క్రమించడానికి లూప్ను స్పష్టంగా నిర్వచించవచ్చు. 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 }
- ప్రత్యేక ఐడెంటిఫైయర్ పేర్లను రూపొందించడానికి రూపొందించబడిన అంతర్నిర్మిత "__COUNTER__" మాక్రో అమలు విస్తరించబడింది మరియు ప్రమాణంలో చేర్చబడింది. ఈ మాక్రోకు 2147483647 కాల్ల పరిమితిని సెట్ చేశారు; ఈ పరిమితిని మించితే లోపం ఏర్పడుతుంది.
- "బాహ్య ఇన్లైన్"గా ప్రకటించబడిన ఫంక్షన్ల లోపల స్టాటిక్ ఫంక్షన్లు లేదా వేరియబుల్లను ఉపయోగిస్తున్నప్పుడు హెచ్చరిక (-Wstatic-in-inline) తీసివేయబడింది.
- C23 C ప్రమాణంలో నిర్వచించబడిన సామర్థ్యాలు:
- float.h హెడర్ ఫైల్ ఇప్పుడు FLT_SNAN, DBL_SNAN మరియు LDBL_SNAN మాక్రోలకు మద్దతు ఇస్తుంది, ఇవి ఫ్లోట్, డబుల్ మరియు లాంగ్ డబుల్ రకాల కోసం సిగ్నల్డ్ (అంకగణిత కార్యకలాపాలలో ఉపయోగించినప్పుడు మినహాయింపును కలిగిస్తాయి) NaN విలువలను అమలు చేస్తాయి.
- ఒకే అనువాద యూనిట్లో ఒకే ఫీల్డ్లు ఉంటే, వివిధ పేరులేని రకాలను అనుకూలంగా పరిగణించే బగ్ పరిష్కరించబడింది.
- డిపెండెన్సీ స్కానింగ్ సమయంలో తప్పిపోయిన హెడర్ ఫైళ్ళను విస్మరించడానికి ఉపయోగించే "-MG" ఫ్లాగ్ "#embed" డైరెక్టివ్లకు విస్తరించబడింది మరియు ఇప్పుడు "#embed" డైరెక్టివ్లో పేర్కొన్న ఫైల్ తప్పిపోయినప్పుడు "ఫైల్ కనుగొనబడలేదు" లోపాన్ని అణిచివేస్తుంది.
- C++ సంబంధిత లక్షణాలు:
- C++2c (C++26) స్పెసిఫికేషన్లో అభివృద్ధి చేయబడిన "constexpr" సందర్భంలో నిర్మాణాత్మక బైండింగ్లను ఉపయోగించే సామర్థ్యం జోడించబడింది. దీని అర్థం స్థిరమైన వ్యక్తీకరణలకు సూచనలు ఇప్పుడు స్థిరమైన వ్యక్తీకరణలుగా ఉంటాయి. శ్రేణులు మరియు సాధారణ నిర్మాణాలకు మద్దతు అమలు చేయబడింది (tuples ఇంకా మద్దతు ఇవ్వబడలేదు). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- C++20 ప్రమాణం ప్రకారం, ఇప్పుడు తనిఖీ చేయడానికి ముందు పరిమితులు ప్రామాణిక రూపంలోకి మార్చబడతాయి, ఇది కాన్సెప్ట్-ఐడిలలో మాత్రమే ఉపయోగించే టెంప్లేట్ ఆర్గ్యుమెంట్లలో మరింత ఖచ్చితమైన విశ్లేషణ సందేశాలను మరియు ప్రత్యామ్నాయ లోపాలను సరిగ్గా నిర్వహించడానికి అనుమతిస్తుంది.
- "<", ">", "<=", మరియు ">=" అనే కంపారిజన్ ఆపరేటర్లు "<=>" ఆపరేటర్ నుండి సంశ్లేషణ చేయబడ్డాయో లేదో తెలుసుకోవడానికి "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" అనే బిల్ట్-ఇన్ ఫంక్షన్ల కుటుంబాన్ని జోడించారు.
- "-Wincompatible-pointer-types" పరామితి హెచ్చరికకు బదులుగా లోపాన్ని అవుట్పుట్ చేయడానికి మార్చబడింది. మునుపటి ప్రవర్తనకు తిరిగి రావడానికి, "-Wno-error=incompatible-pointer-types" ఎంపికను ఉపయోగించండి.
- __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumn, __builtin_elementwise_maxnumn, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter, మరియు __builtin_dedup_pack అనే అంతర్నిర్మిత ఫంక్షన్లను జోడించారు. ఉదాహరణకు, builtin_dedup_pack రకాల జాబితా నుండి నకిలీలను తొలగించడానికి మిమ్మల్ని అనుమతిస్తుంది: MyTypeList = TypeList<__builtin_dedup_pack ఉపయోగించి …>; // ఫలిత రకం TypeList అవుతుంది
- UBSan (-fsanitize=undefined -fsanitize-trap=undefined) తో నిర్వచించబడని ప్రవర్తనను డీబగ్ చేస్తున్నప్పుడు, ఇప్పుడు జనరేట్ చేయబడిన డీబగ్ సమాచారంలో దోష కారణ సమాచారం చేర్చబడుతుంది. దోష సమాచారంలో వివరాల స్థాయిని పేర్కొనడానికి "-fsanitize-debug-trap-reasons" ఫ్లాగ్ జోడించబడింది. దీనిని సాధారణ వివరణల కోసం "ప్రాథమిక" (ఉదా., "పూర్ణాంకాల జోడింపు ఓవర్ఫ్లోడ్") మరియు వివరణాత్మక సమాచారాన్ని చేర్చడానికి "వివరణాత్మక" (ఉదా., "'a + b'లో సంతకం చేయబడిన పూర్ణాంక జోడింపు ఓవర్ఫ్లో") కు సెట్ చేయవచ్చు.
- కొత్త కంపైలర్ ఫ్లాగ్లు జోడించబడ్డాయి:
- "-fsanitize-trap" మోడ్తో కంపైల్ చేస్తున్నప్పుడు డీబగ్ సమాచారంలో మినహాయింపు ట్రాప్ కారణాలు పొందుపరచబడ్డాయో లేదో నియంత్రించడానికి "-f[no-]sanitize-debug-trap-reasons".
- మెమరీ కేటాయింపు టోకెన్లను నిర్వహించడానికి "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", మరియు "-fsanitize-alloc-token-extended".
- మ్యాట్రిక్స్ రకాల మెమరీ లేఅవుట్ను నియంత్రించడానికి "-fmatrix-memory-layout" (ఉదా. కాలమ్-మేజర్ కోసం కాలమ్-మేజర్, రో-మేజర్ కోసం రో-మేజర్).
- ఫంక్షన్లు ఇప్పుడు "malloc_span" లక్షణాన్ని కలిగి ఉన్నాయి, ఇది malloc లక్షణాన్ని పోలి ఉంటుంది కానీ బ్లాక్ చివర పరిమాణం లేదా పాయింటర్తో పాయింటర్ మరియు ఫీల్డ్ను కలిగి ఉన్న స్పాన్-లాంటి నిర్మాణాలను తిరిగి ఇచ్చే ఫంక్షన్లకు వర్తిస్తుంది.
- లింక్ సమయంలో printf ఫంక్షన్ యొక్క అవసరమైన స్టాటిక్గా లింక్ చేయబడిన అమలును డైనమిక్గా ఎంచుకోవడానికి "modular_format" లక్షణాన్ని జోడించాము.
- డయాగ్నస్టిక్ మరియు స్టాటిక్ విశ్లేషణ సాధనాలు విస్తరించబడ్డాయి, కొత్త తనిఖీలు జోడించబడ్డాయి (అనేక డజన్ల డయాగ్నస్టిక్-సంబంధిత మెరుగుదలలు).
- SSE, AVX మరియు AVX512 ఎక్స్టెన్షన్ల కోసం అదనపు అంతర్గత అంశాలు X86 బ్యాకెండ్కు జోడించబడ్డాయి. వైల్డ్క్యాట్ లేక్ (-march=wildcatlake) మరియు నోవా లేక్ (-march=novalake) మైక్రోఆర్కిటెక్చర్ల ఆధారంగా ఇంటెల్ CPUల కోసం బిల్డ్ మోడ్లు జోడించబడ్డాయి.
- AArch64 బ్యాకెండ్ ఇప్పుడు ఆంపియర్ కంప్యూటింగ్ ఆంపియర్1C (ampere1c), ఆర్మ్ C1-నానో (c1-నానో), ఆర్మ్ C1-ప్రో (c1-ప్రో), ఆర్మ్ C1-ప్రీమియం (c1-ప్రీమియం), మరియు ఆర్మ్ C1-అల్ట్రా (c1-అల్ట్రా) ప్రాసెసర్లకు మద్దతు ఇస్తుంది. FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US], మరియు FCVTA[US] సూచనల కోసం అదనపు అంతర్నిర్మిత ఫంక్షన్లు జోడించబడ్డాయి. ఫంక్షన్ మల్టీ-వెర్షనింగ్ (FMV) మద్దతు స్థిరీకరించబడింది. వినియోగదారులు ఇప్పుడు వివిధ ఫంక్షన్ వెర్షన్ల ప్రాధాన్యతను భర్తీ చేయవచ్చు.
- LoongArch32 (LA32R, LA32S) ఆర్కిటెక్చర్కు మద్దతు జోడించబడింది.
- ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly మరియు PowerPC ఆర్కిటెక్చర్ల కోసం మెరుగైన బ్యాకెండ్లు.
మూలం: opennet.ru
