LLVM 9.0 компиляторлар жинағының шығарылымы

Алты айлық дамудан кейін ұсынылды жобаның шығарылымы LLVM 9.0 — GCC-үйлесімді құралдар (компиляторлар, оңтайландырушылар және код генераторлары), бағдарламаларды RISC-тәрізді виртуалды нұсқаулардың аралық бит-кодына құрастыру (көп деңгейлі оңтайландыру жүйесі бар төмен деңгейлі виртуалды машина). Жасалған псевдокодты JIT компиляторының көмегімен бағдарламаны орындау кезінде тікелей машиналық нұсқауларға түрлендіруге болады.

LLVM 9.0 жаңа мүмкіндіктеріне мақсатты RISC-V платформасынан эксперименттік дизайн тегін жою, OpenCL үшін C++ қолдауы, LLD жүйесінде бағдарламаны динамикалық жүктелген бөліктерге бөлу мүмкіндігі және «асм барады", Linux ядросының кодында қолданылады. libc++ WASI (WebAssembly Жүйе интерфейсі) үшін қолдауды қосты және LLD WebAssembly динамикалық байланыстыру үшін бастапқы қолдауды қосты.

Жақсартулар Clang 9.0 нұсқасында:

  • Қосылды GCC спецификалық өрнекті жүзеге асыру»асм барады«, ол ассемблердің кірістірілген блогынан C кодындағы белгіге көшуге мүмкіндік береді. Бұл мүмкіндік x86_64 архитектурасы бар жүйелерде Clang арқылы «CONFIG_JUMP_LABEL=y» режимінде Linux ядросын құру үшін қажет. Алдыңғы шығарылымдарда қосылған өзгерістерді ескере отырып, Linux ядросын енді x86_64 архитектурасы үшін Clang бағдарламасында құрастыруға болады (бұрын тек arm, aarch64, ppc32, ppc64le және mips архитектурасына қолдау көрсетілген). Сонымен қатар, Android және ChromeOS жобалары ядроны құру үшін Clang қолдануға түрлендірілді және Google Clang-ті Linux жүйелері үшін ядроларды құрудың негізгі платформасы ретінде сынап жатыр. Болашақта 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 қолданбаларымен үйлесімді;
  • Visual Studio ортасында жадты тұтынуды бақылауға мүмкіндік беретін "__declspec(allocator)" спецификаторын өңдеу және ілеспе жөндеу ақпаратын генерациялау қосылды;
  • Си тілі үшін «__FILE_NAME__» макросы үшін қолдау қосылды, ол «__FILE__» макросына ұқсайды, бірақ толық жолы жоқ файл атауын ғана қамтиды;
  • C++ әр түрлі C++ мүмкіндіктерін, соның ішінде параметр мен аргумент үлгілерін, сілтеме түрлерін, қайтару түрінің қорытындысын, нысандарды, автоматты түрде жасалған функцияларды, кірістірілген операторларды және т.б. қамтитын мекенжай кеңістігінің атрибуттарына қолдауды кеңейтті.
  • OpenCL, OpenMP және CUDA қолдауымен байланысты мүмкіндіктер кеңейтілді. Бұл кірістірілген OpenCL функцияларын жасырын қосуға арналған бастапқы қолдауды қамтиды («-fdeclare-opencl-builtins» жалаушасы қосылды), cl_arm_integer_dot_product кеңейтімі іске асырылды және диагностика құралдары кеңейтілді;
  • Статикалық анализатордың жұмысы жақсартылды және статикалық талдауды орындау бойынша құжаттама қосылды. Қол жетімді тексеру модульдері мен қолдау көрсетілетін опцияларды («-анализер-тексеру[-опция]-анықтама», «-анализатор-тексеру[-опция]-анықтама-альфа» және «-анализер-тексеру[-опция]-анықтама» көрсету үшін жалаушалар қосылды. ” -әзірлеуші”). Ескертулерді қате ретінде қарастыру үшін «-analyzer-werror» жалаушасы қосылды.
    Жаңа растау режимдері қосылды:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling буфермен жұмыс істеу үшін қауіпті тәжірибелерді анықтау;
    • MIG (Mach Interface Generator) шақыру ережелерін бұзуды іздеу үшін osx.MIGChecker;
    • қате XNU libkern нысан түрлендірулерін табу үшін optin.osx.OSObjectCStyleCast;
    • apiModeling.llvm LLVM код базасындағы қателерді анықтау үшін модельдеуді тексеру функцияларының жиынтығымен;
    • Initialized C++ нысандарын тексеруге арналған тұрақталған код (optin.cplusplus бумасындағы UninitializedObject);
  • Clang-пішімінің утилитасы C# тілінде пішімдеу кодын қолдауды қосты және Microsoft пайдаланатын кодты пішімдеу мәнерін қолдауды қамтамасыз етеді;
  • Visual Studio бағдарламасына енгізілген cl.exe компиляторымен опция деңгейінде үйлесімділікті қамтамасыз ететін балама пәрмен жолы интерфейсі clang-cl, жоқ файлдарды пәрмен жолы опциялары ретінде қарастыру және сәйкес ескертуді көрсету үшін эвристиканы қосты (мысалы, "clang-cl /diagnostic :caret /c test.cc" іске қосылғанда);
  • Жаңа тексерулердің үлкен бөлігі linter clang-tidy бағдарламасына қосылды, соның ішінде OpenMP API-ге тән қосымша тексерулер;
  • Кеңейтілген сервер мүмкіндіктері clangd Фондық индексті құру режимі әдепкі бойынша қосылған (Clang сервері), кодпен мәтінмәндік әрекеттерді қолдау қосылды (айнымалыларды іздеу, авто және макрос анықтамаларын кеңейту, қашып шыққан жолдарды шығусызға түрлендіру), көрсету мүмкіндігі Clang-tidy ескертулері, тақырып файлдарындағы қателердің кеңейтілген диагностикасы және тип иерархиясы туралы ақпаратты көрсету мүмкіндігін қосты;

