LLVM 13.0 कम्पाइलर सेटको रिलीज

विकासको छ महिना पछि, LLVM 13.0 परियोजनाको रिलीज प्रस्तुत गरियो - एक GCC-कम्प्याटिबल टुलकिट (कम्पाइलर, अप्टिमाइजर र कोड जेनेरेटरहरू) जसले प्रोग्रामहरूलाई RISC-जस्तो भर्चुअल निर्देशनहरूको मध्यवर्ती बिटकोडमा कम्पाइल गर्दछ (निम्न-स्तर भर्चुअल मेसिनको साथ। बहु-स्तरीय अनुकूलन प्रणाली)। जेनरेट गरिएको स्यूडोकोडलाई JIT कम्पाइलर प्रयोग गरेर मेसिन निर्देशनहरूमा सिधै कार्यक्रम कार्यान्वयनको समयमा रूपान्तरण गर्न सकिन्छ।

Clang 13.0 मा सुधारहरू:

  • ग्यारेन्टी पुच्छर कलहरूको लागि कार्यान्वयन गरिएको समर्थन (कार्यक्रमको एकदमै अन्तमा सबरुटिन कल गर्दै, यदि सबरुटिनले नै कल गर्छ भने टेल रिकर्सन बनाउँछ)। ग्यारेन्टी टेल कलहरूको लागि समर्थन C++ मा "[[clang::musttail]]" विशेषता र C मा "__attribute__((musttail))" द्वारा प्रदान गरिएको छ, "रिटर्न" कथनमा प्रयोग गरिन्छ। सुविधाले तपाईंलाई स्ट्याक खपत बचत गर्न फ्ल्याट पुनरावृत्तिमा कोड प्रयोग गरेर अनुकूलनहरू लागू गर्न अनुमति दिन्छ।
  • "प्रयोग" घोषणाहरू र क्ल्याङ् विस्तारहरूले "[[]]" ढाँचा प्रयोग गरेर C++11-शैली विशेषताहरू परिभाषित गर्न समर्थन प्रदान गर्दछ।
  • तपाईंले प्रयोगकर्ता कोडमा आरक्षित पहिचानकर्ताहरू निर्दिष्ट गर्दा चेतावनी प्रदर्शन गर्न "-Wreserved-identifier" झण्डा थपियो।
  • "-Wunused-but-set-parameter" र "-Wunused-but-set-variable" फ्ल्यागहरू थपियो यदि एक प्यारामिटर वा चर सेट गरिएको छ तर प्रयोग नगरिएको खण्डमा चेतावनी प्रदर्शन गर्न।
  • यदि कोडले घटाउने कार्यहरूमा शून्य सूचकको प्रयोगको कारणले अपरिभाषित व्यवहार प्रस्तुत गर्न सक्छ भने चेतावनी जारी गर्न "-Wnull-pointer-subtraction" झण्डा थपियो।
  • प्रत्येक कोड फाइलको लागि अतिरिक्त ".su" फाइल उत्पन्न गर्नको लागि "-fstack-usage" फ्ल्याग थपियो जसमा प्रशोधन भइरहेको फाइलमा परिभाषित प्रत्येक प्रकार्यको लागि स्ट्याक फ्रेमहरूको आकारको बारेमा जानकारी समावेश हुन्छ।
  • स्थिर विश्लेषकमा नयाँ आउटपुट प्रकार थपिएको छ - "sarif-html", जसले HTML र Sarif ढाँचाहरूमा एकै साथ रिपोर्टहरूको उत्पादन गर्न नेतृत्व गर्दछ। नयाँ allocClassWithName जाँच थपियो। "-विश्लेषक-प्रदर्शन-प्रगति" विकल्प निर्दिष्ट गर्दा, प्रत्येक प्रकार्यको विश्लेषण समय प्रदर्शित हुन्छ। स्मार्ट सूचक विश्लेषक (alpha.cplusplus.SmartPtr) लगभग तयार छ।
  • OpenCL समर्थनसँग सम्बन्धित क्षमताहरू विस्तार गरिएको छ। नयाँ विस्तारहरू cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields र __cl_clang_non_portable_kernel_param_types को लागि समर्थन थपियो। OpenCL 3.0 विशिष्टताको कार्यान्वयन जारी छ। C को लागि, OpenCL 1.2 निर्दिष्टीकरण पूर्वनिर्धारित रूपमा प्रयोग गरिन्छ जबसम्म अर्को संस्करण स्पष्ट रूपमा चयन गरिएको छैन। C++ को लागि, ".clcpp" एक्स्टेन्सन भएका फाइलहरूको लागि समर्थन थपिएको छ।
  • OpenMP 5.1 निर्दिष्टीकरणमा परिभाषित लुप रूपान्तरण निर्देशनहरू ("#pragma omp unrol" र "#pragma omp टाइल") को लागि समर्थन लागू गरिएको छ।
  • clang-ढाँचा उपयोगितामा विकल्पहरू थपियो: टिप्पणीहरू अघि स्पेसहरूको संख्या परिभाषित गर्न SpacesInLineCommentPrefix, IndentAccessModifiers, LambdaBodyIndentation र PPIndentWidth प्रविष्टिहरूको पङ्क्तिबद्धता, lambda अभिव्यक्ति र पूर्वप्रोसेसर निर्देशनहरू नियन्त्रण गर्न। हेडर फाइलहरू (SortIncludes) को गणना क्रमबद्ध गर्ने सम्भावनाहरू विस्तार गरिएको छ। JSON फाइलहरू ढाँचाको लागि समर्थन थपियो।
  • नयाँ चेकहरूको ठूलो भाग लिन्टर क्ल्यांग-सुथरामा थपिएको छ।

