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

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

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

  • पूर्वनिर्धारित C++/ObjC++ मानक हो gnu++17 (पहिले gnu++14), जसको मतलब C++17 सुविधाहरू GNU विस्तारहरूसँग पूर्वनिर्धारित रूपमा समर्थित छन्। अघिल्लो व्यवहार फर्काउन, तपाइँ "-std=gnu++14" विकल्प प्रयोग गर्न सक्नुहुन्छ।
  • C++20 मानकसँग सम्बन्धित उन्नत सुविधाहरू लागू गरियो:
    • सशर्त तुच्छ विशेष सदस्य कार्यहरू,
    • Lambda प्रकार्यहरूमा संरचित बाइन्डिङहरू क्याप्चर गर्दै,
    • अभिव्यक्ति भित्र समानता अपरेटर,
    • केहि सन्दर्भहरूमा टाइपनेम कुञ्जी शब्द छोड्ने विकल्प,
    • कोष्ठकमा मान्य समग्र प्रारम्भिकरण ("Aggr(val1, val2)")।
  • भविष्यमा परिभाषित सुविधाहरू C++2b मानक लागू गरिएको छ:
    • यसलाई यौगिक अभिव्यक्तिको अन्त्यमा लेबलहरू राख्न अनुमति दिइएको छ,
    • स्थिर अपरेटर (),
    • स्थिर अपरेटर [],
    • char8_t प्रकार संग अनुकूलता सुनिश्चित गरिएको छ,
    • "\N{...}" मा प्रयोगको लागि अनुमति दिइएको वर्णहरूको दायरा विस्तार गरिएको छ
    • constexpr को रूपमा घोषित प्रकार्यहरूमा "static constexpr" को रूपमा घोषित चरहरू प्रयोग गर्ने क्षमता थपियो।
  • भविष्यको C-Standard C2x मा परिभाषित सुविधाहरू लागू गरिएको छ:
    • "-Wunused-label" चेतावनीलाई असक्षम पार्नको लागि, "[[सायद_unused]]" विशेषतालाई लेबलहरूमा लागू गर्न अनुमति दिइएको छ।
    • यसलाई यौगिक अभिव्यक्ति भित्र कहीं पनि लेबलहरू राख्न अनुमति छ,
    • typeof र typeof_unqual अपरेटरहरू थपियो,
    • एउटा नयाँ प्रकार nullptr_t र nullptr स्थिर कुनै पनि सूचक प्रकारमा रूपान्तरण गर्न सक्ने नल पोइन्टरहरू परिभाषित गर्न र पूर्णांक र शून्य* प्रकारहरूमा बाध्य नभएको NULL को भिन्नता प्रतिनिधित्व गर्दछ।
    • C2x मोडमा, va_start म्याक्रोलाई आर्गुमेन्टहरूको चर संख्या (variadic) कल गर्न अनुमति दिइन्छ।
  • C99, C11, र C17 अनुपालन मोडहरूमा, पूर्वनिर्धारित विकल्पहरू "-Wimplicit-function-declaration" र "-Wimplicit-int" ले अब चेतावनीको सट्टा त्रुटि उत्पन्न गर्दछ।
  • C++ मोडमा "void *" (जस्तै "void func(void *p) { *p; }") को अप्रत्यक्ष प्रयोगले अब ISO C++, GCC, ICC र MSVC जस्तै त्रुटि उत्पन्न गर्छ।
  • माइक्रोसफ्ट-शैली इनलाइन असेंबली ब्लकहरूमा निर्देशन अपरेन्डहरू (जस्तै "__asm ​​{ mov eax, s.bf }") को रूपमा बिटफिल्डहरू निर्दिष्ट गर्दा अब त्रुटि उत्पन्न हुन्छ।
  • विभिन्न मोड्युलहरूमा एउटै नामका विभिन्न संरचना र संघहरूको उपस्थितिको लागि निदान थपियो।
  • OpenCL र OpenMP समर्थनसँग सम्बन्धित क्षमताहरू विस्तार गरिएको छ। OpenCL कर्नेल तर्कहरूमा प्रयोग गरिएका C++ टेम्प्लेटहरूको लागि सुधारिएको निदान। AMDGPU का लागि सुधारिएको लाइनिङ ब्लक समर्थन। nounwind विशेषता सबै प्रकार्यहरूमा स्पष्ट रूपमा थपिएको छ। बिल्ट-इन प्रकार्यहरूको लागि सुधारिएको समर्थन।
  • CLANG_CRASH_DIAGNOSTICS_DIR वातावरण चर प्रयोग गर्ने क्षमतालाई डाइरेक्टरी परिभाषित गर्न थपियो जसमा क्र्यास डायग्नोस्टिक डेटा बचत हुन्छ।
  • युनिकोड समर्थन युनिकोड 15.0 विशिष्टतामा अद्यावधिक गरिएको छ। केही गणितीय प्रतीकहरूलाई पहिचानकर्ताहरूमा अनुमति दिइएको छ, जस्तै "₊" (जस्तै "डबल xₖ₊₁")।
  • धेरै कन्फिगरेसन फाइलहरू लोड गर्नका लागि समर्थन थपियो (पूर्वनिर्धारित कन्फिगरेसन फाइलहरू पहिले लोड हुन्छन्, र त्यसपछि "--config=" फ्ल्याग मार्फत निर्दिष्ट गरिएका, जुन अब धेरै पटक निर्दिष्ट गर्न सकिन्छ)। कन्फिगरेसन फाइलहरूको पूर्वनिर्धारित लोडिङ अर्डर परिवर्तन गरियो: क्ल्याङले पहिले फाइल लोड गर्न प्रयास गर्छ - .cfg, र यदि यो फेला परेन भने यसले दुई फाइलहरू लोड गर्ने प्रयास गर्दछ cfg र .cfg। पूर्वनिर्धारित रूपमा कन्फिगरेसन फाइलहरू लोड गर्न असक्षम गर्न, "--no-default-config" फ्ल्याग थपिएको छ।
  • दोहोर्याउन मिल्ने बिल्डहरू सुनिश्चित गर्न, SOURCE_DATE_EPOCH वातावरण चरमा निर्दिष्ट गरिएको समयसँग __DATE__, __TIME__ र __TIMESTAMP__ म्याक्रोहरूमा हालको मिति र समय मानहरू प्रतिस्थापन गर्न सम्भव छ।
  • स्थिरहरूको सन्दर्भमा प्रयोग गर्न सकिने बिल्ट-इन प्रकार्यहरू (बिल्टिन) को उपस्थिति जाँच गर्न, म्याक्रो "__has_constexpr_builtin" थपिएको छ।
  • पङ्क्तिबद्ध coroutine फ्रेम विनियोजनको लागि नयाँ संकलन झण्डा "-fcoro-aligned-allocation" थपियो।
  • "-fstrict-flex-arrays=" फ्ल्यागले संरचनाहरूमा लचिलो एरे तत्वहरूको प्रमाणीकरणको तेस्रो स्तरको लागि समर्थन लागू गर्दछ (लचिलो एरे सदस्यहरू, संरचनाको अन्त्यमा अनिश्चित आकारको एरे)। तेस्रो तहमा, केवल साइज "[]" (उदाहरणका लागि, "int b[]") लाई लचिलो एरे मानिन्छ, तर साइज "[0]" (उदाहरणका लागि, "int b[0]") छैन।
  • मानक C++ मोड्युलहरूको लागि एकल-चरण संकलन मोडेल सक्षम गर्न "-fmodule-output" झण्डा थपियो।
  • स्ट्याक फ्रेम लेआउटमा समस्याहरूको निदान गर्न मद्दत गर्न "-Rpass-analysis=stack-frame-layout" मोड थपियो।
  • AArch1 द्वारा प्रदान गरिएका सुविधाहरूको विशिष्ट संस्करणहरू चयन गर्न नयाँ विशेषता __attribute__((target_version("cpu_features"))) थपियो र विशेषता __attribute__((target_clones("cpu_features2","cpu_features64",...))) को कार्यक्षमता विस्तार गरियो। CPUs।
  • डायग्नोस्टिक उपकरणहरू विस्तारित:
    • चेतावनी "-Wsingle-bit-bitfield-constant-conversion" लाई एकल-बिट हस्ताक्षरित बिटफिल्डमा असाइन गर्दा निहित ट्रंकेशन पत्ता लगाउन थपियो।
    • अप्रारम्भिक constexpr चरहरूको निदान विस्तार गरिएको छ।
    • प्रकार्य प्रकार कास्टिङसँग सम्भावित समस्याहरू पहिचान गर्न "-Wcast-function-type-strict" र "-Wincompatible-function-pointer-types-strict" चेतावनीहरू थपियो।
    • निर्यात ब्लकहरूमा गलत वा आरक्षित मोड्युल नामहरू प्रयोग गर्नका लागि निदान थपियो।
    • परिभाषाहरूमा हराइरहेको "स्वत:" कुञ्जी शब्दहरूको सुधारिएको पहिचान।
    • "-Winteger-overflow" चेतावनीको कार्यान्वयनले अतिप्रवाह निम्त्याउने अतिरिक्त परिस्थितिहरूको लागि जाँचहरू थपेको छ।
  • LoongArch निर्देशन सेट आर्किटेक्चर (-march=loongarch64 वा -march=la464) को लागि समर्थन, Loongson 3 5000 प्रोसेसरहरूमा प्रयोग गरिएको र MIPS र RISC-V जस्तै नयाँ RISC ISA कार्यान्वयन गर्ने, कार्यान्वयन गरिएको छ।

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

  • LLVM कोडलाई C++17 मानकमा परिभाषित तत्वहरू प्रयोग गर्न अनुमति दिइएको छ।
  • LLVM निर्माणको लागि वातावरण आवश्यकताहरू बढाइएको छ। निर्माण उपकरणहरूले अब C++17 मानकलाई समर्थन गर्नुपर्छ, अर्थात्। निर्माण गर्न, तपाईंलाई कम्तिमा GCC 7.1, Clang 5.0, Apple Clang 10.0 वा Visual Studio 2019 16.7 आवश्यक छ।
  • AArch64 आर्किटेक्चरको लागि ब्याकइन्डले Cortex-A715, Cortex-X3 र Neoverse V2 CPUs को लागि समर्थन थप्छ, RME MEC (मेमोरी इन्क्रिप्सन सन्दर्भहरू), Armv8.3 विस्तारहरू (जटिल संख्या) र प्रकार्य बहु संस्करणको लागि एसेम्बलर।
  • ARM आर्किटेक्चरको लागि ब्याकइन्डमा, Armv2, Armv2A, Armv3 र Armv3M लक्ष्य प्लेटफर्महरूको लागि समर्थन बन्द गरिएको छ, जसको लागि सही कोडको उत्पादनको ग्यारेन्टी थिएन। जटिल संख्याहरूसँग काम गर्ने निर्देशनहरूको लागि कोड उत्पन्न गर्ने क्षमता थपियो।
  • X86 आर्किटेक्चरको ब्याकइन्डले निर्देशन सेट आर्किटेक्चर (ISAs) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT को लागि समर्थन थपेको छ। RDMSRLIST, RMSRLIST र WRMSRNS निर्देशनहरूको लागि समर्थन थपियो। लागू गरिएका विकल्पहरू "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" र "-mcpu=grandridge"।
  • LoongArch प्लेटफर्मको लागि आधिकारिक समर्थन थपियो।
  • MIPS, PowerPC र RISC-V आर्किटेक्चरहरूको लागि सुधारिएको ब्याकएन्डहरू
  • LLDB डिबगरमा LoongArch आर्किटेक्चरको लागि 64-बिट कार्यान्वयन योग्यहरू डिबग गर्न समर्थन थपियो। COFF डिबग प्रतीकहरूको सुधारिएको ह्यान्डलिंग। लोड गरिएका विन्डोज मोड्युलहरूको सूचीमा डुप्लिकेट DLL को फिल्टरिङ प्रदान गरियो।
  • Libc++ पुस्तकालयमा, मुख्य काम C++20 र C++23 मापदण्डका नयाँ सुविधाहरूको लागि समर्थन कार्यान्वयनमा केन्द्रित थियो।
  • LDD लिङ्करले ठेगाना रिलोकेशन स्क्यानिङ र खण्ड प्रारम्भिक कार्यहरू समानान्तर गरेर लिङ्किङ समयलाई महत्त्वपूर्ण रूपमा घटाउँछ। ZSTD एल्गोरिथ्म प्रयोग गरेर सेक्सन कम्प्रेसनको लागि समर्थन थपियो।

स्रोत: opennet.ru

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