ఆరు నెలల అభివృద్ధి తర్వాత సమర్పించారు ప్రాజెక్ట్ విడుదల LLVM 10.0 — GCC-అనుకూల సాధనాలు (కంపైలర్లు, ఆప్టిమైజర్లు మరియు కోడ్ జనరేటర్లు), ప్రోగ్రామ్లను RISC-వంటి వర్చువల్ సూచనల ఇంటర్మీడియట్ బిట్కోడ్లోకి కంపైల్ చేయడం (బహుళ-స్థాయి ఆప్టిమైజేషన్ సిస్టమ్తో తక్కువ-స్థాయి వర్చువల్ మెషీన్). ఉత్పత్తి చేయబడిన సూడోకోడ్ను JIT కంపైలర్ని ఉపయోగించి ప్రోగ్రామ్ అమలు సమయంలో నేరుగా మెషీన్ సూచనలుగా మార్చవచ్చు.
LLVM 10.0లోని కొత్త ఫీచర్లలో C++ కాన్సెప్ట్లకు మద్దతు, ఇకపై క్లాంగ్ని ప్రత్యేక ప్రక్రియగా అమలు చేయడం లేదు, Windows కోసం CFG (నియంత్రణ ఫ్లో గార్డ్) తనిఖీలకు మద్దతు మరియు కొత్త CPU సామర్థ్యాలకు మద్దతు ఉన్నాయి.
" కోసం మద్దతు జోడించబడిందిభావనలు", C++ టెంప్లేట్ పొడిగింపు తదుపరి ప్రమాణంలో చేర్చబడుతుంది, C++2a (-std=c++2a ఫ్లాగ్ ద్వారా ఆన్ చేయబడింది).
కంపైల్ సమయంలో, టెంప్లేట్ పారామీటర్లుగా ఆమోదించబడే ఆర్గ్యుమెంట్ల సెట్ను పరిమితం చేసే టెంప్లేట్ పారామీటర్ అవసరాల సమితిని నిర్వచించడానికి కాన్సెప్ట్లు మిమ్మల్ని అనుమతిస్తాయి. టెంప్లేట్లో ఉపయోగించిన డేటా రకాల లక్షణాలు మరియు ఇన్పుట్ పారామితుల యొక్క డేటా రకం లక్షణాల మధ్య తార్కిక అసమానతలను నివారించడానికి భావనలను ఉపయోగించవచ్చు.
టెంప్లేట్
భావన సమానత్వం పోల్చదగినది = అవసరం(T a, T b) {
{ a == b } -> std:: boolean;
{ a != b } -> std:: boolean;
};
డిఫాల్ట్గా, సంకలనం నిర్వహించబడే ప్రత్యేక ప్రక్రియ (“క్లాంగ్ -సిసి1”) ప్రారంభం నిలిపివేయబడుతుంది. ఇప్పుడు ప్రధాన ప్రక్రియలో సంకలనం చేయబడుతుంది మరియు పాత ప్రవర్తనను పునరుద్ధరించడానికి "-fno-integrated-cc1" ఎంపికను ఉపయోగించవచ్చు.
కొత్త డయాగ్నస్టిక్ మోడ్లు:
"-Wc99-designator" మరియు "-Wreorder-init-list" C99లో సరైనవి కానీ C++99లో లేని సందర్భాలలో C++ మోడ్లో C20 ఇనిషియలైజర్లను ఉపయోగించకుండా హెచ్చరిస్తాయి.
"-Wsizeof-array-div" - "int arr[10] వంటి పరిస్థితులను పట్టుకుంటుంది; …sizeof(arr) / sizeof(చిన్న)…” (“sizeof(arr) / sizeof(int)” అయి ఉండాలి).
"-Wxor-used-as-po" - ఎక్స్పోనెన్షియేషన్ (2^16)తో గందరగోళం చెందగల ఆపరేషన్లలో "^" (xor) ఆపరేటర్ని ఉపయోగించడం వంటి నిర్మాణాల వినియోగానికి వ్యతిరేకంగా హెచ్చరిస్తుంది.
"-Wfinal-dtor-non-final-class" - "ఫైనల్" స్పెసిఫైయర్తో గుర్తించబడని తరగతుల గురించి హెచ్చరిస్తుంది, కానీ "ఫైనల్" లక్షణంతో డిస్ట్రక్టర్ ఉంటుంది.
"-Wtautological-bitwise-compare" అనేది బిట్వైస్ ఆపరేషన్ మరియు స్థిరాంకం మధ్య టాటోలాజికల్ పోలికలను నిర్ధారించడానికి మరియు బిట్వైస్ OR ఆపరేషన్ ప్రతికూల సంఖ్యకు వర్తించే ఎల్లప్పుడూ-నిజమైన పోలికలను గుర్తించడానికి హెచ్చరికల సమూహం.
"-Wbitwise-conditional-parentheses" లాజికల్ ఆపరేటర్లు AND (&) మరియు OR (|) ని షరతులతో కూడిన ఆపరేటర్ (?:)తో కలపడం వలన సమస్యల గురించి హెచ్చరిస్తుంది.
“-Wmisleading-indentation” అనేది GCC నుండి అదే పేరు యొక్క చెక్ యొక్క అనలాగ్, ఇది ఇండెంట్ చేసిన వ్యక్తీకరణలు if/else/for/while బ్లాక్లో భాగంగా ఉన్నట్లు హెచ్చరిస్తుంది, అయితే వాస్తవానికి అవి ఈ బ్లాక్లో చేర్చబడలేదు .
“-Wextra”ని పేర్కొనేటప్పుడు, “-Wdeprecated-copy” చెక్ ఎనేబుల్ చేయబడుతుంది, కన్స్ట్రక్టర్ల ఉపయోగం గురించి హెచ్చరిస్తుంది
స్పష్టమైన డిస్ట్రక్టర్ నిర్వచనంతో తరగతుల్లో "తరలించు" మరియు "కాపీ".
"-Wbitwise-op-parentheses" మరియు "-Wlogical-op-parentheses" తనిఖీలు డిఫాల్ట్గా నిలిపివేయబడ్డాయి.
C మరియు C++ కోడ్లో, పాయింటర్ అంకగణిత కార్యకలాపాలు శ్రేణులలో మాత్రమే అనుమతించబడతాయి. "-fsanitize=pointer-overflow" మోడ్లోని నిర్వచించబడని బిహేవియర్ శానిటైజర్ ఇప్పుడు శూన్య పాయింటర్కు సున్నా కాని ఆఫ్సెట్ను జోడించడం లేదా శూన్య పాయింటర్ నుండి పూర్ణాంకాన్ని తీసివేసేటప్పుడు శూన్య పాయింటర్ను సృష్టించడం వంటి సందర్భాలను క్యాచ్ చేస్తుంది.
"-fsanitize=implicit-conversion" (ఇంప్లిసిట్ కన్వర్షన్ శానిటైజర్) మోడ్ "int" రకం కంటే కొంచెం చిన్న పరిమాణంలో ఉన్న రకాల కోసం ఇంక్రిమెంట్ మరియు డిక్రీమెంట్ ఆపరేషన్లతో సమస్యలను గుర్తించడానికి స్వీకరించబడింది.
x86 లక్ష్య ఆర్కిటెక్చర్లను ఎంచుకున్నప్పుడు "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" మరియు "-march=cooperlake"ని డిఫాల్ట్గా వెక్టరైజ్డ్ ది కోడ్ 512-బిట్ zmm రిజిస్టర్లను ఉపయోగించడం ఆపివేయబడింది, సోర్స్ కోడ్లో వాటి ప్రత్యక్ష సూచన మినహా. కారణం 512-బిట్ కార్యకలాపాలను నిర్వహిస్తున్నప్పుడు CPU ఫ్రీక్వెన్సీ తగ్గుతుంది, ఇది మొత్తం పనితీరును ప్రతికూలంగా ప్రభావితం చేస్తుంది. కొత్త ప్రవర్తనను మార్చడానికి, "-mprefer-vector-width=512" ఎంపిక అందించబడుతుంది.
"-ఫ్లాక్స్-వెక్టార్-కన్వర్షన్స్" ఫ్లాగ్ యొక్క ప్రవర్తన GCCని పోలి ఉంటుంది: పూర్ణాంకం మరియు ఫ్లోటింగ్-పాయింట్ వెక్టర్ల మధ్య అవ్యక్త వెక్టార్ బిట్ మార్పిడులు నిషేధించబడ్డాయి. ఈ పరిమితిని తొలగించడానికి, జెండాను ఉపయోగించాలని ప్రతిపాదించబడింది
"-flax-vector-conversions=all" ఇది డిఫాల్ట్.
Octeon కుటుంబానికి చెందిన MIPS CPUలకు మెరుగైన మద్దతు. చెల్లుబాటు అయ్యే CPU రకాల జాబితాకు "octeon+" జోడించబడింది.
RISC-V ఆర్కిటెక్చర్ ఆధారంగా సిస్టమ్ల కోసం, అసెంబ్లర్ ఇన్లైన్ ఇన్సర్ట్ల షరతులతో కూడిన బ్లాక్లలో ఫ్లోటింగ్ పాయింట్ విలువలను నిల్వ చేసే రిజిస్టర్ల ఉపయోగం అనుమతించబడుతుంది.
కొత్త కంపైలర్ ఫ్లాగ్లు జోడించబడ్డాయి: "__GNUC__" మరియు ఇలాంటి మాక్రోల కోసం వెర్షన్ విలువను సెట్ చేయడానికి "-fgnuc-version"; "__FILE__" వంటి మాక్రోలలో డైరెక్టరీ ప్రిఫిక్స్ OLDని NEWతో భర్తీ చేయడానికి "-fmacro-prefix-map=OLD=NEW"; "-fpatchable-function-entry=N[,M]" ఫంక్షన్ ఎంట్రీ పాయింట్కు ముందు మరియు తర్వాత నిర్దిష్ట సంఖ్యలో NOP సూచనలను రూపొందించడానికి. RISC-V కోసం
"-ffixed-xX", "-mcmodel=medany" మరియు "-mcmodel=medlow" ఫ్లాగ్లకు మద్దతు జోడించబడింది.
'__attribute__((టార్గెట్(“బ్రాంచ్-ప్రొటెక్షన్=..."))) లక్షణానికి మద్దతు జోడించబడింది, దీని ప్రభావం ఎంపికను పోలి ఉంటుంది -శాఖ-రక్షణ.
విండోస్ ప్లాట్ఫారమ్లో, “-cfguard” ఫ్లాగ్ను పేర్కొనేటప్పుడు, పరోక్ష ఫంక్షన్ కాల్ల కోసం ఎగ్జిక్యూషన్ ఫ్లో సమగ్రత తనిఖీల (కంట్రోల్ ఫ్లో గార్డ్) ప్రత్యామ్నాయం అమలు చేయబడుతుంది. చెక్ ప్రత్యామ్నాయాన్ని నిలిపివేయడానికి, మీరు “-cfguard-nochecks” ఫ్లాగ్ లేదా “__declspec(guard(nocf))” మాడిఫైయర్ని ఉపయోగించవచ్చు.
gnu_inline లక్షణం యొక్క ప్రవర్తన "బాహ్య" కీవర్డ్ లేకుండా ఉపయోగించబడిన సందర్భాల్లో GCCని పోలి ఉంటుంది.
OpenCL మరియు CUDA మద్దతుతో అనుబంధించబడిన సామర్థ్యాలు విస్తరించబడ్డాయి. కొత్త OpenMP 5.0 ఫీచర్లకు మద్దతు జోడించబడింది.
క్లాంగ్-ఫార్మాట్ యుటిలిటీకి ఒక ప్రామాణిక ఎంపిక జోడించబడింది, ఇది కోడ్ను అన్వయించేటప్పుడు మరియు ఫార్మాటింగ్ చేసేటప్పుడు ఉపయోగించే C++ ప్రమాణం యొక్క సంస్కరణను నిర్ణయించడానికి మిమ్మల్ని అనుమతిస్తుంది (తాజా, ఆటో, c++03, c++11, c++14, c++17, c++20 ).
స్టాటిక్ ఎనలైజర్కి కొత్త తనిఖీలు జోడించబడ్డాయి: alpha.cplusplus.PlacementNew తగినంత నిల్వ స్థలం ఉందో లేదో తెలుసుకోవడానికి, Fuchsia.HandleChecker, Fuchsia హ్యాండ్లర్లకు సంబంధించిన లీక్లను గుర్తించడానికి, security.insecureAPI.decodeValueOfObjCTని ఉపయోగిస్తున్నప్పుడు సంభావ్య బఫర్ ఓవర్ఫ్లోలను గుర్తించడానికి. :at:] .
అన్డిఫైన్డ్ బిహేవియర్ శానిటైజర్ (UBSan) నాన్-జీరో ఆఫ్సెట్లను NULL పాయింటర్లకు లేదా NULL పాయింటర్ ఆఫ్సెట్కు జోడించడాన్ని పట్టుకోవడానికి దాని పాయింటర్ ఓవర్ఫ్లో తనిఖీలను విస్తరించింది.
గణగణమని ద్వని చేయు చక్కనైన లిన్టర్ లో జోడించారు కొత్త చెక్కులలో ఎక్కువ భాగం.
ఫ్రేమ్వర్క్కి గుణకారుడు కొత్త ఇంటర్ప్రొసీడ్యూరల్ ఆప్టిమైజేషన్లు మరియు ఎనలైజర్లు జోడించబడ్డాయి. 19 గుణాలు 12 LLVM IR మరియు లైవ్నెస్ వంటి 12 అబ్స్ట్రాక్ట్ అట్రిబ్యూట్లతో సహా 7 విభిన్న లక్షణాల స్థితి అంచనా వేయబడింది.
కంపైలర్లో నిర్మించిన కొత్త మ్యాట్రిక్స్ మ్యాథమెటికల్ ఫంక్షన్లు జోడించబడ్డాయి (అంతర్గతాంశాలు), ఇవి సంకలనం సమయంలో సమర్థవంతమైన వెక్టార్ సూచనలతో భర్తీ చేయబడతాయి.
X86, AArch64, ARM, SystemZ, MIPS, AMDGPU మరియు PowerPC ఆర్కిటెక్చర్ల కోసం బ్యాకెండ్లకు అనేక మెరుగుదలలు చేయబడ్డాయి. CPU మద్దతు జోడించబడింది
కార్టెక్స్-A65, కార్టెక్స్-A65AE, నియోవర్స్ E1 మరియు నియోవర్స్ N1. ARMv8.1-M కోసం, కోడ్ ఉత్పత్తి ప్రక్రియ ఆప్టిమైజ్ చేయబడింది (ఉదాహరణకు, కనిష్ట ఓవర్హెడ్తో లూప్లకు మద్దతు కనిపించింది) మరియు MVE పొడిగింపును ఉపయోగించి ఆటోవెక్టరైజేషన్కు మద్దతు జోడించబడింది. మెరుగైన CPU MIPS Octeon మద్దతు. PowerPC కోసం, MASSV (గణిత త్వరణం సబ్సిస్టమ్) లైబ్రరీని ఉపయోగించి గణిత సబ్రూటీన్ల వెక్టరైజేషన్ ప్రారంభించబడింది, కోడ్ ఉత్పత్తి మెరుగుపరచబడింది మరియు లూప్ల నుండి మెమరీ యాక్సెస్ ఆప్టిమైజ్ చేయబడింది. x86 కోసం, v2i32, v4i16, v2i16, v8i8, v4i8 మరియు v2i8 వెక్టార్ రకాల హ్యాండ్లింగ్ మార్చబడింది.
WebAssembly కోసం మెరుగైన కోడ్ జనరేటర్. TLS (థ్రెడ్-లోకల్ స్టోరేజ్) మరియు atomic.fence సూచనలకు మద్దతు జోడించబడింది. SIMD మద్దతు గణనీయంగా విస్తరించబడింది. WebAssembly ఆబ్జెక్ట్ ఫైల్లు ఇప్పుడు బహుళ-విలువైన ఫంక్షన్ సంతకాలను ఉపయోగించగల సామర్థ్యాన్ని కలిగి ఉన్నాయి.
లూప్లను ప్రాసెస్ చేసేటప్పుడు ఎనలైజర్ ఉపయోగించబడుతుంది మెమరీSSA, ఇది వివిధ మెమరీ ఆపరేషన్ల మధ్య డిపెండెన్సీలను నిర్వచించడానికి మిమ్మల్ని అనుమతిస్తుంది. MemorySSA కంపైలేషన్ మరియు ఎగ్జిక్యూషన్ సమయాన్ని తగ్గిస్తుంది లేదా పనితీరును కోల్పోకుండా AliasSetTrackerకి బదులుగా ఉపయోగించవచ్చు.
LLDB డీబగ్గర్ DWARF v5 ఫార్మాట్కు మద్దతును గణనీయంగా మెరుగుపరిచింది. MinGWతో నిర్మించడానికి మెరుగైన మద్దతు
మరియు ARM మరియు ARM64 ఆర్కిటెక్చర్ల కోసం విండోస్ ఎక్జిక్యూటబుల్లను డీబగ్ చేయడానికి ప్రారంభ సామర్థ్యాన్ని జోడించారు. ట్యాబ్ని నొక్కడం ద్వారా ఇన్పుట్ను స్వయంపూర్తి చేస్తున్నప్పుడు అందించే ఎంపికల వివరణలు జోడించబడ్డాయి.
విస్తరించింది LLD లింకర్ సామర్థ్యాలు. GNU లింకర్తో గ్లోబ్ టెంప్లేట్ల పూర్తి అనుకూలతను నిర్ధారించడం, కంప్రెస్డ్ డీబగ్ సెక్షన్లు ".zdebug" కోసం మద్దతుని జోడించడం, .note.gnu.property విభాగాన్ని నిర్వచించడానికి PT_GNU_PROPERTY ప్రాపర్టీని జోడించడం వంటి ELF ఫార్మాట్కు మెరుగైన మద్దతు (భవిష్యత్తులో ఉపయోగించవచ్చు. Linux కెర్నలు),
“-z నోస్పరేట్-కోడ్”, “-z సెపరేట్-కోడ్” మరియు “-z సెపరేట్-లోడబుల్-సెగ్మెంట్స్” మోడ్లు అమలు చేయబడ్డాయి. MinGW మరియు WebAssembly కోసం మెరుగైన మద్దతు.