ఆరు నెలల అభివృద్ధి తర్వాత, LLVM 16.0 ప్రాజెక్ట్ విడుదల చేయబడింది - GCC-అనుకూల టూల్కిట్ (కంపైలర్లు, ఆప్టిమైజర్లు మరియు కోడ్ జనరేటర్లు) ఇది ప్రోగ్రామ్లను RISC-వంటి వర్చువల్ సూచనల యొక్క ఇంటర్మీడియట్ బిట్కోడ్గా కంపైల్ చేస్తుంది (ఒక తక్కువ-స్థాయి వర్చువల్ మెషీన్తో బహుళ-స్థాయి ఆప్టిమైజేషన్ సిస్టమ్). ఉత్పత్తి చేయబడిన సూడోకోడ్ను JIT కంపైలర్ని ఉపయోగించి ప్రోగ్రామ్ అమలు సమయంలో నేరుగా మెషీన్ సూచనలుగా మార్చవచ్చు.
క్లాంగ్ 16.0లో ప్రధాన మెరుగుదలలు:
- డిఫాల్ట్ C++/ObjC++ ప్రమాణం gnu++17 (గతంలో gnu++14), అంటే GNU పొడిగింపులతో కూడిన C++17 ఫీచర్లు డిఫాల్ట్గా మద్దతునిస్తాయి. మునుపటి ప్రవర్తనను తిరిగి ఇవ్వడానికి, మీరు "-std=gnu++14" ఎంపికను ఉపయోగించవచ్చు.
- C++20 ప్రమాణానికి సంబంధించిన అధునాతన ఫీచర్లు అమలు చేయబడ్డాయి:
- షరతులతో కూడిన అల్పమైన ప్రత్యేక సభ్యుల విధులు,
- లాంబ్డా ఫంక్షన్లలో నిర్మాణాత్మక బైండింగ్లను సంగ్రహించడం,
- వ్యక్తీకరణల లోపల సమానత్వ ఆపరేటర్,
- కొన్ని సందర్భాలలో టైప్నేమ్ కీవర్డ్ను వదిలివేయడానికి ఎంపిక,
- కుండలీకరణాల్లో చెల్లుబాటు అయ్యే మొత్తం ప్రారంభించడం (“Aggr(val1, val2)”).
- భవిష్యత్ C++2b ప్రమాణంలో నిర్వచించబడిన లక్షణాలు అమలు చేయబడ్డాయి:
- సమ్మేళనం వ్యక్తీకరణల చివర లేబుల్లను ఉంచడానికి ఇది అనుమతించబడుతుంది,
- స్టాటిక్ ఆపరేటర్(),
- స్టాటిక్ ఆపరేటర్[],
- char8_t రకంతో అనుకూలత నిర్ధారించబడింది,
- "\N{...}"లో ఉపయోగించడానికి అనుమతించబడిన అక్షరాల పరిధి విస్తరించబడింది
- constexprగా ప్రకటించబడిన ఫంక్షన్లలో "స్టాటిక్ constexpr"గా ప్రకటించబడిన వేరియబుల్లను ఉపయోగించగల సామర్థ్యం జోడించబడింది.
- భవిష్యత్ C-ప్రామాణిక C2xలో నిర్వచించబడిన లక్షణాలు అమలు చేయబడ్డాయి:
- "-Wunused-label" హెచ్చరికను నిలిపివేయడానికి, "[[maybe_unused]]" లక్షణం లేబుల్లకు వర్తింపజేయడానికి అనుమతించబడుతుంది
- సమ్మేళనం వ్యక్తీకరణలలో ఎక్కడైనా లేబుల్లను ఉంచడానికి ఇది అనుమతించబడుతుంది,
- టైప్ఆఫ్ మరియు టైప్ఆఫ్_అన్క్వల్ ఆపరేటర్లు జోడించబడ్డాయి,
- కొత్త రకం nullptr_t మరియు nullptr స్థిరాంకం శూన్య పాయింటర్లను నిర్వచించవచ్చు, ఇవి ఏదైనా పాయింటర్ రకానికి మార్చగలవు మరియు పూర్ణాంకం మరియు శూన్య* రకాలకు కట్టుబడి ఉండని NULL యొక్క రూపాంతరాన్ని సూచిస్తాయి.
- C2x మోడ్లో, వేరియబుల్ ఆర్గ్యుమెంట్ల సంఖ్య (వేరియాడిక్)తో va_start మాక్రోకు కాల్ చేయడం అనుమతించబడుతుంది.
- C99, C11 మరియు C17 సమ్మతి మోడ్లలో, డిఫాల్ట్ ఎంపికలు "-Wimplicit-function-declaration" మరియు "-Wimplicit-int" ఇప్పుడు హెచ్చరికకు బదులుగా లోపాన్ని ఉత్పత్తి చేస్తాయి.
- C++ మోడ్లో "శూన్యం *" (ఉదా. "void func(void *p) { *p; }") యొక్క పరోక్ష ఉపయోగం ఇప్పుడు ISO C++, GCC, ICC మరియు MSVC మాదిరిగానే లోపాన్ని సృష్టిస్తుంది.
- మైక్రోసాఫ్ట్-స్టైల్ ఇన్లైన్ అసెంబ్లీ బ్లాక్లలో బిట్ఫీల్డ్లను ఇన్స్ట్రక్షన్ ఆపరాండ్లుగా పేర్కొనడం (ఉదా. "__asm {mov eax, s.bf }") ఇప్పుడు లోపం ఏర్పడుతుంది.
- వేర్వేరు మాడ్యూల్స్లో ఒకే పేర్లతో విభిన్న నిర్మాణాలు మరియు యూనియన్ల ఉనికి కోసం విశ్లేషణలు జోడించబడ్డాయి.
- OpenCL మరియు OpenMP మద్దతుతో అనుబంధించబడిన సామర్థ్యాలు విస్తరించబడ్డాయి. OpenCL కెర్నల్ ఆర్గ్యుమెంట్లలో ఉపయోగించబడే C++ టెంప్లేట్ల కోసం మెరుగైన విశ్లేషణలు. AMDGPU కోసం మెరుగైన క్యూయింగ్ బ్లాక్ మద్దతు. నామవాచకం లక్షణం అన్ని ఫంక్షన్లకు పరోక్షంగా జోడించబడింది. అంతర్నిర్మిత ఫంక్షన్లకు మెరుగైన మద్దతు.
- క్రాష్ డయాగ్నస్టిక్ డేటా సేవ్ చేయబడిన డైరెక్టరీని నిర్వచించడానికి CLANG_CRASH_DIAGNOSTICS_DIR ఎన్విరాన్మెంట్ వేరియబుల్ని ఉపయోగించగల సామర్థ్యం జోడించబడింది.
- యూనికోడ్ మద్దతు యూనికోడ్ 15.0 స్పెసిఫికేషన్కు నవీకరించబడింది. "₊" (ఉదా. "డబుల్ xₖ₊₁") వంటి ఐడెంటిఫైయర్లలో కొన్ని గణిత చిహ్నాలు అనుమతించబడతాయి.
- బహుళ కాన్ఫిగరేషన్ ఫైల్లను లోడ్ చేయడానికి మద్దతు జోడించబడింది (డిఫాల్ట్ కాన్ఫిగరేషన్ ఫైల్లు మొదట లోడ్ చేయబడతాయి, ఆపై “--config=” ఫ్లాగ్ ద్వారా పేర్కొనబడతాయి, వీటిని ఇప్పుడు అనేకసార్లు పేర్కొనవచ్చు). కాన్ఫిగరేషన్ ఫైల్ల డిఫాల్ట్ లోడింగ్ ఆర్డర్ మార్చబడింది: క్లాంగ్ ముందుగా ఫైల్ను లోడ్ చేయడానికి ప్రయత్నిస్తుంది - .cfg, మరియు అది కనుగొనబడకపోతే అది రెండు ఫైల్లను లోడ్ చేయడానికి ప్రయత్నిస్తుంది .cfg మరియు .cfg. డిఫాల్ట్గా కాన్ఫిగరేషన్ ఫైల్లను లోడ్ చేయడాన్ని నిలిపివేయడానికి, “--no-default-config” ఫ్లాగ్ జోడించబడింది.
- పునరావృతమయ్యే బిల్డ్లను నిర్ధారించడానికి, __DATE__, __TIME__ మరియు __TIMESTAMP__ మాక్రోలలో ప్రస్తుత తేదీ మరియు సమయ విలువలను SOURCE_DATE_EPOCH ఎన్విరాన్మెంట్ వేరియబుల్లో పేర్కొన్న సమయంతో భర్తీ చేయడం సాధ్యపడుతుంది.
- స్థిరాంకాల సందర్భంలో ఉపయోగించబడే అంతర్నిర్మిత ఫంక్షన్ల (బిల్టిన్) ఉనికిని తనిఖీ చేయడానికి, మాక్రో “__has_constexpr_builtin” జోడించబడింది.
- సమలేఖనం చేయబడిన కరోటిన్ ఫ్రేమ్ కేటాయింపు కోసం కొత్త కంపైలేషన్ ఫ్లాగ్ "-fcoro-aligned-allocation" జోడించబడింది.
- “-fstrict-flex-arrays=” ఫ్లాగ్ స్ట్రక్చర్లలో ఫ్లెక్సిబుల్ అర్రే ఎలిమెంట్స్ (ఫ్లెక్సిబుల్ అర్రే మెంబర్లు, స్ట్రక్చర్ చివరిలో ఉన్న నిరవధిక పరిమాణాల శ్రేణి) కోసం తనిఖీ చేసే మూడవ స్థాయికి మద్దతును అమలు చేస్తుంది. మూడవ స్థాయిలో, పరిమాణం "[]" (ఉదాహరణకు, "int b[]") మాత్రమే సౌకర్యవంతమైన శ్రేణిగా పరిగణించబడుతుంది, కానీ పరిమాణం "[0]" (ఉదాహరణకు, "int b[0]") కాదు.
- ప్రామాణిక C++ మాడ్యూల్స్ కోసం సింగిల్-ఫేజ్ కంపైలేషన్ మోడల్ను ఎనేబుల్ చేయడానికి "-fmodule-output" ఫ్లాగ్ జోడించబడింది.
- స్టాక్ ఫ్రేమ్ లేఅవుట్తో సమస్యలను నిర్ధారించడంలో సహాయపడటానికి "-Rpass-analysis=stack-frame-layout" మోడ్ జోడించబడింది.
- AArch1 ద్వారా అందించబడిన లక్షణాల యొక్క నిర్దిష్ట సంస్కరణలను ఎంచుకోవడానికి __attribute__((టార్గెట్_వెర్షన్("cpu_features")))) మరియు __attribute__((target_clones("cpu_features2","cpu_features64",...)) లక్షణం యొక్క కార్యాచరణను పొడిగించారు. CPUలు.
- రోగనిర్ధారణ సాధనాలు విస్తరించబడ్డాయి:
- సింగిల్-బిట్ సంతకం చేయబడిన బిట్ఫీల్డ్కు ఒకదానిని కేటాయించేటప్పుడు అవ్యక్తమైన కత్తిరించడాన్ని గుర్తించడానికి "-Wsingle-bit-bitfield-constant-conversion" హెచ్చరిక జోడించబడింది.
- ప్రారంభించబడని constexpr వేరియబుల్స్ యొక్క డయాగ్నస్టిక్స్ విస్తరించబడింది.
- ఫంక్షన్ టైప్ కాస్టింగ్తో సంభావ్య సమస్యలను గుర్తించడానికి "-Wcast-function-type-strict" మరియు "-Wincompatible-function-pointer-types-strict" హెచ్చరికలు జోడించబడ్డాయి.
- ఎగుమతి బ్లాక్లలో తప్పు లేదా రిజర్వు చేయబడిన మాడ్యూల్ పేర్లను ఉపయోగించడం కోసం విశ్లేషణలు జోడించబడ్డాయి.
- నిర్వచనాలలో తప్పిపోయిన "ఆటో" కీలకపదాలను గుర్తించడం మెరుగుపరచబడింది.
- "-Winteger-overflow" హెచ్చరిక యొక్క అమలు ఓవర్ఫ్లోలకు దారితీసే అదనపు పరిస్థితులకు చెక్లను జోడించింది.
- LoongArch ఇన్స్ట్రక్షన్ సెట్ ఆర్కిటెక్చర్ (-march=loongarch64 లేదా -march=la464) కోసం అమలు చేయబడిన మద్దతు, Loongson 3 5000 ప్రాసెసర్లలో ఉపయోగించబడింది మరియు MIPS మరియు RISC-V మాదిరిగానే కొత్త RISC ISAని అమలు చేస్తోంది.
LLVM 16.0లో కీలక ఆవిష్కరణలు:
- LLVM కోడ్ C++17 ప్రమాణంలో నిర్వచించబడిన మూలకాలను ఉపయోగించడానికి అనుమతించబడుతుంది.
- LLVM నిర్మాణానికి పర్యావరణ అవసరాలు పెంచబడ్డాయి. బిల్డ్ టూల్స్ ఇప్పుడు C++17 ప్రమాణానికి మద్దతు ఇవ్వాలి, అనగా. నిర్మించడానికి, మీకు కనీసం GCC 7.1, క్లాంగ్ 5.0, Apple క్లాంగ్ 10.0 లేదా విజువల్ స్టూడియో 2019 16.7 అవసరం.
- AArch64 ఆర్కిటెక్చర్ యొక్క బ్యాకెండ్ కార్టెక్స్-A715, కార్టెక్స్-X3 మరియు నియోవర్స్ V2 CPUలకు మద్దతునిస్తుంది, RME MEC కోసం అసెంబ్లర్ (మెమరీ ఎన్క్రిప్షన్ సందర్భాలు), Armv8.3 పొడిగింపులు (కాంప్లెక్స్ నంబర్) మరియు ఫంక్షన్ మల్టీ వెర్షన్.
- ARM ఆర్కిటెక్చర్ కోసం బ్యాకెండ్లో, Armv2, Armv2A, Armv3 మరియు Armv3M లక్ష్య ప్లాట్ఫారమ్లకు మద్దతు నిలిపివేయబడింది, దీని కోసం సరైన కోడ్ ఉత్పత్తికి హామీ లేదు. సంక్లిష్ట సంఖ్యలతో పని చేయడానికి సూచనల కోసం కోడ్ను రూపొందించే సామర్థ్యం జోడించబడింది.
- X86 ఆర్కిటెక్చర్కు బ్యాకెండ్ ఇన్స్ట్రక్షన్ సెట్ ఆర్కిటెక్చర్లకు (ISAలు) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT మద్దతుని జోడించింది. RDMSRLIST, RMSRLIST మరియు WRMSRNS సూచనలకు మద్దతు జోడించబడింది. "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" మరియు "-mcpu=grandridge" ఎంపికలు అమలు చేయబడ్డాయి.
- LoongArch ప్లాట్ఫారమ్కు అధికారిక మద్దతు జోడించబడింది.
- MIPS, PowerPC మరియు RISC-V ఆర్కిటెక్చర్ల కోసం మెరుగైన బ్యాకెండ్లు
- LLDB డీబగ్గర్కు LoongArch ఆర్కిటెక్చర్ కోసం 64-బిట్ ఎక్జిక్యూటబుల్స్ డీబగ్గింగ్ చేయడానికి మద్దతు జోడించబడింది. COFF డీబగ్ చిహ్నాల మెరుగైన నిర్వహణ. లోడ్ చేయబడిన Windows మాడ్యూల్స్ జాబితాలో నకిలీ DLLల ఫిల్టరింగ్ అందించబడింది.
- Libc++ లైబ్రరీలో, C++20 మరియు C++23 ప్రమాణాల యొక్క కొత్త ఫీచర్లకు మద్దతును అమలు చేయడంపై ప్రధాన పని కేంద్రీకరించబడింది.
- అడ్రస్ రీలొకేషన్ స్కానింగ్ మరియు సెక్షన్ ఇనిషియలైజేషన్ ఆపరేషన్లను సమాంతరంగా చేయడం ద్వారా LDD లింకర్ లింకింగ్ సమయాన్ని గణనీయంగా తగ్గిస్తుంది. ZSTD అల్గోరిథం ఉపయోగించి విభాగం కుదింపు కోసం మద్దతు జోడించబడింది.
మూలం: opennet.ru