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

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

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

  • C++20 मानकमा प्रस्तावित "सम्भाव्यता" र "असम्भव" विशेषताहरूको लागि समर्थन पूर्वनिर्धारित रूपमा लागू गरिएको छ र सक्षम गरिएको छ, अनुकूलकलाई सशर्त निर्माण ट्रिगर हुने सम्भावनाको बारेमा सूचित गर्न अनुमति दिँदै (उदाहरणका लागि, "[[सम्भावना ]] यदि (अनियमित > ०) {“)।
  • AMD Zen 3 (-march=znver3), Intel Alder Lake (-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 आर्किटेक्चरको लागि, नयाँ कम्पाइलर फ्ल्यागहरू "-moutline-atomics" र "-mno-outline-atomics" लाई "__aarch64_cas8_relax" जस्ता परमाणु अपरेशन सहायक कार्यहरू सक्षम वा असक्षम गर्न थपिएको छ। त्यस्ता प्रकार्यहरूले LSE (ठूलो प्रणाली विस्तारहरू) समर्थन उपलब्ध छ कि छैन भनेर रनटाइममा पत्ता लगाउँदछ र प्रदान गरिएको परमाणु प्रोसेसर निर्देशनहरू प्रयोग गर्दछ वा सिङ्क्रोनाइजेसनको लागि LL/SC (लोड-लिङ्क/स्टोर-सशर्त) निर्देशनहरू प्रयोग गर्न फिर्ता हुन्छ।
  • पुरानो लिङ्कर र एसेम्बलर व्यवहारसँग अनुकूलताको लागि binutils सूटको लक्षित संस्करण चयन गर्न "-fbinutils-version" विकल्प थपियो।
  • ELF कार्यान्वयनयोग्य फाइलहरूको लागि, जब "-gz" झण्डा निर्दिष्ट गरिएको छ, zlib लाइब्रेरी प्रयोग गरेर डिबगिङ जानकारीको सङ्कुचन पूर्वनिर्धारित रूपमा सक्षम हुन्छ (gz=zlib)। परिणामस्वरूप वस्तु फाइलहरू लिङ्क गर्न lld वा GNU binutils 2.26+ आवश्यक छ। binutils को पुरानो संस्करण संग अनुकूलता पुनर्स्थापित गर्न को लागी, तपाइँ "-gz=zlib-gnu" निर्दिष्ट गर्न सक्नुहुन्छ।
  • 'यो' सूचक अब nonnull र dereferenceable (N) जाँचहरूसँग प्रशोधन गरिएको छ। तपाईंले NULL मानहरू प्रयोग गर्न आवश्यक हुँदा nonnull विशेषता हटाउनको लागि, तपाईंले "-fdelete-null-pointer-checks" विकल्प प्रयोग गर्न सक्नुहुन्छ।
  • लिनक्स प्लेटफर्ममा, "-fasynchronous-unwind-tables" मोडलाई AArch64 र PowerPC आर्किटेक्चरहरूका लागि अनवाइन्ड कल टेबलहरू उत्पन्न गर्न सक्षम गरिएको छ, जस्तै GCC मा।
  • "#pragma clang loop vectorize_width" मा भेक्टराइजेशन विधि चयन गर्न "फिक्स्ड" (डिफल्ट) र "स्केलेबल" विकल्पहरू निर्दिष्ट गर्ने क्षमता थपियो। "स्केलेबल" मोड, भेक्टर लम्बाइबाट स्वतन्त्र, प्रयोगात्मक छ र स्केलेबल भेक्टोराइजेशनलाई समर्थन गर्ने हार्डवेयरमा प्रयोग गर्न सकिन्छ।
  • विन्डोज प्लेटफर्मको लागि सुधारिएको समर्थन: आर्म 64 प्रणालीहरूमा विन्डोजका लागि आधिकारिक बाइनरी एसेम्बलीहरू तयार गरिएको छ, जसमा क्ल्यांग कम्पाइलर, एलएलडी लिङ्कर र कम्पाइलर-आरटी रनटाइम पुस्तकालयहरू समावेश छन्। 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, __bit_scan_reverse, __bit_bscan_reverse, __bsfq, __bit_scan_reverse, bbs wap64, अनुमति छ। __bswapq , _castf*, __rol* र __ror*।
  • पहिचानकर्ताहरू, स्तम्भहरू, र क्षेत्र परिभाषाहरू वरिपरि स्पेसिङ चयन गर्न क्ल्याङ्-ढाँचा उपयोगितामा BitFieldColonSpacing विकल्प थपियो।
  • लिनक्स प्लेटफर्ममा रहेको clangd क्यासिङ सर्भर (Clang Server) ले लामो-समय सञ्चालनको क्रममा मेमोरी खपतलाई उल्लेखनीय रूपमा घटाएको छ (malloc_trim लाई आवधिक कलहरू अपरेटिङ सिस्टममा नि:शुल्क मेमोरी पृष्ठहरू फर्काउन प्रदान गरिन्छ)।

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

  • पाइथनमा लेखिएको llvm-build निर्माण उपकरणको लागि समर्थन बन्द गरिएको छ, र यसको सट्टा परियोजनाले CMake निर्माण प्रणाली प्रयोग गर्न पूर्ण रूपमा स्विच गरेको छ।
  • AArch64 आर्किटेक्चरको लागि ब्याकइन्डमा, विन्डोज प्लेटफर्मको लागि समर्थन सुधार गरिएको छ: लक्षित विन्डोज प्रणालीहरूको लागि एसेम्बलर आउटपुटको सही उत्पादन सुनिश्चित गरिएको छ, अनवाइन्ड कलहरूमा डाटाको उत्पादनलाई अनुकूलित गरिएको छ (यस्तो डाटाको आकार 60 ले घटाइएको छ। %), एसेम्बलर प्रयोग गरेर अनवाइन्ड डाटा सिर्जना गर्ने क्षमता निर्देशनहरू थपिएको छ .seh_*।
  • PowerPC आर्किटेक्चरको लागि ब्याकइन्डले लुप्स र इनलाइन डिप्लोइमेन्टका लागि नयाँ अप्टिमाइजेसनहरू, Power10 प्रोसेसरहरूको लागि विस्तारित समर्थन, म्याट्रिक्स हेरफेरको लागि MMA निर्देशनहरूको लागि थप समर्थन, र AIX अपरेटिङ सिस्टमको लागि सुधारिएको समर्थन सुविधा दिन्छ।
  • x86 ब्याकइन्डले AMD Zen 3, Intel Alder Lake र Intel Sapphire Rapids प्रोसेसरहरू, साथै HRESET, UINTR र AVXVNNI प्रोसेसर निर्देशनहरूको लागि समर्थन थप्छ। मेमोरी सीमाहरू अब समर्थित छैन भनेर सुनिश्चित गर्नका लागि संकेतकहरू जाँच गर्न MPX (मेमोरी सुरक्षा विस्तारहरू) को लागि समर्थन (यो प्रविधि व्यापक छैन र GCC र clang बाट पहिले नै हटाइएको छ)। अपरेन्ड अफसेट र जम्पको साइज नियन्त्रण गर्न {disp32} र {disp8} उपसर्गहरू र .d32 र .d8 प्रत्ययहरूका लागि एसेम्बलरमा समर्थन थपियो। माइक्रोआर्किटेक्चरल अप्टिमाइजेसनको समावेशलाई नियन्त्रण गर्न नयाँ विशेषता "ट्यून-सीपीयू" थपियो।
  • एक नयाँ मोड "-fsanitize=unsigned-shift-base" integer problem detector (integer sanitizer, "-fsanitize=integer") मा अलि बायाँ तिर सिफ्ट गरेपछि अहस्ताक्षरित पूर्णांकहरूको ओभरफ्लो पत्ता लगाउन थपिएको छ।
  • विभिन्न डिटेक्टरहरूमा (asan, cfi, lsan, msan, tsan, ubsan sanitizer) मानक Musl पुस्तकालयको साथ लिनक्स वितरणको लागि समर्थन थपिएको छ।
  • LLD लिङ्करको क्षमताहरू विस्तार गरिएको छ। ELF ढाँचाका लागि सुधारिएको समर्थन, थपिएका विकल्पहरू "--निर्भरता-फाइल", "-त्रुटि-ह्यान्डलिङ-स्क्रिप्ट", "-lto-pseudo-probe-for-profiling", "-no-lto-पूरा-कार्यक्रम" सहित। -दृश्यता "" सुधारिएको MinGW समर्थन। Mach-O ढाँचा (macOS) को लागि, arm64, arm, र i386 आर्किटेक्चरहरूको लागि समर्थन, लिङ्क-टाइम अप्टिमाइजेसनहरू (LTO), र अपवाद ह्यान्डलिङका लागि स्ट्याक अनवाइन्डिङ लागू गरिएको छ।
  • Libc++ ले C++20 मानकका नयाँ सुविधाहरू लागू गर्दछ र C++2b विशिष्टताका सुविधाहरूको विकास सुरु गरेको छ। स्थानीयकरण समर्थन ("-DLIBCXX_ENABLE_LOCALIZATION=OFF") र स्यूडो-अनियमित नम्बरहरू ("-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF") उत्पन्न गर्नका लागि उपकरणहरू असक्षम गर्ने निर्माणको लागि समर्थन थपियो।

स्रोत: opennet.ru

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