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

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

LLVM 9.0 యొక్క కొత్త ఫీచర్లు టార్గెట్ RISC-V ప్లాట్‌ఫారమ్ నుండి ప్రయోగాత్మక డిజైన్ ట్యాగ్‌ను తీసివేయడం, OpenCL కోసం C++ మద్దతు, LLDలో డైనమిక్‌గా లోడ్ చేయబడిన భాగాలుగా ప్రోగ్రామ్‌ను విభజించే సామర్థ్యం మరియు “ని అమలు చేయడం వంటివి ఉన్నాయి.asm goto", Linux కెర్నల్ కోడ్‌లో ఉపయోగించబడింది. libc++ WASI (WebAssembly సిస్టమ్ ఇంటర్‌ఫేస్)కు మద్దతును జోడించింది మరియు LLD WebAssembly డైనమిక్ లింకింగ్‌కు ప్రారంభ మద్దతును జోడించింది.

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

  • చేర్చబడింది GCC-నిర్దిష్ట వ్యక్తీకరణ అమలు "asm goto“, ఇది అసెంబ్లర్ ఇన్‌లైన్ బ్లాక్ నుండి C కోడ్‌లోని లేబుల్‌కి తరలించడానికి మిమ్మల్ని అనుమతిస్తుంది. x86_64 ఆర్కిటెక్చర్‌తో సిస్టమ్‌లలో క్లాంగ్‌ని ఉపయోగించి “CONFIG_JUMP_LABEL=y” మోడ్‌లో Linux కెర్నల్‌ను రూపొందించడానికి ఈ ఫీచర్ అవసరం. మునుపటి విడుదలలలో జోడించిన మార్పులను పరిగణనలోకి తీసుకుంటే, Linux కెర్నల్ ఇప్పుడు x86_64 ఆర్కిటెక్చర్ కోసం క్లాంగ్‌లో నిర్మించబడవచ్చు (గతంలో ఆర్మ్, aarch64, ppc32, ppc64le మరియు mips ఆర్కిటెక్చర్‌ల కోసం మాత్రమే బిల్డింగ్‌కు మద్దతు ఉంది). అంతేకాకుండా, ఆండ్రాయిడ్ మరియు క్రోమ్‌ఓఎస్ ప్రాజెక్ట్‌లు ఇప్పటికే కెర్నల్ బిల్డింగ్ కోసం క్లాంగ్‌ని ఉపయోగించేలా మార్చబడ్డాయి మరియు గూగుల్ దాని ఉత్పత్తి లైనక్స్ సిస్టమ్‌ల కోసం కెర్నల్‌లను రూపొందించడానికి ప్రధాన ప్లాట్‌ఫారమ్‌గా క్లాంగ్‌ని పరీక్షిస్తోంది. భవిష్యత్తులో, LLD, llvm-objcopy, llvm-ar, llvm-nm మరియు llvm-objdumpతో సహా ఇతర LLVM భాగాలను కెర్నల్ నిర్మాణ ప్రక్రియలో ఉపయోగించవచ్చు;
  • OpenCLలో C++17ని ఉపయోగించడం కోసం ప్రయోగాత్మక మద్దతు జోడించబడింది. నిర్దిష్ట లక్షణాలలో అడ్రస్ స్పేస్ అట్రిబ్యూట్‌లకు మద్దతు, టైప్ కాస్టింగ్ ఆపరేటర్‌ల ద్వారా అడ్రస్ స్పేస్ మార్పిడిని నిరోధించడం, సి కోసం ఓపెన్‌సిఎల్‌లో వెక్టర్ రకాలను అందించడం, ఇమేజ్‌లు, ఈవెంట్‌లు, ఛానెల్‌లు మొదలైన వాటి కోసం నిర్దిష్ట ఓపెన్‌సిఎల్ రకాలు ఉన్నాయి.
  • ఫ్రంటెండ్ (పార్సింగ్, ఇనిషియలైజేషన్) మరియు బ్యాకెండ్ (ఆప్టిమైజేషన్ దశలు) యొక్క వివిధ దశల అమలు సమయంపై నివేదికను రూపొందించడానికి కొత్త కంపైలర్ ఫ్లాగ్‌లు “-ftime-trace” మరియు “-ftime-trace-granularity=N” జోడించబడ్డాయి. నివేదిక json ఆకృతిలో సేవ్ చేయబడింది, chrome://tracing మరియు speedscope.appకి అనుకూలంగా ఉంటుంది;
  • "__declspec(allocator)" స్పెసిఫైయర్ యొక్క ప్రాసెసింగ్ జోడించబడింది మరియు విజువల్ స్టూడియో వాతావరణంలో మెమరీ వినియోగాన్ని పర్యవేక్షించడానికి మిమ్మల్ని అనుమతించే డీబగ్గింగ్ సమాచారం యొక్క ఉత్పత్తి;
  • C భాష కోసం, “__FILE_NAME__” మాక్రో కోసం మద్దతు జోడించబడింది, ఇది “__FILE__” మాక్రోని పోలి ఉంటుంది, కానీ పూర్తి మార్గం లేకుండా ఫైల్ పేరును మాత్రమే కలిగి ఉంటుంది;
  • పారామీటర్ మరియు ఆర్గ్యుమెంట్ ప్యాటర్న్‌లు, రిఫరెన్స్ రకాలు, రిటర్న్ టైప్ ఇన్ఫరెన్స్, ఆబ్జెక్ట్‌లు, ఆటో-జెనరేటెడ్ ఫంక్షన్‌లు, అంతర్నిర్మిత ఆపరేటర్‌లు మరియు మరిన్నింటితో సహా వివిధ C++ ఫీచర్‌లను కవర్ చేయడానికి C++ అడ్రస్ స్పేస్ అట్రిబ్యూట్‌లకు మద్దతును విస్తరించింది.
  • OpenCL, OpenMP మరియు CUDA కోసం మద్దతుతో అనుబంధించబడిన సామర్థ్యాలు విస్తరించబడ్డాయి. ఇందులో అంతర్నిర్మిత OpenCL ఫంక్షన్‌ల ("-fdeclare-opencl-builtins" ఫ్లాగ్ జోడించబడింది), cl_arm_integer_dot_product పొడిగింపు అమలు చేయబడింది మరియు డయాగ్నస్టిక్ సాధనాలు విస్తరించబడ్డాయి;
  • స్టాటిక్ ఎనలైజర్ యొక్క పని మెరుగుపరచబడింది మరియు స్టాటిక్ విశ్లేషణ చేయడంపై డాక్యుమెంటేషన్ జోడించబడింది. అందుబాటులో ఉన్న చెకర్ మాడ్యూల్స్ మరియు మద్దతు ఉన్న ఎంపికలను ప్రదర్శించడానికి ఫ్లాగ్‌లు జోడించబడ్డాయి (“-ఎనలైజర్-చెకర్[-ఎంపిక]-సహాయం”, “-ఎనలైజర్-చెకర్[-ఎంపిక]-హెల్ప్-ఆల్ఫా” మరియు “-ఎనలైజర్-చెకర్[-ఎంపిక]-సహాయం ”-డెవలపర్”). హెచ్చరికలను లోపాలుగా పరిగణించడానికి "-analyzer-werror" ఫ్లాగ్ జోడించబడింది.
    కొత్త ధృవీకరణ మోడ్‌లు జోడించబడ్డాయి:

    • బఫర్‌లతో పని చేయడానికి అసురక్షిత పద్ధతులను గుర్తించడానికి security.insecureAPI.DeprecatedOrUnsafeBufferHandling;
    • osx.MIGChecker MIG (మాక్ ఇంటర్‌ఫేస్ జనరేటర్) కాల్ నియమాల ఉల్లంఘనల కోసం శోధించడానికి;
    • optin.osx.OSObjectCStyleCast తప్పు XNU libkern ఆబ్జెక్ట్ మార్పిడులను కనుగొనడానికి;
    • LLVM కోడ్‌బేస్‌లో లోపాలను గుర్తించడానికి మోడలింగ్ చెకింగ్ ఫంక్షన్‌ల సమితితో apiModeling.llvm;
    • ప్రారంభించబడని C++ ఆబ్జెక్ట్‌లను తనిఖీ చేయడానికి స్థిరీకరించబడిన కోడ్ (optin.cplusplus ప్యాకేజీలో UnininitializedObject);
  • క్లాంగ్-ఫార్మాట్ యుటిలిటీ C# భాషలో కోడ్ ఫార్మాటింగ్ కోసం మద్దతును జోడించింది మరియు మైక్రోసాఫ్ట్ ఉపయోగించే కోడ్ ఫార్మాటింగ్ శైలికి మద్దతును అందిస్తుంది;
  • clang-cl, విజువల్ స్టూడియోలో చేర్చబడిన cl.exe కంపైలర్‌తో ఎంపిక-స్థాయి అనుకూలతను అందించే ప్రత్యామ్నాయ కమాండ్-లైన్ ఇంటర్‌ఫేస్, ఉనికిలో లేని ఫైల్‌లను కమాండ్-లైన్ ఎంపికలుగా పరిగణించడానికి మరియు సంబంధిత హెచ్చరికను ప్రదర్శించడానికి హ్యూరిస్టిక్‌లను జోడించింది (ఉదాహరణకు, "clang-cl / diagnostic :caret /c test.cc"ని అమలు చేస్తున్నప్పుడు);
  • ఓపెన్‌ఎమ్‌పి APIకి నిర్దిష్టంగా జోడించిన చెక్‌లతో సహా, కొత్త చెక్‌లలో ఎక్కువ భాగం లింటర్ క్లాంగ్-టిడీకి జోడించబడింది;
  • విస్తరించింది సర్వర్ సామర్థ్యాలు క్లాంగ్డ్ (క్లాంగ్ సర్వర్), దీనిలో బ్యాక్‌గ్రౌండ్ ఇండెక్స్ బిల్డింగ్ మోడ్ డిఫాల్ట్‌గా ప్రారంభించబడింది, కోడ్‌తో సందర్భోచిత చర్యలకు మద్దతు జోడించబడింది (వేరియబుల్ రిట్రీవల్, ఆటో మరియు మాక్రో డెఫినిషన్‌ల విస్తరణ, తప్పించుకున్న స్ట్రింగ్‌లను తప్పించుకోని వాటికి మార్చడం), ప్రదర్శించే సామర్థ్యం క్లాంగ్-టిడీ నుండి హెచ్చరికలు, హెడర్ ఫైల్‌లలో ఎర్రర్‌ల విస్తరణ విశ్లేషణలు మరియు టైప్ సోపానక్రమం గురించి సమాచారాన్ని ప్రదర్శించే సామర్థ్యాన్ని జోడించారు;

