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

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

በኤልኤልቪኤም 10.0 ውስጥ ያሉ አዳዲስ ባህሪያት ለ C++ ጽንሰ-ሀሳቦች ድጋፍን ያካትታሉ፣ ከአሁን በኋላ ክላንግን እንደ የተለየ ሂደት አይሰራም፣ ለ CFG (የቁጥጥር ፍሰት ጠባቂ) የዊንዶውስ ቼኮች እና ለአዲስ ሲፒዩ ችሎታዎች ድጋፍ።

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

  • ለ" ድጋፍ ታክሏልጽንሰ-ሐሳቦች"፣ C++ አብነት ቅጥያ በሚቀጥለው መስፈርት ውስጥ የሚካተት፣ በኮድ ስም C++2a (በ -std=c++2a ባንዲራ የበራ)።
    ፅንሰ-ሀሳቦች የአብነት መለኪያ መስፈርቶችን ስብስብ እንዲገልጹ ያስችሉዎታል፣ ይህም በማጠናቀር ጊዜ፣ እንደ አብነት መመዘኛዎች ተቀባይነት ያላቸውን ነጋሪ እሴቶች ስብስብ ይገድባል። ፅንሰ-ሀሳቦቹ በአብነት ውስጥ ጥቅም ላይ በሚውሉ የውሂብ አይነቶች ባህሪያት እና በግቤት ግቤቶች የውሂብ አይነት ባህሪያት መካከል ያለውን አመክንዮአዊ አለመጣጣም ለማስወገድ ጥቅም ላይ ሊውሉ ይችላሉ.

    አብነት
    ፅንሰ-ሀሳብ እኩልነት ሊወዳደር የሚችል = ይጠይቃል (T a, T b) {
    {a == b } -> std:: ቡሊያን;
    {a != b } -> std:: boolean;
    };

  • በነባሪ, ማጠናቀር የሚከናወነው የተለየ ሂደት ("clang -cc1") መጀመር ይቆማል. ማጠናቀር አሁን በዋናው ሂደት ውስጥ ተከናውኗል, እና "-fno-integrated-cc1" አማራጭ የድሮውን ባህሪ ለመመለስ ጥቅም ላይ ሊውል ይችላል.
  • አዲስ የምርመራ ሁነታዎች፡-
    • "-Wc99-designator" እና "-Wreorder-init-list" C99 ማስጀመሪያዎችን በC++ ሁነታ በC99 ትክክል ሲሆኑ ነገር ግን በC++20 ላይ እንዳይጠቀሙ ያስጠነቅቃሉ።
    • "-Wsizeof-array-div" - እንደ "int arr[10] ያሉ ሁኔታዎችን ይይዛል; …መጠን(arr) /መጠኑ(አጭር)…” (“መጠን(arr)/መጠን(int)” መሆን አለበት።
    • "-Wxor-used-as-po" - እንደ "^" (xor) ኦፕሬተርን ከማጉላት (2 ^ 16) ጋር ሊምታታ በሚችል ኦፕሬሽኖች ውስጥ ግንባታዎችን ከመጠቀም ያስጠነቅቃል.
    • "-Wfinal-dtor-ያልሆኑ የመጨረሻ-ክፍል" - "የመጨረሻ" ገላጭ ጋር ምልክት አይደለም ክፍሎች ስለ ያስጠነቅቃል, ነገር ግን "የመጨረሻ" ባህሪ ጋር አጥፊ አላቸው.
    • "-Wtautological-bitwise-compare" በቢትዊዝ ኦፕሬሽን እና በቋሚ መካከል ያለውን ታውቶሎጂካል ንፅፅርን ለመመርመር እና የቢትዊዝ OR ኦፕሬሽን አሉታዊ ባልሆነ ቁጥር ላይ የሚተገበርበትን ሁሌም እውነተኛ ንፅፅርን ለመለየት የማስጠንቀቂያ ቡድን ነው።
    • "-Wbitwise-conditional-parentheses" አመክንዮአዊ ኦፕሬተሮችን እና (&) እና OR (|) ከሁኔታዊ ኦፕሬተር (?:) ጋር ሲቀላቀሉ ችግሮችን ያስጠነቅቃል።
    • “-Wmisleading-indentation” ከጂሲሲ የተገኘ ተመሳሳይ ስም ያለው ቼክ አናሎግ ነው፣ እሱም ስለተጠለፉ አገላለጾች ልክ እንደ/ሌላ/ለ/ጊዜ ብሎክ አካል እንደሆኑ ያስጠነቅቃል፣ነገር ግን በእውነቱ በዚህ ብሎክ ውስጥ አልተካተቱም። .
    • “-Wextra”ን ሲገልጹ፣ “-የተቀደሰ-ኮፒ” ቼክ ነቅቷል፣ ስለ ግንበኞች አጠቃቀም ማስጠንቀቂያ።
      ግልጽ አጥፊ ፍቺ ባላቸው ክፍሎች ውስጥ "አንቀሳቅስ" እና "ቅዳ"።

    • የ "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-ትንተና" ቼኮች ተዘርግተዋል.
    • የ"-Wbitwise-op-parentheses" እና "-Wlogical-op-parentheses" ቼኮች በነባሪነት ተሰናክለዋል።
  • በ C እና C ++ ኮድ ውስጥ የጠቋሚ የሂሳብ ስራዎች በድርድር ውስጥ ብቻ ይፈቀዳሉ. በ"-fsanitize=pointer-overflow" ሁነታ ላይ ያለው ያልተገለፀው የባህሪ ሳኒታይዘር አሁን እንደ ዜሮ ያልሆነ ማካካሻ ወደ ባዶ ጠቋሚ ማከል ወይም ኢንቲጀርን ከኑል ካልሆኑ ጠቋሚ ሲቀንሱ ያሉ ጉዳዮችን ይይዛል።
  • የ"-fsanitize=implicit-conversion"(Implicit Conversion Sanitizer) ሁነታ ከ"int" አይነት ትንሽ መጠን ያላቸውን አይነቶች በመጨመር እና በመቀነስ ላይ ያሉ ችግሮችን ለመለየት ተስተካክሏል።
  • x86 ኢላማ አርክቴክቸር ሲመርጡ "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" እና "-march=cooperlake" በነባሪነት በ vectorized ኮድ 512-ቢት zmm መዝገቦችን መጠቀም አቁሟል፣በምንጭ ኮድ ውስጥ በቀጥታ ከማመላከታቸው በስተቀር። ምክንያቱ የ 512 ቢት ስራዎችን በሚያከናውንበት ጊዜ የሲፒዩ ድግግሞሽ ይቀንሳል, ይህም አጠቃላይ አፈፃፀም ላይ አሉታዊ ተጽዕኖ ሊያሳድር ይችላል. አዲሱን ባህሪ ለመቀየር "-mprefer-vector-width=512" አማራጭ ቀርቧል።
  • የ"-flax-vector-conversions" ባንዲራ ባህሪ ከጂሲሲ ጋር ተመሳሳይ ነው፡ ኢንቲጀር እና ተንሳፋፊ ነጥብ ቬክተር መካከል ስውር የቬክተር ቢት ልወጣዎች የተከለከሉ ናቸው። ይህንን ገደብ ለማጥፋት ባንዲራውን ለመጠቀም ይመከራል
    "-flax-vector-conversions=all" ይህም ነባሪው ነው።

  • ለ Octeon ቤተሰብ MIPS ሲፒዩዎች የተሻሻለ ድጋፍ። ልክ የሆኑ የሲፒዩ አይነቶች ዝርዝር ውስጥ "octeon+" ታክሏል።
  • ወደ WebAssembly መካከለኛ ኮድ በሚሰበሰቡበት ጊዜ በሲስተሙ ውስጥ ካለ የ wasm-opt optimizer በራስ-ሰር ይጠራል።
  • በ RISC-V ሥነ ሕንፃ ላይ ለተመሠረቱ ሥርዓቶች ተንሳፋፊ ነጥብ እሴቶችን የሚያከማቹ መዝገቦችን መጠቀም በሁኔታዊ የአሰባሳቢ መስመር ማስገቢያዎች ውስጥ ይፈቀዳል።
  • አዲስ የአቀናባሪ ባንዲራዎች ታክለዋል፡ "-fgnuc-version" የስሪት ዋጋን ለ"__GNUC__" እና ተመሳሳይ ማክሮዎች ለማዘጋጀት፤ "-fmacro-prefix-map=OLD=አዲስ" እንደ "__FILE__" ባሉ ማክሮዎች የድሮውን ማውጫ ቅድመ ቅጥያ በአዲስ ለመተካት; "-fpatchable-function-entry=N[,M]" ከተግባር መግቢያ ነጥብ በፊት እና በኋላ የተወሰኑ የNOP መመሪያዎችን ለማመንጨት። ለ RISC-V
    ለ"-ffixed-xX"፣ "-mcmodel=medany" እና "-mcmodel=medlow" ባንዲራዎች ተጨማሪ ድጋፍ።

  • ለ'__ባህሪይ__((ዒላማ("ቅርንጫፍ-ጥበቃ=..."))) መገለጫ ባህሪ ታክሏል፣ ውጤቱም ከአማራጭ ጋር ተመሳሳይ ነው። - ቅርንጫፍ-መከላከያ.
  • በዊንዶውስ መድረክ ላይ, የ "-cfguard" ባንዲራ ሲገልጹ, የአፈፃፀም ፍሰት ትክክለኛነት ፍተሻዎችን (የመቆጣጠሪያ ፍሰት ጠባቂ) በተዘዋዋሪ የተግባር ጥሪዎች መተካት ይተገበራል. የፍተሻ ምትክን ለማሰናከል የ"-cfguard-nochecks" ባንዲራ ወይም "__declspec(guard(nocf))"ማሻሻያ መጠቀም ይችላሉ።
  • የ gnu_inline ባህሪ ባህሪ ያለ "ውጫዊ" ቁልፍ ቃል ጥቅም ላይ በሚውልበት ጊዜ ከጂሲሲ ጋር ተመሳሳይ ነው.
  • ከOpenCL እና CUDA ድጋፍ ጋር የተያያዙ ችሎታዎች ተዘርግተዋል። ለአዲስ የOpenMP 5.0 ባህሪያት ድጋፍ ታክሏል።
  • ኮድ ሲተነተን እና ሲቀረፅ ጥቅም ላይ የዋለውን የC++ ስታንዳርድ ስሪት (የቅርብ ጊዜ፣ አውቶ፣ c++03፣ c++11፣ c++14፣ c++17፣ c++20፣ c++XNUMX፣ c++XNUMX)።
  • አዲስ ፍተሻዎች ወደ static analyzer ተጨምረዋል፡ alpha.cplusplus.PlacementNew፣ በቂ የማከማቻ ቦታ እንዳለ ለማወቅ፣ fuchsia.HandleChecker ከFuchsia ተቆጣጣሪዎች ጋር የተዛመዱ ፍንጣቂዎችን ለመለየት፣security.insecureAPI.decodeValueOfObjCType [NSCoder deValueBjUeBJJType] በሚጠቀሙበት ጊዜ ቋት የሚበዛበትን ለማወቅ በ፡]።
  • ያልተገለፀው የባህሪ ሳኒታይዘር (UBSan) ዜሮ ያልሆኑ ማካካሻዎችን ወደ NULL ጠቋሚዎች መተግበርን ወይም የ NULL ጠቋሚ ማካካሻ መጨመርን ለመያዝ የጠቋሚውን የትርፍ ፍሰት ፍተሻዎችን አስፍቷል።
  • በሊንተር ክላንግ-የተስተካከለ ታክሏል አዲስ ቼኮች ትልቅ ክፍል.

