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

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

LLVM 10.0 मा नयाँ सुविधाहरू C++ अवधारणाहरूको लागि समर्थन, अब छुट्टै प्रक्रियाको रूपमा क्ल्याङ चलाउँदैन, Windows को लागि CFG (कन्ट्रोल फ्लो गार्ड) जाँचहरूको लागि समर्थन, र नयाँ CPU क्षमताहरूको लागि समर्थन समावेश गर्दछ।

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

  • "का लागि समर्थन थपियोअवधारणा", अर्को मानकमा समावेश गरिने C++ टेम्प्लेट विस्तार, कोडनेम C++2a (-std=c++2a फ्ल्यागद्वारा खोलिएको)।
    अवधारणाहरूले तपाईंलाई टेम्प्लेट प्यारामिटर आवश्यकताहरूको सेट परिभाषित गर्न अनुमति दिन्छ जुन, कम्पाइल समयमा, टेम्प्लेट प्यारामिटरहरूको रूपमा स्वीकार गर्न सकिने तर्कहरूको सेटलाई सीमित गर्दछ। टेम्प्लेट भित्र प्रयोग गरिएका डाटा प्रकारका गुणहरू र इनपुट प्यारामिटरहरूको डाटा प्रकार गुणहरू बीच तार्किक असंगतिहरूबाट बच्न अवधारणाहरू प्रयोग गर्न सकिन्छ।

    टेम्प्लेट
    अवधारणा EqualityComparable = आवश्यक छ (T a, T b) {
    { a == b } -> std:: boolean;
    { 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] जस्ता परिस्थितिहरू समात्छ; …sizeof(arr) / sizeof(short)…” (“sizeof(arr) / sizeof(int)”” हुनुपर्छ।
    • "-Wxor-used-as-po" - कार्यहरूमा "^" (xor) अपरेटरको प्रयोग जस्ता निर्माणहरूको प्रयोगको बिरूद्ध चेतावनी दिन्छ जुन एक्सपोनेशन (2^16) सँग भ्रमित हुन सक्छ।
    • "-Wfinal-dtor-non-final-class" - "अन्तिम" निर्दिष्टकर्तासँग चिन्ह लगाइएको छैन तर "अन्तिम" विशेषता भएको विनाशक भएको वर्गहरूको बारेमा चेतावनी दिन्छ।
    • "-Wtautological-bitwise-compare" भनेको bitwise अपरेशन र कन्स्टेन्ट बीचको ट्युटोलजिकल तुलनाहरू निदान गर्न र सधैँ-सत्य तुलनाहरू पहिचान गर्नका लागि चेतावनीहरूको समूह हो जसमा bitwise OR अपरेशन गैर-नकारात्मक संख्यामा लागू हुन्छ।
    • सशर्त अपरेटर (?:) सँग तार्किक अपरेटरहरू AND (&) र OR (|) मिलाउँदा समस्याहरूको चेतावनी दिन्छ।
    • "-Wmisleading-Indentation" GCC बाट उही नामको चेकको एनालग हो, जसले इन्डेन्टेड अभिव्यक्तिहरूको बारेमा चेतावनी दिन्छ कि तिनीहरू if/else/for/while ब्लकको अंश हुन्, तर वास्तवमा तिनीहरू यस ब्लकमा समावेश छैनन्। ।
    • "-Wextra" निर्दिष्ट गर्दा, "-Wdeprecated-copy" चेक सक्षम गरिएको छ, निर्माणकर्ताहरूको प्रयोगको बारेमा चेतावनी
      स्पष्ट विनाशक परिभाषाको साथ कक्षाहरूमा "चाल्नुहोस्" र "प्रतिलिपि"।

    • "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" चेकहरू विस्तार गरिएको छ।
    • "-Wbitwise-op-Perentheses" र "-Wlogical-op-Perentheses" चेकहरू पूर्वनिर्धारित रूपमा असक्षम हुन्छन्।
  • 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" पूर्वनिर्धारित रूपमा भेक्टराइज्ड द मा। कोडले 512-bit zmm रेजिस्टरहरू प्रयोग गर्न बन्द गरेको छ, स्रोत कोडमा तिनीहरूको प्रत्यक्ष सङ्केत बाहेक। कारण यो हो कि CPU फ्रिक्वेन्सी घट्छ जब 512-बिट अपरेशनहरू प्रदर्शन गर्दछ, जसले समग्र प्रदर्शनलाई नकारात्मक रूपमा असर गर्न सक्छ। नयाँ व्यवहार परिवर्तन गर्न, विकल्प "-mprefer-vector-width=512" प्रदान गरिएको छ।
  • "-flax-vector-conversions" फ्ल्यागको व्यवहार GCC जस्तै छ: पूर्णांक र फ्लोटिंग-पोइन्ट भेक्टरहरू बीचको निहित भेक्टर बिट रूपान्तरणहरू निषेधित छन्। यो सीमा हटाउन, यो झण्डा प्रयोग गर्न प्रस्ताव गरिएको छ
    "-flax-vector-conversions=all" जुन पूर्वनिर्धारित हो।

  • Octeon परिवार को MIPS CPU को लागि सुधारिएको समर्थन। वैध CPU प्रकारहरूको सूचीमा "octeon+" थपियो।
  • WebAssembly मध्यवर्ती कोडमा जम्मा गर्दा, प्रणालीमा उपलब्ध भएमा, wasm-opt अप्टिमाइजर स्वचालित रूपमा बोलाइन्छ।
  • RISC-V आर्किटेक्चरमा आधारित प्रणालीहरूको लागि, फ्लोटिंग पोइन्ट मानहरू भण्डारण गर्ने रेजिस्टरहरूको प्रयोगलाई एसेम्बलर इनलाइन इन्सर्टहरूको सशर्त ब्लकहरूमा अनुमति दिइन्छ।
  • नयाँ कम्पाइलर फ्ल्यागहरू थपियो: "__GNUC__" र समान म्याक्रोहरूको लागि संस्करण मान सेट गर्न "-fgnuc-version"; "__FILE__" जस्ता म्याक्रोहरूमा नयाँसँग डाइरेक्टरी उपसर्ग OLD लाई प्रतिस्थापन गर्न "-fmacro-prefix-map=OLD=NEW"; "-fpatchable-function-entry=N[,M]" प्रकार्य प्रविष्टि बिन्दु अघि र पछि NOP निर्देशनहरूको निश्चित संख्या उत्पन्न गर्न। RISC-V को लागि
    "-ffixed-xX", "-mcmodel=medany" र "-mcmodel=medlow" फ्ल्यागहरूको लागि समर्थन थपियो।

  • '__विशेषता__((लक्ष्य("शाखा-संरक्षण=..."))) विशेषताको लागि समर्थन थपियो, जसको प्रभाव विकल्पसँग मिल्दोजुल्दो छ - शाखा संरक्षण.
  • Windows प्लेटफर्ममा, "-cfguard" फ्ल्याग निर्दिष्ट गर्दा, अप्रत्यक्ष प्रकार्य कलहरूको लागि कार्यान्वयन प्रवाह अखण्डता जाँच (कन्ट्रोल फ्लो गार्ड) को प्रतिस्थापन लागू हुन्छ। चेक प्रतिस्थापन असक्षम गर्न को लागी, तपाईले "-cfguard-nochecks" झण्डा वा "__declspec(guard(nocf))" परिमार्जक प्रयोग गर्न सक्नुहुन्छ।
  • gnu_inline विशेषताको व्यवहार GCC जस्तै हुन्छ जहाँ यो "बाह्य" कुञ्जी शब्द बिना प्रयोग गरिन्छ।
  • OpenCL र CUDA समर्थनसँग सम्बन्धित क्षमताहरू विस्तार गरिएको छ। नयाँ OpenMP 5.0 सुविधाहरूको लागि समर्थन थपियो।
  • क्ल्याङ-ढाँचा उपयोगितामा मानक विकल्प थपिएको छ, जसले तपाईंलाई कोड पार्सिङ र ढाँचा गर्दा प्रयोग हुने C++ मानकको संस्करण निर्धारण गर्न अनुमति दिन्छ (पछिल्लो, Auto, c++03, c++11, c++14, c++17, c++20)।
  • स्थिर विश्लेषकमा नयाँ जाँचहरू थपिएका छन्: alpha.cplusplus.PlacementNew पर्याप्त भण्डारण ठाउँ छ कि छैन भनेर निर्धारण गर्न, fuchsia.HandleChecker Fuchsia ह्यान्डलरहरूसँग सम्बन्धित चुहावट पत्ता लगाउनको लागि, security.insecureAPI.decodeValueOfObjCType सम्भावित बफर ओभरफ्लोको प्रयोग गर्दा पत्ता लगाउनको लागि। :at:]।
  • अपरिभाषित व्यवहार सेनिटाइजर (UBSan) ले NULL पोइन्टर्समा गैर-शून्य अफसेटहरू वा NULL सूचक अफसेटको परिणामस्वरूप थपिएको अनुप्रयोगलाई समात्न यसको सूचक ओभरफ्लो जाँचहरू विस्तार गरेको छ।
  • लिन्टरमा झनझन सफा थपियो नयाँ चेक को एक ठूलो भाग।

मुख्य नवाचारहरू LLVM 10.0:

  • फ्रेमवर्कमा विशेषताकर्ता नयाँ अन्तरक्रियात्मक अप्टिमाइजेसन र विश्लेषकहरू थपिएका छन्। 19 विशेषताहरू 12 LLVM IR र 12 अमूर्त विशेषताहरू जस्तै जीवन्तता सहित 7 विभिन्न विशेषताहरूको अवस्था भविष्यवाणी गरिएको छ।
  • कम्पाइलरमा निर्मित नयाँ म्याट्रिक्स गणितीय प्रकार्यहरू थपियो (आन्तरिक कुरा), जसलाई संकलनको क्रममा कुशल भेक्टर निर्देशनहरूद्वारा प्रतिस्थापित गरिन्छ।
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU र PowerPC आर्किटेक्चरहरूको लागि ब्याकएन्डहरूमा धेरै सुधारहरू गरिएका छन्। CPU समर्थन थपियो
    Cortex-A65, Cortex-A65AE, Neoverse E1 र Neoverse N1। ARMv8.1-M को लागि, कोड उत्पादन प्रक्रियालाई अनुकूलित गरिएको छ (उदाहरणका लागि, न्यूनतम ओभरहेडको साथ लूपहरूको लागि समर्थन देखा परेको छ) र MVE विस्तार प्रयोग गरेर autovectorization को लागि समर्थन थपिएको छ। सुधारिएको CPU MIPS Octeon समर्थन। PowerPC को लागि, MASSV (गणितीय एक्सेलेरेशन सबसिस्टम) लाइब्रेरी प्रयोग गरेर गणितीय सबरुटिनहरूको भेक्टराइजेशन सक्षम गरिएको छ, कोड उत्पादन सुधार गरिएको छ, र लूपहरूबाट मेमोरी पहुँच अनुकूलित गरिएको छ। x86 को लागि, v2i32, v4i16, v2i16, v8i8, v4i8 र v2i8 भेक्टर प्रकारहरूको ह्यान्डलिंग परिवर्तन गरिएको छ।

  • WebAssembly को लागि सुधारिएको कोड जनरेटर। TLS (थ्रेड-स्थानीय भण्डारण) र atomic.fence निर्देशनहरूको लागि समर्थन थपियो। SIMD समर्थन उल्लेखनीय रूपमा विस्तार गरिएको छ। WebAssembly वस्तु फाइलहरू अब बहु-मूल्य समारोह हस्ताक्षरहरू प्रयोग गर्ने क्षमता छ।
  • लूपहरू प्रशोधन गर्दा विश्लेषक प्रयोग गरिन्छ मेमोरीSSA, जसले तपाईंलाई विभिन्न मेमोरी अपरेशनहरू बीच निर्भरताहरू परिभाषित गर्न अनुमति दिन्छ। MemorySSA ले संकलन र कार्यान्वयन समय घटाउन सक्छ वा प्रदर्शनको हानि बिना AliasSetTracker को सट्टा प्रयोग गर्न सकिन्छ।
  • LLDB डिबगरले DWARF v5 ढाँचाको लागि समर्थनलाई उल्लेखनीय रूपमा सुधार गरेको छ। MinGW को साथ निर्माणको लागि सुधारिएको समर्थन
    र ARM र ARM64 आर्किटेक्चरहरूको लागि विन्डोज कार्यान्वयनयोग्यहरू डिबग गर्न प्रारम्भिक क्षमता थपियो। ट्याब थिचेर इनपुट स्वत: पूरा गर्दा प्रस्ताव गरिएका विकल्पहरूको विवरणहरू थपियो।

  • विस्तार गरियो LLD लिङ्कर क्षमताहरू। ELF ढाँचाको लागि सुधारिएको समर्थन, GNU लिङ्करसँग ग्लोब टेम्प्लेटहरूको पूर्ण अनुकूलता सुनिश्चित गर्ने, संकुचित डिबग खण्डहरू ".zdebug" को लागि समर्थन थप्दै, .note.gnu.property खण्ड परिभाषित गर्न PT_GNU_PROPERTY गुण थप्दै (भविष्यमा प्रयोग गर्न सकिन्छ। लिनक्स कर्नेल),
    "-z noseparate-code", "-z पृथक-कोड" र "-z अलग-लोडयोग्य-खण्डहरू" मोडहरू लागू गरिएको छ। MinGW र WebAssembly को लागि सुधारिएको समर्थन।

स्रोत: opennet.ru

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