LLVM 12.0 కంపైలర్ సూట్ విడుదల

ఆరు నెలల అభివృద్ధి తర్వాత, LLVM 12.0 ప్రాజెక్ట్ విడుదల చేయబడింది - GCC-అనుకూల టూల్‌కిట్ (కంపైలర్‌లు, ఆప్టిమైజర్‌లు మరియు కోడ్ జనరేటర్లు) ఇది ప్రోగ్రామ్‌లను RISC-వంటి వర్చువల్ సూచనల యొక్క ఇంటర్మీడియట్ బిట్‌కోడ్‌గా కంపైల్ చేస్తుంది (ఒక తక్కువ-స్థాయి వర్చువల్ మెషీన్‌తో బహుళ-స్థాయి ఆప్టిమైజేషన్ సిస్టమ్). ఉత్పత్తి చేయబడిన సూడోకోడ్‌ను JIT కంపైలర్‌ని ఉపయోగించి ప్రోగ్రామ్ అమలు సమయంలో నేరుగా మెషీన్ సూచనలుగా మార్చవచ్చు.

క్లాంగ్ 12.0లో మెరుగుదలలు:

  • C++20 ప్రమాణంలో ప్రతిపాదించబడిన “అవకాశం” మరియు “అసంభవం” లక్షణాలకు మద్దతు డిఫాల్ట్‌గా అమలు చేయబడింది మరియు ప్రారంభించబడింది, ఇది షరతులతో కూడిన నిర్మాణం ట్రిగ్గర్ చేయబడే సంభావ్యత గురించి ఆప్టిమైజర్‌కు తెలియజేయడానికి అనుమతిస్తుంది (ఉదాహరణకు, “[[అవకాశం ]] అయితే (యాదృచ్ఛిక > 0) {“).
  • AMD Zen 3 (-march=znver3), ఇంటెల్ ఆల్డర్ లేక్ (-march=alderlake) మరియు Intel Sapphire Rapids (-march=sapphirerapids) ప్రాసెసర్‌లకు మద్దతు జోడించబడింది.
  • x86-64 ఆర్కిటెక్చర్ స్థాయిలను ఎంచుకోవడానికి "-march=x234-86-v[64]" ఫ్లాగ్‌లకు మద్దతు జోడించబడింది (v2 - SSE4.2, SSSE3, POPCNT మరియు CMPXCHG16B పొడిగింపులను కవర్ చేస్తుంది; v3 - AVX2 మరియు MOVBE; v4 - AVX-512 ) .
  • Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) మరియు Fujitsu A64FX (a64fx) ప్రాసెసర్‌లకు మద్దతు జోడించబడింది. ఉదాహరణకు, Neoverse-V1 CPUల కోసం ఆప్టిమైజేషన్‌లను ప్రారంభించడానికి, మీరు “-mcpu=neoverse-v1”ని పేర్కొనవచ్చు.
  • AArch64 ఆర్కిటెక్చర్ కోసం, "__aarch64_cas8_relax" వంటి అటామిక్ ఆపరేషన్ హెల్పర్ ఫంక్షన్‌లను ప్రారంభించడానికి లేదా నిలిపివేయడానికి కొత్త కంపైలర్ ఫ్లాగ్‌లు "-మౌట్‌లైన్-అటామిక్స్" మరియు "-mno-ఔట్‌లైన్-అటామిక్స్" జోడించబడ్డాయి. LSE (లార్జ్ సిస్టమ్ ఎక్స్‌టెన్షన్స్) మద్దతు అందుబాటులో ఉందో లేదో అటువంటి ఫంక్షన్‌లు రన్‌టైమ్‌లో గుర్తించి, అందించిన అటామిక్ ప్రాసెసర్ సూచనలను ఉపయోగిస్తాయి లేదా సింక్రొనైజేషన్ కోసం LL/SC (లోడ్-లింక్/స్టోర్-షరతులతో కూడిన) సూచనలను ఉపయోగిస్తాయి.
  • పాత లింకర్ మరియు అసెంబ్లర్ ప్రవర్తనతో అనుకూలత కోసం binutils సూట్ యొక్క లక్ష్య సంస్కరణను ఎంచుకోవడానికి "-fbinutils-version" ఎంపిక జోడించబడింది.
  • ELF ఎక్జిక్యూటబుల్ ఫైల్‌ల కోసం, "-gz" ఫ్లాగ్ పేర్కొనబడినప్పుడు, zlib లైబ్రరీని ఉపయోగించి డీబగ్గింగ్ సమాచారం యొక్క కుదింపు డిఫాల్ట్‌గా ప్రారంభించబడుతుంది (gz=zlib). ఫలితంగా వచ్చే ఆబ్జెక్ట్ ఫైల్‌లను లింక్ చేయడానికి lld లేదా GNU బినటిల్‌లు 2.26+ అవసరం. బినుటిల్‌ల పాత సంస్కరణలతో అనుకూలతను పునరుద్ధరించడానికి, మీరు "-gz=zlib-gnu"ని పేర్కొనవచ్చు.
  • 'ఈ' పాయింటర్ ఇప్పుడు నాన్‌నల్ మరియు డిఫరెన్స్ చేయదగిన(N) చెక్‌లతో ప్రాసెస్ చేయబడింది. మీరు NULL విలువలను ఉపయోగించాల్సి వచ్చినప్పుడు నాన్‌నల్ లక్షణాన్ని తీసివేయడానికి, మీరు "-fdelete-null-pointer-checks" ఎంపికను ఉపయోగించవచ్చు.
  • Linux ప్లాట్‌ఫారమ్‌లో, GCCలో వలె అన్‌వైండ్ కాల్ టేబుల్‌లను రూపొందించడానికి AArch64 మరియు PowerPC ఆర్కిటెక్చర్‌ల కోసం "-fasynchronous-unwind-tables" మోడ్ ప్రారంభించబడింది.
  • "#pragma clang loop vectorize_width"లో వెక్టరైజేషన్ పద్ధతిని ఎంచుకోవడానికి "ఫిక్స్‌డ్" (డిఫాల్ట్) మరియు "స్కేలబుల్" ఎంపికలను పేర్కొనే సామర్థ్యాన్ని జోడించారు. వెక్టర్ పొడవుతో సంబంధం లేకుండా "స్కేలబుల్" మోడ్ ప్రయోగాత్మకమైనది మరియు స్కేలబుల్ వెక్టరైజేషన్‌కు మద్దతు ఇచ్చే హార్డ్‌వేర్‌లో ఉపయోగించవచ్చు.
  • Windows ప్లాట్‌ఫారమ్‌కు మెరుగైన మద్దతు: Clang కంపైలర్, LLD లింకర్ మరియు కంపైలర్-RT రన్‌టైమ్ లైబ్రరీలతో సహా Arm64 సిస్టమ్‌లలో Windows కోసం అధికారిక బైనరీ అసెంబ్లీలు సిద్ధం చేయబడ్డాయి. MinGW లక్ష్య ప్లాట్‌ఫారమ్‌ల కోసం నిర్మిస్తున్నప్పుడు, క్రాస్-కంపైల్ చేస్తున్నప్పుడు కూడా .exe ప్రత్యయం జోడించబడుతుంది.
  • OpenCL, OpenMP మరియు CUDA కోసం మద్దతుతో అనుబంధించబడిన సామర్థ్యాలు విస్తరించబడ్డాయి. OpenCL 3.0 మరియు OpenCL 1.0 కోసం స్థూల ఎంపికలను ఎంచుకోవడానికి "-cl-std=CL3.0" మరియు "-cl-std=CL1.0" ఎంపికలు జోడించబడ్డాయి. రోగనిర్ధారణ సాధనాలు విస్తరించబడ్డాయి.
  • కొన్ని x86-ఆధారిత ప్రాసెసర్లలో అమలు చేయబడిన HRESET, UINTR మరియు AVXVNNI సూచనలకు మద్దతు జోడించబడింది.
  • x86 సిస్టమ్స్‌లో, "-mtune=" ఎంపికకు మద్దతు ప్రారంభించబడింది ", ఇది "-march= విలువతో సంబంధం లేకుండా, ఎంచుకున్న మైక్రోఆర్కిటెక్చరల్ ఆప్టిమైజేషన్‌లను సక్రియం చేస్తుంది. "
  • స్టాటిక్ ఎనలైజర్ కొన్ని POSIX ఫంక్షన్‌ల ప్రాసెసింగ్‌ను మెరుగుపరిచింది మరియు పోలికలో అనేక సింబాలిక్ విలువలు ఉన్నప్పుడు షరతులతో కూడిన ఆపరేషన్ల ఫలితాన్ని గణనీయంగా మెరుగుపరిచింది. కొత్త తనిఖీలు జోడించబడ్డాయి: fuchia.HandleChecker (నిర్మాణాలలో హ్యాండిల్‌లను నిర్వచిస్తుంది), webkit.UncountedLambdaCapturesChecker వెబ్‌కిట్ మరియు alpha.webkit.UncountedLocalVarsChecker (వెబ్‌కిట్ ఇంజన్ కోడ్‌లోని పాయింటర్‌లతో పని చేసే ప్రత్యేకతలను పరిగణనలోకి తీసుకుంటుంది).
  • స్థిరాంకాల సందర్భంలో ఉపయోగించే వ్యక్తీకరణలలో, అంతర్నిర్మిత ఫంక్షన్ల ఉపయోగం __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bs__pdbd, reverse, __bs__prbs, wap64, __ bswapq అనుమతించబడుతుంది , _castf*, __rol* మరియు __ror*.
  • ఐడెంటిఫైయర్‌లు, నిలువు వరుసలు మరియు ఫీల్డ్ డెఫినిషన్‌ల చుట్టూ అంతరాన్ని ఎంచుకోవడానికి క్లాంగ్-ఫార్మాట్ యుటిలిటీకి BitFieldColonSpacing ఎంపిక జోడించబడింది.
  • Linux ప్లాట్‌ఫారమ్‌లోని క్లాంగ్డ్ కాషింగ్ సర్వర్ (క్లాంగ్ సర్వర్) దీర్ఘకాలిక ఆపరేషన్ సమయంలో మెమరీ వినియోగాన్ని గణనీయంగా తగ్గించింది (మాలోక్_ట్రిమ్‌కి ఆవర్తన కాల్‌లు ఉచిత మెమరీ పేజీలను ఆపరేటింగ్ సిస్టమ్‌కు తిరిగి ఇవ్వడానికి అందించబడతాయి).