ዋና ፈጠራዎች LLVM 10.0:

  • ወደ ማዕቀፉ መለያ ሰጪ አዳዲስ የእርስ በርስ ማመቻቸት እና ተንታኞች ተጨምረዋል። እንደ ህያውነት ያሉ 19 ባህሪያት 12 LLVM IR እና 12 ረቂቅ ባህሪያትን ጨምሮ የ7 የተለያዩ ባህሪያት ሁኔታ ተንብዮአል።
  • በአቀነባባሪው ውስጥ የተገነቡ አዲስ ማትሪክስ የሂሳብ ተግባራት ታክለዋል (ውስጣዊ ነገሮች) በማጠናቀር ጊዜ በተቀላጠፈ የቬክተር መመሪያዎች የሚተኩ።
  • ለX86፣ AArch64፣ ARM፣ SystemZ፣ MIPS፣ AMDGPU እና PowerPC አርክቴክቸር ለጀርባ ድጋፍ ብዙ ማሻሻያዎች ተደርገዋል። የሲፒዩ ድጋፍ ታክሏል።
    Cortex-A65, Cortex-A65AE, Neoverse E1 እና Neoverse N1. ለ ARMv8.1-M፣ የኮድ ማመንጨት ሂደት ተሻሽሏል (ለምሳሌ፣ በትንሹ በላይ ላይ ላሉት loops ድጋፍ ታይቷል) እና የMVE ማራዘሚያን በመጠቀም አውቶቬክተር የማድረግ ድጋፍ ተጨምሯል። የተሻሻለ ሲፒዩ MIPS Octeon ድጋፍ። ለPowerPC፣ የ MASSV (የሂሳብ አፋጣኝ ንዑስ ስርዓት) ቤተ-መጽሐፍትን በመጠቀም የሒሳብ ንዑስ ክፍሎችን ቬክተር ማድረግ ነቅቷል፣ ኮድ ማመንጨት ተሻሽሏል፣ እና ከ loops የማስታወሻ መዳረሻ ተመቻችቷል። ለ x86፣ የቬክተር አይነቶች v2i32፣ v4i16፣ v2i16፣ v8i8፣ v4i8 እና v2i8 አያያዝ ተለውጧል።

  • ለWebAssembly የተሻሻለ ኮድ ጄኔሬተር። ለTLS (የክር-አከባቢ ማከማቻ) እና የatomic.fence መመሪያዎች ድጋፍ ታክሏል። የሲምዲ ድጋፍ በከፍተኛ ሁኔታ ተስፋፍቷል። WebAssembly የነገር ፋይሎች አሁን ባለብዙ ዋጋ የተግባር ፊርማዎችን የመጠቀም ችሎታ አላቸው።
  • loops በሚሰራበት ጊዜ ተንታኙ ጥቅም ላይ ይውላል ማህደረ ትውስታSSA, ይህም በተለያዩ የማህደረ ትውስታ ስራዎች መካከል ያለውን ጥገኝነት እንዲገልጹ ያስችልዎታል. MemorySSA የማጠናቀር እና የማስፈጸሚያ ጊዜን ሊቀንስ ይችላል ወይም ከአሊያስሴት ትራከር ይልቅ አፈጻጸም ሳያጣ መጠቀም ይችላል።
  • የኤልዲቢ አራሚው ለDWARF v5 ቅርጸት ድጋፍን በከፍተኛ ሁኔታ አሻሽሏል። ከ MinGW ጋር ለመገንባት የተሻሻለ ድጋፍ
    እና የ Windows executablesን ለARM እና ARM64 አርክቴክቸር የማረም የመጀመሪያ ችሎታ ታክሏል። ትርን በመጫን ግቤትን በራስ-ሰር ሲያጠናቅቁ የቀረቡት አማራጮች መግለጫዎች ታክለዋል።

  • ተስፋፋ የኤልኤልዲ ማያያዣ ችሎታዎች። ለኤልኤፍ ቅርጸት የተሻሻለ ድጋፍ፣ የግሎብ አብነቶችን ከጂኤንዩ አገናኝ ጋር ሙሉ ለሙሉ ተኳሃኝነትን ማረጋገጥ፣ ለተጨመቁ ማረም ክፍሎች ድጋፍን ማከል ".zdebug"፣ የ.note.gnu.property ክፍልን ለመግለጽ የPT_GNU_PROPERTY ንብረቱን ማከል (ለወደፊት ጥቅም ላይ ሊውል ይችላል) ሊኑክስ ኮርነሎች),
    የ "-z noseparate-code", "-z የተለየ-ኮድ" እና "-z የተለየ ሊጫኑ የሚችሉ-ክፍልች" ሁነታዎች ተተግብረዋል. ለMingW እና WebAssembly የተሻሻለ ድጋፍ።

ምንጭ: opennet.ru

አስተያየት ያክሉ