የኤልኤልቪኤም 9.0 ማጠናከሪያ ስብስብ መለቀቅ

ከስድስት ወር እድገት በኋላ ቀርቧል የፕሮጀክት መለቀቅ LLVM 9.0 — ከጂሲሲ ጋር ተኳሃኝ የሆኑ መሳሪያዎች (አቀናባሪዎች፣ አመቻቾች እና ኮድ ማመንጫዎች)፣ ፕሮግራሞችን ወደ መካከለኛ ቢትኮድ እንደ RISC መሰል ምናባዊ መመሪያዎች ማጠናቀር (ዝቅተኛ ደረጃ ምናባዊ ማሽን ባለብዙ ደረጃ ማሻሻያ ስርዓት)። የመነጨው pseudocode በፕሮግራሙ አፈጻጸም ጊዜ በቀጥታ በጂአይቲ ማጠናከሪያ ወደ ማሽን መመሪያዎች ሊቀየር ይችላል።

የኤልኤልቪኤም 9.0 አዳዲስ ባህሪያት የሙከራ ንድፍ መለያውን ከዒላማው RISC-V መድረክ ማስወገድ፣ የC++ ድጋፍ ለOpenCL፣ ፕሮግራምን በኤልኤልዲ ውስጥ በተለዋዋጭ ወደተጫኑ ክፍሎች የመከፋፈል ችሎታ እና የ"asm ጎቶ"፣ በሊኑክስ የከርነል ኮድ ውስጥ ጥቅም ላይ ይውላል። libc++ ለ WASI (WebAssembly System Interface) ድጋፍ አክሏል፣ እና LLD ለWebAssembly ተለዋዋጭ ትስስር የመጀመሪያ ድጋፍን አክሏል።