LLVM 13.0 मा प्रमुख आविष्कारहरू:

  • अपवाद ह्यान्डलिंग चरणमा रिटर्न-ओरिएंटेड प्रोग्रामिङ (ROP) प्रविधिहरू प्रयोग गरेर निर्मित शोषणहरूको कार्यान्वयनबाट जोगाउन CET (Windows Control-flow Enforcement Technology) प्रविधि प्रयोग गर्न "-ehcontguard" विकल्प थपियो।
  • debuginfo-test परियोजनालाई क्रस-प्रोजेक्ट-परीक्षणहरू पुन: नामाकरण गरिएको छ र डिबगिङ जानकारीमा सीमित नभएर विभिन्न परियोजनाहरूबाट कम्पोनेन्टहरू परीक्षण गर्न डिजाइन गरिएको छ।
  • असेंबली प्रणालीले धेरै वितरणहरू निर्माण गर्न समर्थन प्रदान गर्दछ, उदाहरणका लागि, एउटा उपयोगिताहरूसहित, र अर्को विकासकर्ताहरूको लागि पुस्तकालयहरू।
  • AArch64 आर्किटेक्चरको लागि ब्याकइन्डमा, Armv9-A RME (Realm Management Extension) र SME (Scalable Matrix Extension) को लागि समर्थन एसेम्बलरमा लागू गरिएको छ।
  • हेक्सागन आर्किटेक्चरको लागि ब्याकइन्डमा ISA V68/HVX को लागि समर्थन थपिएको छ।
  • x86 ब्याकइन्डले AMD Zen 3 प्रोसेसरहरूको लागि समर्थन सुधार गरेको छ।
  • AMDGPU ब्याकइन्डमा GFX1013 RDNA2 APU को लागि समर्थन थपियो।
  • Libc++ ले C++20 र C++2b मापदण्डका नयाँ सुविधाहरू लागू गर्न जारी राख्छ, जसमा "अवधारणाहरू" पुस्तकालयको पूर्णता पनि समावेश छ। MinGW-आधारित Windows प्लेटफर्मको लागि std::filesystem को लागि समर्थन थपियो। हेडर फाइलहरू , र छुट्याइएको छ। पूर्ण रूपमा कार्यान्वयन नगरिएको कार्यक्षमतासँग हेडर फाइलहरू असक्षम गर्न निर्माण विकल्प LIBCXX_ENABLE_INCOMPLETE_FEATURES थपियो।
  • LLD लिङ्करको क्षमताहरू विस्तार गरिएको छ, जसमा बिग-एन्डियन Aarch64 प्रोसेसरहरूको लागि समर्थन लागू गरिएको छ, र Mach-O ब्याकइन्डलाई एक अवस्थामा ल्याइएको छ जसले नियमित कार्यक्रमहरू लिङ्क गर्न अनुमति दिन्छ। LLD प्रयोग गरेर Glibc लाई लिङ्क गर्न आवश्यक सुधारहरू समावेश गरियो।
  • llvm-mca (मेसिन कोड विश्लेषक) उपयोगिताले ARM Cortex-A55 जस्ता निर्देशनहरू (इन-अर्डर सुपरस्केलर पाइपलाइन) कार्यान्वयन गर्ने प्रोसेसरहरूको लागि समर्थन थपेको छ।
  • AArch64 प्लेटफर्मको लागि LLDB डिबगरले Pointer Authentication, MTE (MemTag, मेमोरी ट्यागिङ एक्सटेन्सन) र SVE दर्ताहरूको लागि पूर्ण समर्थन प्रदान गर्दछ। प्रत्येक मेमोरी विनियोजन कार्यमा ट्यागहरू बाइन्ड गर्न र मेमोरी पहुँच गर्दा पोइन्टरको जाँच व्यवस्थित गर्न अनुमति दिने आदेशहरू थपियो, जुन सही ट्यागसँग सम्बन्धित हुनुपर्छ।
  • LLDB डिबगर र Fortran भाषाको लागि फ्रन्टएन्ड - Flang परियोजना द्वारा उत्पन्न बाइनरी सम्मेलनहरूमा थपिएको छ।

स्रोत: opennet.ru

एक टिप्पणी थप्न