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

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

LLVM 9.0 का नयाँ सुविधाहरू लक्षित RISC-V प्लेटफर्मबाट प्रयोगात्मक डिजाइन ट्याग हटाउने, OpenCL को लागि C++ समर्थन, LLD मा गतिशील रूपमा लोड गरिएका भागहरूमा कार्यक्रम विभाजन गर्ने क्षमता, र "asm गयो", लिनक्स कर्नेल कोडमा प्रयोग गरियो। libc++ ले WASI (WebAssembly System Interface) को लागि समर्थन थप्यो, र LLD ले WebAssembly गतिशील लिङ्किङका लागि प्रारम्भिक समर्थन थप्यो।

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

  • थपियो GCC-विशेष अभिव्यक्तिको कार्यान्वयन "asm गयो", जसले तपाईंलाई एसेम्बलर इनलाइन ब्लकबाट C कोडको लेबलमा सार्न अनुमति दिन्छ। यो सुविधा x86_64 आर्किटेक्चरको साथ प्रणालीहरूमा क्ल्याङ प्रयोग गरेर "CONFIG_JUMP_LABEL=y" मोडमा लिनक्स कर्नेल निर्माण गर्न आवश्यक छ। अघिल्लो विमोचनहरूमा थपिएका परिवर्तनहरूलाई ध्यानमा राख्दै, लिनक्स कर्नेल अब x86_64 आर्किटेक्चरको लागि Clang मा निर्माण गर्न सकिन्छ (पहिले मात्र हात, aarch64, ppc32, ppc64le र mips आर्किटेक्चरहरूका लागि निर्माण समर्थित थियो)। यसबाहेक, एन्ड्रोइड र क्रोमओएस परियोजनाहरू पहिले नै कर्नेल निर्माणको लागि क्ल्यांग प्रयोग गर्न रूपान्तरण गरिएको छ, र गुगलले यसको उत्पादन लिनक्स प्रणालीहरूको लागि कर्नेलहरू निर्माण गर्नको लागि मुख्य प्लेटफर्मको रूपमा क्ल्यांगको परीक्षण गरिरहेको छ। भविष्यमा, LLD, llvm-objcopy, llvm-ar, llvm-nm, र llvm-objdump सहित कर्नेल निर्माण प्रक्रियामा अन्य LLVM कम्पोनेन्टहरू प्रयोग गर्न सकिन्छ;
  • OpenCL मा C++17 प्रयोग गर्न प्रयोगात्मक समर्थन थपियो। विशिष्ट सुविधाहरूमा ठेगाना स्पेस विशेषताहरूको लागि समर्थन, टाइप कास्टिङ अपरेटरहरूद्वारा ठेगाना स्पेस रूपान्तरण रोक्न, C को लागि OpenCL मा जस्तै भेक्टर प्रकारहरूको प्रावधान, छविहरू, घटनाहरू, च्यानलहरू, इत्यादिका लागि विशिष्ट OpenCL प्रकारहरूको उपस्थिति समावेश छ।
  • नयाँ कम्पाइलर फ्ल्यागहरू "-ftime-trace" र "-ftime-trace-granularity=N" थपियो फ्रन्टएन्ड (पार्सिङ, प्रारम्भिक) र ब्याकइन्ड (अप्टिमाइजेसन चरणहरू) को विभिन्न चरणहरूको कार्यान्वयन समयको बारेमा रिपोर्ट उत्पन्न गर्न। रिपोर्ट json ढाँचामा सुरक्षित गरिएको छ, chrome://tracing र speedscope.app सँग उपयुक्त;
  • "__declspec(विभाजक)" निर्दिष्टकर्ताको प्रशोधन र थपिएको डिबगिङ जानकारीको उत्पादन जसले तपाईंलाई भिजुअल स्टुडियो वातावरणमा मेमोरी खपत अनुगमन गर्न अनुमति दिन्छ;
  • C भाषाको लागि, "__FILE_NAME__" म्याक्रोको लागि समर्थन थपिएको छ, जुन "__FILE__" म्याक्रोसँग मिल्दोजुल्दो छ, तर पूर्ण मार्ग बिना फाइल नाम मात्र समावेश गर्दछ;
  • C++ ले विभिन्न C++ सुविधाहरू कभर गर्न ठेगाना स्पेस विशेषताहरूको लागि समर्थन विस्तार गरेको छ, प्यारामिटर र तर्क ढाँचाहरू, सन्दर्भ प्रकारहरू, रिटर्न प्रकार अनुमान, वस्तुहरू, स्वत: उत्पन्न कार्यहरू, निर्मित अपरेटरहरू, र थप सहित।
  • OpenCL, OpenMP र CUDA को लागि समर्थनसँग सम्बन्धित क्षमताहरू विस्तार गरिएको छ। यसमा अन्तर्निहित OpenCL प्रकार्यहरू समावेश गर्न प्रारम्भिक समर्थन समावेश छ ("-fdeclare-opencl-builtins" झण्डा थपिएको छ), cl_arm_integer_dot_product विस्तार लागू गरिएको छ, र निदान उपकरणहरू विस्तार गरिएको छ;
  • स्थिर विश्लेषकको काम सुधार गरिएको छ र स्थिर विश्लेषण प्रदर्शन गर्ने कागजातहरू थपिएको छ। उपलब्ध परीक्षक मोड्युलहरू र समर्थित विकल्पहरू ("-विश्लेषक-चेकर[-option]-मद्दत", "-विश्लेषक-चेकर[-option]-help-alpha" र "-analyzer-checker[-option] -help प्रदर्शन गर्न झण्डाहरू थपियो। "-विकासकर्ता")। चेतावनीहरूलाई त्रुटिको रूपमा व्यवहार गर्न "-analyzer-werror" झण्डा थपियो।
    नयाँ प्रमाणीकरण मोडहरू थपियो:

    • security.insecureAPI. DeprecatedOrUnsafeBufferHandling बफरहरूसँग काम गर्ने असुरक्षित अभ्यासहरू पहिचान गर्न;
    • osx.MIGChecker MIG (Mach इन्टरफेस जेनरेटर) कल नियमहरूको उल्लङ्घन खोज्नको लागि;
    • optin.osx.OSObjectCStyleCast गलत XNU libkern वस्तु रूपान्तरणहरू फेला पार्न;
    • apiModeling.llvm LLVM codebase मा त्रुटिहरू पत्ता लगाउन मोडेलिङ जाँच कार्यहरूको सेटको साथ;
    • सुरु नगरिएको C++ वस्तुहरू जाँच गर्नको लागि स्थिर कोड (optin.cplusplus प्याकेजमा UninitializedObject);
  • clang-ढाँचा उपयोगिताले C# भाषामा कोड ढाँचाको लागि समर्थन थपेको छ र Microsoft द्वारा प्रयोग गरिएको कोड ढाँचा शैलीको लागि समर्थन प्रदान गर्दछ;
  • clang-cl, भिजुअल स्टुडियोमा समावेश cl.exe कम्पाइलरसँग विकल्प-स्तर अनुकूलता प्रदान गर्ने वैकल्पिक कमाण्ड-लाइन इन्टरफेसले अस्तित्वमा नभएका फाइलहरूलाई कमाण्ड-लाइन विकल्पहरूको रूपमा व्यवहार गर्न र सम्बन्धित चेतावनी प्रदर्शन गर्नका लागि हेरिस्टिक्स थपेको छ (उदाहरणका लागि, "clang-cl /diagnostic :caret /c test.cc" चलाउँदा);
  • ओपनएमपी एपीआईमा विशेष थप गरिएका चेकहरू सहित, नयाँ चेकहरूको ठूलो भाग लिन्टर क्ल्याङ्-टाइडीमा थपिएको छ;
  • विस्तार गरियो सर्भर क्षमताहरू clangd (Clang सर्भर), जसमा पृष्ठभूमि अनुक्रमणिका निर्माण मोड पूर्वनिर्धारित रूपमा सक्षम गरिएको छ, कोडको साथ प्रासंगिक कार्यहरूको लागि समर्थन थपिएको छ (चर पुन: प्राप्ति, स्वत: र म्याक्रो परिभाषाहरूको विस्तार, एस्केप्ड स्ट्रिङहरूलाई अनस्केप गरिएकोमा रूपान्तरण), प्रदर्शन गर्ने क्षमता। Clang-tidy बाट चेतावनीहरू, हेडर फाइलहरूमा त्रुटिहरूको विस्तारित निदान र प्रकार पदानुक्रमको बारेमा जानकारी प्रदर्शन गर्ने क्षमता थपियो;

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

  • LLD लिङ्करमा एउटा प्रयोगात्मक विभाजन सुविधा थपिएको छ, जसले तपाईंलाई एउटा कार्यक्रमलाई धेरै भागहरूमा विभाजन गर्न अनुमति दिन्छ, जसमध्ये प्रत्येक छुट्टै ELF फाइलमा अवस्थित छ। यो सुविधाले तपाईंलाई कार्यक्रमको मुख्य भाग सुरु गर्न अनुमति दिन्छ, जसले सञ्चालनको क्रममा आवश्यक पर्ने अन्य कम्पोनेन्टहरू लोड गर्नेछ (उदाहरणका लागि, तपाइँ निर्मित PDF दर्शकलाई छुट्टै फाइलमा अलग गर्न सक्नुहुन्छ, जुन प्रयोगकर्ताले PDF खोल्दा मात्र लोड हुनेछ। फाइल)।

    LLD लिङ्कर अगाडि ल्याएको छ arm32_7, arm64, ppc64le र x86_64 आर्किटेक्चरहरूको लागि लिनक्स कर्नेल लिङ्क गर्नको लागि उपयुक्त स्थितिमा।
    नयाँ विकल्पहरू "-" (stdout मा आउटपुट), "-[no-]अनुमति दिने-slib-अपरिभाषित", "-अपरिभाषित-ग्लोब", "-nmagic", "-omagic", "-निर्भर-पुस्तकालय", " - z ifunc-noplt" र "-z common-page-size"। AArch64 आर्किटेक्चरको लागि, BTI (शाखा लक्ष्य सूचक) र PAC (पोइन्टर प्रमाणीकरण कोड) निर्देशनहरूको लागि समर्थन थपिएको छ। MIPS, RISC-V र PowerPC प्लेटफर्महरूको लागि समर्थन उल्लेखनीय रूपमा सुधार गरिएको छ। WebAssembly को लागी गतिशील लिङ्क को लागी प्रारम्भिक समर्थन थपियो;

  • libc++ मा कार्यान्वयन गरियो प्रकार्यहरू आकार, std::is_constant_evaluated, std::midpoint र std::lerp, विधिहरू "फ्रन्ट" र "पछाडि" std::span मा थपिएका छन्, प्रकारका विशेषताहरू std::is_unbounded_array र std::is_bounded_array थपिएका छन्। , std क्षमताहरू विस्तार गरिएको छ: : परमाणु। GCC 4.9 को लागि समर्थन बन्द गरिएको छ (GCC 5.1 र नयाँ रिलीजहरूसँग प्रयोग गर्न सकिन्छ)। समर्थन थपियो वासी (WebAssembly प्रणाली इन्टरफेस, ब्राउजर बाहिर WebAssembly प्रयोग गर्न को लागी एक इन्टरफेस);
  • नयाँ अप्टिमाइजेसनहरू थपिएका छन्। केही परिस्थितिहरूमा bcmp मा memcmp कलहरूको रूपान्तरण सक्षम गरियो। जम्प तालिकाहरूका लागि दायरा जाँचको कार्यान्वयन गरिएको बहिष्कार जसमा तल्लो स्विच ब्लकहरू पहुँचयोग्य छैनन् वा जब निर्देशनहरू प्रयोग गरिएनन्, उदाहरणका लागि, प्रकार शून्यसँग प्रकार्यहरू कल गर्दा;
  • RISC-V आर्किटेक्चरको लागि ब्याकइन्ड स्थिर गरिएको छ, जुन अब प्रयोगात्मक रूपमा राखिएको छैन र पूर्वनिर्धारित रूपमा बनाइएको छ। MAFDC विस्तारहरूसँग RV32I र RV64I निर्देशन सेट संस्करणहरूको लागि पूर्ण कोड उत्पादन समर्थन प्रदान गर्दछ;
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU र PowerPC आर्किटेक्चरहरूको लागि ब्याकएन्डहरूमा धेरै सुधारहरू गरिएका छन्। उदाहरण को लागी, वास्तुकला को लागी
    AArch64 ले ARM ब्याकइन्डमा SVE2 (स्केलेबल भेक्टर एक्सटेन्सन 2) र MTE (मेमोरी ट्यागिङ एक्सटेन्सन) निर्देशनहरूको लागि समर्थन थप्यो, Armv8.1-M आर्किटेक्चर र MVE (M-प्रोफाइल भेक्टर विस्तार) विस्तार थपियो। GFX10 (Navi) आर्किटेक्चरको लागि समर्थन AMDGPU ब्याकइन्डमा थपिएको छ, प्रकार्य कल गर्ने क्षमताहरू पूर्वनिर्धारित रूपमा सक्षम छन्, र एक संयुक्त पास सक्रिय गरिएको छ। डीपीपी (डेटा-समानान्तर आदिम)।

  • LLDB डिबगरसँग अब ब्याकट्रेसहरूको लागि रङ हाइलाइटिङ छ र DWARF4 debug_types र DWARF5 debug_info ब्लकहरूको लागि समर्थन थपिएको छ;
  • COFF ढाँचामा वस्तु र कार्यान्वयनयोग्य फाइलहरूको लागि समर्थन llvm-objcopy र llvm-स्ट्रिप उपयोगिताहरूमा थपिएको छ।

स्रोत: opennet.ru

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