басты инновациялар LLVM 9.0:

  • LLD сілтемесіне эксперименттік бөлу мүмкіндігі қосылды, ол бір бағдарламаны әрқайсысы жеке ELF файлында орналасқан бірнеше бөлікке бөлуге мүмкіндік береді. Бұл мүмкіндік жұмыс барысында қажет болған жағдайда басқа компоненттерді жүктейтін бағдарламаның негізгі бөлігін іске қосуға мүмкіндік береді (мысалы, кірістірілген PDF қарау құралын жеке файлға бөлуге болады, ол пайдаланушы PDF файлын ашқанда ғана жүктеледі. файл).

    LLD сілтемесі алға шығарды arm32_7, arm64, ppc64le және x86_64 архитектуралары үшін Linux ядросын байланыстыруға қолайлы күйге.
    Жаңа опциялар "-" (stdout-қа шығару), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt» және «-z жалпы бет өлшемі». AArch64 архитектурасы үшін BTI (Branch Target Indicator) және PAC (Меңзердің аутентификация коды) нұсқауларына қолдау қосылды. MIPS, RISC-V және PowerPC платформаларын қолдау айтарлықтай жақсарды. WebAssembly үшін динамикалық байланыстыруға бастапқы қолдау қосылды;

  • libc++ ішінде жүзеге асырылды ssize, std::is_constant_evaluated, std::midpoint және std::lerp функциялары, std::span ішіне “front” және “back” әдістері қосылды, std::is_unbounded_array және std::is_bounded_array түрлерінің атрибуттары қосылды , std мүмкіндіктері кеңейтілді: :атомдық. GCC 4.9 нұсқасына қолдау көрсету тоқтатылды (GCC 5.1 және жаңарақ шығарылымдармен бірге пайдалануға болады). Қосымша қолдау WASI (WebAssembly жүйелік интерфейсі, WebAssembly браузерден тыс пайдалануға арналған интерфейс);
  • Жаңа оңтайландырулар қосылды. Кейбір жағдайларда memcmp қоңырауларын bcmp-ге түрлендіру қосылған. Төменгі ауыстырып-қосқыш блоктары қол жетімсіз немесе нұсқаулар пайдаланылмаған, мысалы, void түріндегі функцияларды шақыру кезінде өту кестелері үшін диапазонды тексеруді жүзеге асырмау;
  • RISC-V архитектурасына арналған сервер тұрақтандырылды, ол енді эксперименттік ретінде орналаспайды және әдепкі бойынша құрастырылады. MAFDC кеңейтімдері бар RV32I және RV64I нұсқаулар жиынының нұсқалары үшін толық код генерациясын қолдауды қамтамасыз етеді;
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU және PowerPC архитектуралары үшін серверлерге көптеген жақсартулар жасалды. Мысалы, сәулет үшін
    AArch64 SVE2 (Scalable Vector Extension 2) және MTE (Memory Tagging Extensions) нұсқауларына қолдау қосты; ARM серверінде Armv8.1-M архитектурасына қолдау және MVE (M-профиль векторының кеңейтімі) кеңейтімі қосылды. GFX10 (Navi) архитектурасына қолдау AMDGPU серверіне қосылды, функцияларды шақыру мүмкіндіктері әдепкі бойынша қосылады және біріктірілген рұқсат белсендірілді. DPP (Data-Parallel Primitives).

  • LLDB отладчикінде енді кері жолдар үшін түсті бөлектеу және DWARF4 debug_types және DWARF5 debug_info блоктары үшін қосымша қолдау бар;
  • COFF пішіміндегі нысанды және орындалатын файлдарды қолдау llvm-objcopy және llvm-strip утилиталарына қосылды.

Ақпарат көзі: opennet.ru

пікір қалдыру