ማሻሻያዎች በክላንግ 9.0 ውስጥ:

  • ታክሏል። የ GCC-ተኮር አገላለጽ መተግበር "asm ጎቶ"፣ ይህም ከተሰብሳቢ የውስጥ መስመር ብሎክ ወደ ሲ ኮድ መለያ እንድትሸጋገሩ ያስችልዎታል። ይህ ባህሪ የ x86_64 አርክቴክቸር ባላቸው ሲስተሞች ላይ Clangን በመጠቀም የሊኑክስ ከርነልን በ"CONFIG_JUMP_LABEL=y" ሁነታ ለመስራት ያስፈልጋል። በቀደሙት እትሞች ላይ የታከሉትን ለውጦች ከግምት ውስጥ በማስገባት የሊኑክስ ከርነል አሁን በ Clang ውስጥ ለ x86_64 አርክቴክቸር ሊገነባ ይችላል (ከዚህ ቀደም ለ ክንድ ፣ aarch64 ፣ ppc32 ፣ ppc64le እና ሚፕስ አርክቴክቸር የሚደገፈው)። ከዚህም በላይ አንድሮይድ እና ChromeOS ፕሮጄክቶች ክላንግን ለከርነል ግንባታ እንዲጠቀሙ ተለውጠዋል፣ እና ጎግል ክላንግን ለሊኑክስ ስርዓቶቹ የከርነል ግንባታ ዋና መድረክ አድርጎ እየሞከረ ነው። ወደፊት ሌሎች LLVM ክፍሎች ከርነል ግንባታ ሂደት ውስጥ ጥቅም ላይ ሊውሉ ይችላሉ, LLD, llvm-objcopy, lvm-ar, lvm-nm እና lvm-objdump;
  • በOpenCL ውስጥ C++17 ለመጠቀም የሙከራ ድጋፍ ታክሏል። የተወሰኑ ባህሪያት የአድራሻ ቦታ ባህሪያትን መደገፍ፣ የአድራሻ ቦታ መቀየርን በአይነት መልቀቅ ኦፕሬተሮችን ማገድ፣ የቬክተር አይነቶችን እንደ OpenCL for C ማቅረብ፣ የተወሰኑ የOpenCL አይነቶች ምስሎች፣ ዝግጅቶች፣ ሰርጦች፣ ወዘተ መኖራቸውን ያካትታሉ።
  • የተለያዩ የፊት ፈርዶች (ትንተና፣ ጅምር) እና የኋላ (የማመቻቸት ደረጃዎች) የአፈፃፀም ጊዜን በተመለከተ ሪፖርት ለማመንጨት አዲስ የማጠናቀሪያ ባንዲራዎች “-ftime-trace” እና “-ftime-trace-granularity=N” ታክለዋል። ሪፖርቱ ከchrome://tracing እና speedscope.app ጋር ተኳሃኝ በሆነ በ json ቅርጸት ተቀምጧል።
  • በ Visual Studio አካባቢ ውስጥ የማህደረ ትውስታ ፍጆታን ለመከታተል የሚያስችል የ"__declspec(allocator)" ገለፃ እና ተጓዳኝ የማረሚያ መረጃ ማመንጨት ታክሏል።
  • ለC ቋንቋ፣ ለ«__FILE_NAME__» ማክሮ ድጋፍ ታክሏል፣ ይህም ከ«__FILE__» ማክሮ ጋር የሚመሳሰል፣ ነገር ግን ያለ ሙሉ ዱካ የፋይል ስሙን ብቻ ያካትታል።
  • C++ የተለያዩ የC++ ባህሪያትን ለመሸፈን የአድራሻ ቦታ ባህሪያት ድጋፍን ዘርግቷል፣የመለኪያ እና የክርክር ቅጦችን፣የማጣቀሻ አይነቶችን፣የመመለሻ አይነትን ፣ነገሮችን፣በራስ-የተፈጠሩ ተግባራትን፣ አብሮ የተሰሩ ኦፕሬተሮችን እና ሌሎችንም ጨምሮ።
  • ከOpenCL፣ OpenMP እና CUDA ድጋፍ ጋር የተያያዙ አቅሞች ተዘርግተዋል። ይህ አብሮ የተሰሩ የOpenCL ተግባራትን (የ"-fdeclare-opencl-builtins" ባንዲራ ተጨምሯል) የመጀመሪያ ድጋፍን ያካትታል፣ የ cl_arm_integer_dot_ምርት ቅጥያ ተተግብሯል፣ እና የመመርመሪያ መሳሪያዎች ተዘርግተዋል፤
  • የስታቲስቲክ ተንታኝ ሥራ ተሻሽሏል እና የማይንቀሳቀስ ትንታኔን የሚያካሂዱ ሰነዶች ተጨምረዋል። የሚገኙ አራሚ ሞጁሎችን እና የሚደገፉ አማራጮችን ለማሳየት ባንዲራዎች ("-analyzer-Checker[-አማራጭ]-እርዳታ", "-analyzer-Checker[-አማራጭ]-እርዳታ-አልፋ" እና "-analyzer-Checker[-አማራጭ]-እርዳታ "-ገንቢ"). ማስጠንቀቂያዎችን እንደ ስህተት ለማየት የ"-analyzer-werror" ባንዲራ ታክሏል።
    አዲስ የማረጋገጫ ሁነታዎች ታክለዋል፡

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling ከመያዣዎች ጋር ለመስራት ደህንነታቸው ያልተጠበቀ አሰራርን ለመለየት;
    • osx.MIGChecker የ MIG (Mach Interface Generator) የጥሪ ደንቦችን መጣስ ለመፈለግ;
    • optin.osx.OSObjectCStyleCast የተሳሳቱ የXNU libkern ነገር ልወጣዎችን ለማግኘት፤
    • apiModeling.llvm በኤልኤልቪኤም ኮድ ቤዝ ውስጥ ስህተቶችን ለማግኘት ከሞዴሊንግ ቼክ ተግባራት ስብስብ ጋር;
    • ያልታወቁ C++ ነገሮችን ለመፈተሽ የተረጋጋ ኮድ (UninitializedObject በoptin.cplusplus ጥቅል ውስጥ);
  • የ clang-format utility በ C # ቋንቋ ኮድን ለመቅረጽ ድጋፍን አክሏል እና በማይክሮሶፍት ለሚጠቀሙት የኮድ ቅርጸት ዘይቤ ድጋፍ ይሰጣል።
  • Clag-cl፣ በቪዥዋል ስቱዲዮ ውስጥ ከተካተቱት የ cl.exe ማቀናበሪያ ጋር በአማራጭ ደረጃ ተኳሃኝነት የሚሰጥ አማራጭ የትዕዛዝ-መስመር በይነገጽ፣ ነባር ያልሆኑ ፋይሎችን እንደ የትዕዛዝ መስመር አማራጮች ለማየት ሂዩሪስቲክስ አክሏል። "clang-cl /diagnostic:caret /c test.cc" ሲሮጥ;
  • ለOpenMP API የተለዩ የተጨመሩ ቼኮችን ጨምሮ ብዙ የአዳዲስ ቼኮች ክፍል ወደ ሊንተር ክላሊግ-ቲዲ ተጨምሯል።
  • ተስፋፋ የአገልጋይ ችሎታዎች Clangd (ክላንግ አገልጋይ)፣ የበስተጀርባ ኢንዴክስ ግንባታ ሁነታ በነባሪነት የነቃበት፣ ለዐውደ-ጽሑፋዊ ድርጊቶች ድጋፍ ከኮድ ጋር ተጨምሯል (ተለዋዋጭ ሰርስሮ ማውጣት፣ የአውቶ እና የማክሮ ትርጓሜዎች መስፋፋት፣ ያመለጠ ሕብረቁምፊዎች ወደማይገኙ መለወጥ)፣ የማሳየት ችሎታ ከ Clang-tidy ማስጠንቀቂያዎች ፣ በርዕስ ፋይሎች ውስጥ ያሉ ስህተቶችን መመርመር እና ስለ ዓይነቱ ተዋረድ መረጃን የማሳየት ችሎታን አክሏል ፣

ዋና ፈጠራዎች LLVM 9.0:

  • በኤልኤልዲ ማያያዣ ውስጥ የሙከራ ክፍፍል ባህሪ ተጨምሯል ፣ ይህም አንድ ፕሮግራም ወደ ብዙ ክፍሎች እንዲከፍሉ ያስችልዎታል ፣ እያንዳንዱም በተለየ የኤልኤፍ ፋይል ውስጥ ይገኛል። ይህ ባህሪ የፕሮግራሙን ዋና ክፍል እንዲጀምሩ ያስችልዎታል, ይህም በሚሠራበት ጊዜ እንደ አስፈላጊነቱ ሌሎች ክፍሎችን ይጭናል (ለምሳሌ, አብሮ የተሰራውን ፒዲኤፍ መመልከቻ በተለየ ፋይል ውስጥ መለየት ይችላሉ, ይህም ተጠቃሚው ፒዲኤፍ ሲከፍት ብቻ ነው የሚጫነው). ፋይል)።

    LLD Linker ወደ ፊት አቅርቧል የሊኑክስ ከርነልን ለ arm32_7፣ arm64፣ ppc64le እና x86_64 አርክቴክቸር ለማገናኘት ተስማሚ ወደሆነ ግዛት።
    አዲስ አማራጮች "-" (ውፅዓት ወደ stdout)፣ "-[no-] allow-shlib-undefined"፣ "-undefined-glob"፣ "-nmagic"፣ "-አማጂክ"፣ "-ጥገኛ-ላይብረሪ"፣ "- z ifunc-noplt" እና "-z የጋራ-ገጽ-መጠን" ለ AArch64 አርክቴክቸር፣ ለBTI (የቅርንጫፍ ዒላማ አመልካች) እና PAC (ጠቋሚ የማረጋገጫ ኮድ) መመሪያዎች ድጋፍ ታክሏል። ለ MIPS፣ RISC-V እና PowerPC መድረኮች ድጋፍ በከፍተኛ ሁኔታ ተሻሽሏል። ለ WebAssembly ተለዋዋጭ ማገናኘት የመጀመሪያ ድጋፍ ታክሏል;

  • በlibc++ ውስጥ ተተግብሯል የተግባር መጠን፣ std ::ቋሚ_የተገመገመ፣ std :: መሃል ነጥብ እና std :: ሌርፕ ፣ "የፊት" እና "የኋላ" ዘዴዎች ወደ std :: span ተጨምረዋል ፣ የአይነቶች ባህሪዎች , std ችሎታዎች ተዘርግተዋል:: atomic. የGCC 4.9 ድጋፍ ተቋርጧል (ከGCC 5.1 እና ከአዳዲስ ልቀቶች ጋር መጠቀም ይቻላል)። ድጋፍ ታክሏል። እኔ ነበርሁ (WebAssembly System Interface፣ WebAssemblyን ከአሳሹ ውጪ ለመጠቀም የሚያስችል በይነገጽ)
  • አዲስ ማትባቶች ታክለዋል። በአንዳንድ ሁኔታዎች የmemcmp ጥሪዎችን ወደ bcmp መለወጥ ነቅቷል። የታችኛው ማብሪያ / ማጥፊያ ብሎኮች የማይደረስባቸው ወይም መመሪያዎች ጥቅም ላይ በማይውሉበት ጊዜ የዝላይ ሰንጠረዦችን ለመዝለል የክልሎችን መፈተሽ ተግባራዊ ማድረግ ፣ ለምሳሌ ፣ ተግባራትን ከ ባዶ ዓይነት ጋር ሲደውሉ ፣
  • የRISC-V አርክቴክቸር የጀርባው ክፍል ተረጋግቷል፣ ይህም እንደ የሙከራ ቦታ ያልተቀመጠ እና በነባሪነት የተገነባ ነው። ለ RV32I እና RV64I መመሪያ ስብስብ ከ MAFDC ቅጥያዎች ጋር ሙሉ የኮድ ማመንጨት ድጋፍን ይሰጣል።
  • ለX86፣ AArch64፣ ARM፣ SystemZ፣ MIPS፣ AMDGPU እና PowerPC አርክቴክቸር ለጀርባ ድጋፍ ብዙ ማሻሻያዎች ተደርገዋል። ለምሳሌ, ለሥነ ሕንፃ
    AArch64 ለ SVE2 (ስኬል የቬክተር ኤክስቴንሽን 2) እና MTE (የማህደረ ትውስታ መለያ ቅጥያዎች) መመሪያዎች ድጋፍን አክሏል፤ በARM ጀርባ ለArmv8.1-M architecture እና MVE (M-Profile Vector Extension) ቅጥያ ድጋፍ ታክሏል። የ GFX10 (Navi) አርክቴክቸር ድጋፍ ወደ AMDGPU የጀርባ ክፍል ታክሏል፣ የተግባር ጥሪ ችሎታዎች በነባሪነት ነቅተዋል፣ እና ጥምር ማለፊያ ነቅቷል DPP (ዳታ-ትይዩ ፕሪሚቲቭስ)።

  • የኤልዲቢ አራሚው አሁን ለጀርባ አሻራዎች ቀለም የሚያጎላ እና ለDWARF4 debug_types እና DWARF5 debug_info blocks ተጨማሪ ድጋፍ አለው።
  • የነገር እና ሊተገበሩ የሚችሉ ፋይሎች በ COFF ቅርጸት ድጋፍ ወደ lvm-objcopy እና lvm-strip መገልገያዎች ተጨምሯል።

ምንጭ: opennet.ru

አስተያየት ያክሉ