ప్రధాన ఆవిష్కరణలు LLVM 9.0:

  • LLD లింకర్‌కు ప్రయోగాత్మక విభజన ఫీచర్ జోడించబడింది, ఇది ఒక ప్రోగ్రామ్‌ను అనేక భాగాలుగా విభజించడానికి మిమ్మల్ని అనుమతిస్తుంది, వీటిలో ప్రతి ఒక్కటి ప్రత్యేక ELF ఫైల్‌లో ఉంది. ఈ ఫీచర్ ప్రోగ్రామ్ యొక్క ప్రధాన భాగాన్ని ప్రారంభించేందుకు మిమ్మల్ని అనుమతిస్తుంది, ఇది ఆపరేషన్ సమయంలో అవసరమైన ఇతర భాగాలను లోడ్ చేస్తుంది (ఉదాహరణకు, మీరు అంతర్నిర్మిత PDF వీక్షకుడిని ప్రత్యేక ఫైల్‌గా వేరు చేయవచ్చు, ఇది వినియోగదారు PDFని తెరిచినప్పుడు మాత్రమే లోడ్ అవుతుంది. ఫైల్).

    LLD లింకర్ తెరపైకి తెచ్చారు arm32_7, arm64, ppc64le మరియు x86_64 ఆర్కిటెక్చర్‌ల కోసం Linux కెర్నల్‌ను లింక్ చేయడానికి అనువైన స్థితికి.
    కొత్త ఎంపికలు "-" (stdoutకి అవుట్‌పుట్), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" మరియు "-z common-page-size". AArch64 ఆర్కిటెక్చర్ కోసం, BTI (బ్రాంచ్ టార్గెట్ ఇండికేటర్) మరియు PAC (పాయింటర్ అథెంటికేషన్ కోడ్) సూచనలకు మద్దతు జోడించబడింది. MIPS, RISC-V మరియు PowerPC ప్లాట్‌ఫారమ్‌లకు మద్దతు గణనీయంగా మెరుగుపరచబడింది. WebAssembly కోసం డైనమిక్ లింకింగ్ కోసం ప్రారంభ మద్దతు జోడించబడింది;

  • libc++లో అమలు చేశారు విధులు ssize, std::is_constant_evaluated, std::midpoint మరియు std::lerp, పద్ధతులు "ముందు" మరియు "వెనుక" std::spanకి జోడించబడ్డాయి, రకాల std::is_unbounded_array మరియు std::is_bounded_array జోడించబడ్డాయి , std సామర్థ్యాలు విస్తరించబడ్డాయి: : పరమాణు. GCC 4.9కి మద్దతు నిలిపివేయబడింది (GCC 5.1 మరియు కొత్త విడుదలలతో ఉపయోగించవచ్చు). మద్దతు జోడించబడింది నేనా (WebAssembly సిస్టమ్ ఇంటర్‌ఫేస్, బ్రౌజర్ వెలుపల WebAssemblyని ఉపయోగించడానికి ఒక ఇంటర్‌ఫేస్);
  • కొత్త ఆప్టిమైజేషన్‌లు జోడించబడ్డాయి. కొన్ని సందర్భాల్లో memcmp కాల్‌లను bcmpకి మార్చడం ప్రారంభించబడింది. దిగువ స్విచ్ బ్లాక్‌లు చేరుకోలేని లేదా సూచనలను ఉపయోగించనప్పుడు, ఉదాహరణకు, టైప్ శూన్యంతో ఫంక్షన్‌లను కాల్ చేస్తున్నప్పుడు, జంప్ టేబుల్‌ల కోసం రేంజ్ తనిఖీని అమలు చేయడం లేదు;
  • RISC-V ఆర్కిటెక్చర్ కోసం బ్యాకెండ్ స్థిరీకరించబడింది, ఇది ఇకపై ప్రయోగాత్మకంగా ఉంచబడదు మరియు డిఫాల్ట్‌గా నిర్మించబడింది. MAFDC పొడిగింపులతో RV32I మరియు RV64I సూచనల సెట్ వేరియంట్‌లకు పూర్తి కోడ్ ఉత్పత్తి మద్దతును అందిస్తుంది;
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU మరియు PowerPC ఆర్కిటెక్చర్‌ల కోసం బ్యాకెండ్‌లకు అనేక మెరుగుదలలు చేయబడ్డాయి. ఉదాహరణకు, ఆర్కిటెక్చర్ కోసం
    ARM బ్యాకెండ్‌లో SVE64 (స్కేలబుల్ వెక్టర్ ఎక్స్‌టెన్షన్ 2) మరియు MTE (మెమరీ ట్యాగింగ్ ఎక్స్‌టెన్షన్స్) సూచనలకు AArch2 మద్దతునిచ్చింది, Armv8.1-M ఆర్కిటెక్చర్ మరియు MVE (M-ప్రొఫైల్ వెక్టర్ ఎక్స్‌టెన్షన్) పొడిగింపు జోడించబడింది. GFX10 (Navi) ఆర్కిటెక్చర్‌కు మద్దతు AMDGPU బ్యాకెండ్‌కు జోడించబడింది, ఫంక్షన్ కాలింగ్ సామర్థ్యాలు డిఫాల్ట్‌గా ప్రారంభించబడతాయి మరియు మిశ్రమ పాస్ సక్రియం చేయబడింది DPP (డేటా-ప్యారలల్ ప్రిమిటివ్స్).

  • LLDB డీబగ్గర్ ఇప్పుడు బ్యాక్‌ట్రేస్‌ల కోసం కలర్ హైలైటింగ్‌ని కలిగి ఉంది మరియు DWARF4 డీబగ్_టైప్స్ మరియు DWARF5 డీబగ్_ఇన్ఫో బ్లాక్‌లకు మద్దతు జోడించబడింది;
  • COFF ఆకృతిలో ఆబ్జెక్ట్ మరియు ఎక్జిక్యూటబుల్ ఫైల్‌లకు మద్దతు llvm-objcopy మరియు llvm-strip యుటిలిటీలకు జోడించబడింది.

మూలం: opennet.ru

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