LLVM 12.0లో కీలక ఆవిష్కరణలు:

  • పైథాన్‌లో వ్రాయబడిన llvm-build బిల్డ్ టూల్‌కు మద్దతు నిలిపివేయబడింది మరియు బదులుగా ప్రాజెక్ట్ పూర్తిగా CMake బిల్డ్ సిస్టమ్‌ని ఉపయోగించడంలోకి మార్చబడింది.
  • AArch64 ఆర్కిటెక్చర్ కోసం బ్యాకెండ్‌లో, Windows ప్లాట్‌ఫారమ్‌కు మద్దతు మెరుగుపరచబడింది: టార్గెట్ విండోస్ సిస్టమ్‌ల కోసం అసెంబ్లర్ అవుట్‌పుట్ యొక్క సరైన తరం నిర్ధారించబడింది, అన్‌వైండ్ కాల్‌లపై డేటా ఉత్పత్తి ఆప్టిమైజ్ చేయబడింది (అటువంటి డేటా పరిమాణం 60 తగ్గింది. %), అసెంబ్లర్‌ని ఉపయోగించి అన్‌వైండ్ డేటాను సృష్టించే సామర్థ్యం .seh_* ఆదేశాలు జోడించబడింది.
  • PowerPC ఆర్కిటెక్చర్ కోసం బ్యాకెండ్ లూప్‌లు మరియు ఇన్‌లైన్ డిప్లాయ్‌మెంట్ కోసం కొత్త ఆప్టిమైజేషన్‌లను కలిగి ఉంది, Power10 ప్రాసెసర్‌లకు విస్తరించిన మద్దతు, మ్యాట్రిక్స్ మానిప్యులేషన్ కోసం MMA సూచనలకు జోడించిన మద్దతు మరియు AIX ఆపరేటింగ్ సిస్టమ్‌కు మెరుగైన మద్దతు.
  • x86 బ్యాకెండ్ AMD జెన్ 3, ఇంటెల్ ఆల్డర్ లేక్ మరియు ఇంటెల్ సఫైర్ రాపిడ్స్ ప్రాసెసర్‌లకు అలాగే HRESET, UINTR మరియు AVXVNNI ప్రాసెసర్ సూచనలకు మద్దతునిస్తుంది. మెమరీ సరిహద్దులకు ఇకపై మద్దతు లేదని నిర్ధారించడానికి పాయింటర్‌లను తనిఖీ చేయడానికి MPX (మెమరీ ప్రొటెక్షన్ ఎక్స్‌టెన్షన్‌లు) కోసం మద్దతు (ఈ సాంకేతికత విస్తృతంగా లేదు మరియు ఇప్పటికే GCC మరియు క్లాంగ్ నుండి తీసివేయబడింది). ఒపెరాండ్ ఆఫ్‌సెట్‌లు మరియు జంప్‌ల పరిమాణాన్ని నియంత్రించడానికి {disp32} మరియు {disp8} ఉపసర్గలు మరియు .d32 మరియు .d8 ప్రత్యయాలకు అసెంబ్లర్‌కు మద్దతు జోడించబడింది. మైక్రోఆర్కిటెక్చరల్ ఆప్టిమైజేషన్‌లను చేర్చడాన్ని నియంత్రించడానికి "ట్యూన్-సిపియు" అనే కొత్త లక్షణం జోడించబడింది.
  • ఎడమవైపుకి కొంచెం మారిన తర్వాత సంతకం చేయని పూర్ణాంకాల ఓవర్‌ఫ్లోలను గుర్తించడానికి పూర్ణాంక సమస్య డిటెక్టర్ (పూర్ణాంక శానిటైజర్, “-fsanitize=integer”)కి కొత్త మోడ్ “-fsanitize=unsigned-shift-base” జోడించబడింది.
  • వివిధ డిటెక్టర్లలో (asan, cfi, lsan, msan, tsan, ubsan sanitizer) ప్రామాణిక Musl లైబ్రరీతో Linux పంపిణీలకు మద్దతు జోడించబడింది.
  • LLD లింకర్ యొక్క సామర్థ్యాలు విస్తరించబడ్డాయి. ELF ఆకృతికి మెరుగైన మద్దతు, జోడించిన ఎంపికలు “--డిపెండెన్సీ-ఫైల్”, “-ఎర్రర్-హ్యాండ్లింగ్-స్క్రిప్ట్”, “-lto-pseudo-probe-for-profiling”, “-no-lto-whole-program - దృశ్యమానత" " మెరుగైన MinGW మద్దతు. Mach-O ఫార్మాట్ (macOS) కోసం, arm64, arm మరియు i386 ఆర్కిటెక్చర్‌లకు మద్దతు, లింక్-టైమ్ ఆప్టిమైజేషన్‌లు (LTO) మరియు మినహాయింపు నిర్వహణ కోసం స్టాక్ అన్‌వైండింగ్ అమలు చేయబడింది.
  • Libc++ C++20 ప్రమాణం యొక్క కొత్త లక్షణాలను అమలు చేస్తుంది మరియు C++2b స్పెసిఫికేషన్ యొక్క లక్షణాల అభివృద్ధిని ప్రారంభించింది. స్థానికీకరణ మద్దతును నిలిపివేయడం (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) మరియు నకిలీ యాదృచ్ఛిక సంఖ్యలను (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”) రూపొందించే పరికరాలతో నిర్మించడానికి మద్దతు జోడించబడింది.

మూలం: opennet.ru

ఒక వ్యాఖ్యను జోడించండి