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

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

Clang 15.0 मा प्रमुख सुधारहरू:

  • x86 आर्किटेक्चरमा आधारित प्रणालीहरूका लागि, "-fzero-call-used-regs" झण्डा थपिएको छ, जसले समारोहमा प्रयोग गरिएका सबै CPU रेजिस्टरहरू प्रकार्यबाट नियन्त्रण फर्काउनु अघि शून्यमा रिसेट गरिएको सुनिश्चित गर्दछ। यो विकल्पले तपाईंलाई कार्यहरूबाट सूचना चुहावटबाट जोगाउन र शोषणमा ROP (रिटर्न-ओरिएंटेड प्रोग्रामिङ) ग्याजेटहरू निर्माण गर्नका लागि उपयुक्त ब्लकहरूको संख्या लगभग २०% घटाउन अनुमति दिन्छ।
  • C कोडका लागि संरचनाहरूको मेमोरी प्लेसमेन्टको अनियमितता लागू गरिएको छ, जसले कमजोरीहरूको शोषणको घटनामा संरचनाहरूबाट डाटाको निकासीलाई जटिल बनाउँछ। randomize_layout र no_randomize_layout विशेषताहरू प्रयोग गरेर अनियमिततालाई सक्रिय र बन्द गरिएको छ, र "-frandomize-layout-seed" वा "-frandomize-layout-seed-file" फ्ल्याग प्रयोग गरेर बीज सेट गर्न आवश्यक छ।
  • "-fstrict-flex-arrays=" झण्डा थपियो, जुन संरचनाहरूमा लचिलो एरे तत्वका लागि सीमाहरू नियन्त्रण गर्न प्रयोग गर्न सकिन्छ (लचिलो एरे सदस्यहरू, संरचनाको अन्त्यमा अनिश्चित आकारको एरे)। ० (पूर्वनिर्धारित) मा सेट गर्दा, एरेको साथ संरचनाको अन्तिम तत्व सधैं लचिलो एरेको रूपमा प्रशोधन गरिन्छ, १ - केवल आकारहरू [], [०] र [१] लचिलो एरेको रूपमा प्रशोधन गरिन्छ, २ - मात्र आकारहरू [] र [०] लाई लचिलो एरे जस्तै प्रशोधन गरिन्छ।
  • सी-जस्तो भाषा HLSL (उच्च-स्तर शेडर भाषा) को लागि प्रयोगात्मक समर्थन थपियो, शेडरहरू लेख्नको लागि DirectX मा प्रयोग गरियो।
  • निश्चित- र चर-लम्बाइ एरेहरूसँग सम्बन्धित असंगत तर्क घोषणाहरूसँग ओभरराइडिङ प्रकार्यहरू बारे चेतावनी दिन "-Warray-प्यारामिटर" थपियो।
  • MSVC संग सुधारिएको अनुकूलता। MSVC मा प्रदान गरिएको "#pragma प्रकार्य" (इनलाइन विस्तारको सट्टा प्रकार्य कल उत्पन्न गर्न कम्पाइलरलाई निर्देशन दिन्छ) र "#pragma alloc_text" (फंक्शन कोडको साथ खण्डको नाम परिभाषित गर्दछ) को लागि समर्थन थपियो। MSVC-compatible /JMC र /JMC फ्ल्यागहरूको लागि समर्थन थपियो।
  • भविष्यको C2X र C++ 23 मापदण्डहरूलाई समर्थन गर्न काम जारी छ। C भाषाको लागि, निम्न लागू गरिएको छ: noreturn विशेषता, कुञ्जी शब्दहरू गलत र सत्य, दिइएको बिट गहिराइको पूर्णांकहरूको लागि _BitInt(N) प्रकार, *_WIDTH म्याक्रो, UTF-8 एन्कोड गरिएका क्यारेक्टरहरूको लागि u8 उपसर्ग।

    C++ को लागि, निम्न लागू गरिएको छ: मोड्युल मर्ज, प्रकार्य सदस्यहरूको ABI अलगाव, मोड्युलहरूमा गैर-स्थानीय चरहरूको गतिशील प्रारम्भिक आदेश, बहुआयामिक अनुक्रमणिका अपरेटरहरू, अटो(x), गैर-शाब्दिक चरहरू, गोटो र लेबलहरू constexpr रूपमा घोषित कार्यहरूमा। , छुट्ने अनुक्रमहरू, नाम दिइएको एस्केप क्यारेक्टरहरू।

  • OpenCL र OpenMP समर्थनसँग सम्बन्धित क्षमताहरू विस्तार गरिएको छ। OpenCL विस्तार cl_khr_subgroup_rotate को लागि समर्थन थपियो।
  • x86 आर्किटेक्चरको लागि, बिना शर्त फर्वार्ड जम्प अपरेशनहरू पछि निर्देशनहरूको सट्टा कार्यान्वयनको कारणले गर्दा प्रोसेसरहरूमा कमजोरीहरू विरुद्ध सुरक्षा थपिएको छ। मेमोरीमा शाखा निर्देशन (SLS, Straight Line Speculation) पछि तुरुन्तै निर्देशनहरूको प्रि-एम्प्टिभ प्रोसेसिङको कारणले समस्या उत्पन्न हुन्छ। सुरक्षा सक्षम गर्न, विकल्प "-mharden-sls=[none|all|return|indirect-jmp]" प्रस्ताव गरिएको छ।
  • SSE2 विस्तारलाई समर्थन गर्ने प्लेटफर्महरूका लागि, _Float16 प्रकार थपिएको छ, जुन AVX512-FP16 निर्देशनहरूको लागि समर्थन नभएको अवस्थामा फ्लोट प्रकार प्रयोग गरेर अनुकरण गरिएको छ।
  • "-m[no-]rdpru" फ्ल्याग थपियो RDPRU निर्देशनको प्रयोग नियन्त्रण गर्न, AMD Zen2 प्रोसेसरहरूबाट सुरु गर्न समर्थित।
  • RETBLEED जोखिमबाट जोगाउन "-mfunction-return=thunk-extern" झण्डा थपियो, जसले अप्रत्यक्ष शाखाहरूको लागि सट्टा कार्यान्वयन संयन्त्रको संलग्नतालाई समावेश नगर्ने निर्देशनहरूको अनुक्रम थपेर काम गर्दछ।

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

  • Cortex-M85 CPU, Armv9-A, Armv9.1-A र Armv9.2-A आर्किटेक्चर, Armv8.1-M PACBTI-M विस्तारहरूको लागि समर्थन थपियो।
  • DirectX का लागि प्रयोगात्मक ब्याकइन्ड थपिएको छ जसले DirectX shaders को लागि प्रयोग गरिएको DXIL (DirectX Intermediate Language) ढाँचालाई समर्थन गर्दछ। ब्याकइन्डलाई एसेम्बलीको समयमा "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" प्यारामिटर निर्दिष्ट गरेर सक्षम पारिएको छ।
  • Libc++ ले C++20 र C++2b मापदण्डका नयाँ सुविधाहरू लागू गर्न जारी राख्छ, जसमा “ढाँचा” पुस्तकालयको कार्यान्वयन र “दायराहरू” पुस्तकालयको प्रस्तावित प्रयोगात्मक संस्करण समावेश छ।
  • x86, PowerPC र RISC-V आर्किटेक्चरहरूको लागि सुधारिएको ब्याकएन्डहरू।
  • LLD लिङ्कर र LLDB डिबगरको क्षमताहरू बढाइएको छ।

स्रोत: opennet.ru

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