LLVM 9.0 компилятор топтомунун чыгарылышы

алты айдан кийин иштеп чыгуу сунушталды долбоор чыгаруу LLVM 9.0 — GCC шайкеш инструменттер (компиляторлор, оптимизаторлор жана код генераторлор), программаларды RISC сымал виртуалдык нускамалардын ортоңку биткоддоруна компиляциялоо (көп деңгээлдүү оптималдаштыруу системасы менен төмөнкү деңгээлдеги виртуалдык машина). Түзүлгөн псевдокод JIT компиляторунун жардамы менен программаны аткаруу учурунда түздөн-түз машиналык көрсөтмөлөргө айландырылат.

LLVM 9.0 жаңы мүмкүнчүлүктөрүнө максаттуу RISC-V платформасынан эксперименталдык дизайн тегин алып салуу, OpenCL үчүн C++ колдоосу, LLDде программаны динамикалык жүктөлгөн бөлүктөргө бөлүү мүмкүнчүлүгү жана “asm goto", Linux ядро ​​кодунда колдонулат. libc++ WASI (WebAssembly System Interface) колдоосун кошту жана LLD WebAssembly динамикалык байланышы үчүн баштапкы колдоону кошту.

Өркүндөтүү Clang 9.0 ичинде:

  • Кошулган GCC конкреттүү туюнтмасын ишке ашыруу "asm goto", бул сизге ассемблердин саптык блогунан C кодундагы энбелгиге өтүүгө мүмкүндүк берет. Бул функция x86_64 архитектурасы бар системаларда Clang аркылуу "CONFIG_JUMP_LABEL=y" режиминде Linux ядросун куруу үчүн талап кылынат. Мурунку чыгарылыштарда кошулган өзгөртүүлөрдү эске алуу менен, Linux өзөгүн эми Clang-да x86_64 архитектурасы үчүн курууга болот (мурда кол үчүн гана куруу, aarch64, ppc32, ppc64le жана mips архитектуралары колдоого алынган). Мындан тышкары, Android жана ChromeOS долбоорлору мурдатан ядро ​​куруу үчүн Clang колдонууга айландырылган жана Google Clangди өзүнүн Linux системалары үчүн ядролорду куруунун негизги платформасы катары сынап жатат. Келечекте башка LLVM компоненттери ядро ​​куруу процессинде колдонулушу мүмкүн, анын ичинде LLD, llvm-objcopy, llvm-ar, llvm-nm жана llvm-objdump;
  • OpenCLде C++ 17ди колдонуу үчүн эксперименталдык колдоо кошулду. Өзгөчө өзгөчөлүктөргө дарек мейкиндигинин атрибуттарын колдоо, типти кастинг операторлору боюнча дарек мейкиндигин өзгөртүүнү бөгөттөө, C үчүн OpenCLдегидей вектордук типтерди камсыздоо, сүрөттөр, окуялар, каналдар үчүн атайын OpenCL түрлөрүнүн болушу ж.б.
  • Фронттун ар кандай этаптарынын (талдоо, инициализация) жана бэкендинин (оптималдаштыруу этаптары) аткарылуу убактысы жөнүндө отчетту түзүү үчүн “-ftime-trace” жана “-ftime-trace-granularity=N” жаңы компилятор желекчелери кошулду. Отчет json форматында сакталып, chrome://tracing жана speedscope.app менен шайкеш келет;
  • "__declspec(allocator)" спецификаторун иштетүү жана Visual Studio чөйрөсүндө эстутум керектөөсүн көзөмөлдөөгө мүмкүндүк берүүчү коштолгон мүчүлүштүктөрдү оңдоо маалыматын түзүү кошулду;
  • Си тили үчүн "__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 код базасындагы каталарды аныктоо үчүн моделдөөчү текшерүү функцияларынын жыйындысы менен;
    • Башталбаган C++ объекттерин текшерүү үчүн стабилдештирилген код (optin.cplusplus пакетиндеги UninitializedObject);
  • Clang-format утилитасы C# тилинде форматтоо кодун колдоону кошту жана Microsoft колдонгон код форматтоо стилин колдоону камсыз кылат;
  • clang-cl, Visual Studio камтылган cl.exe компилятору менен опция деңгээлиндеги шайкештикти камсыз кылган альтернативалык буйрук сабы интерфейси, жок файлдарды буйрук сабынын варианттары катары кароо жана тиешелүү эскертүүнү көрсөтүү үчүн эвристиканы кошту (мисалы, "clang-cl /diagnostic :caret /c test.cc" иштеп жатканда);
  • Жаңы текшерүүлөрдүн чоң бөлүгү linter clang-tidy'ге кошулду, анын ичинде OpenMP API'ге мүнөздүү кошумча текшерүүлөр;
  • Кеңейтилген сервердин мүмкүнчүлүктөрү clangd Фондук индексти түзүү режими демейки боюнча иштетилген (Clang Server), коду менен контексттик аракеттерди колдоо кошулган (өзгөрмөлөрдү издөө, авто жана макро аныктамаларды кеңейтүү, качып кеткен саптарды качпагандарга өзгөртүү), көрсөтүү мүмкүнчүлүгү Clang-tidyден эскертүүлөр, баш файлдардагы каталарды диагностикалоо кеңейтилди жана типтин иерархиясы жөнүндө маалыматты көрсөтүү мүмкүнчүлүгү кошулду;

негизги инновациялар LLVM 9.0:

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

    LLD Linker алдыга чыгарды arm32_7, arm64, ppc64le жана x86_64 архитектуралары үчүн Linux ядросун байланыштыруу үчүн ылайыктуу абалга.
    Жаңы параметрлер "-" (stdout'ка чыгаруу), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" жана "-z common-page-size". AArch64 архитектурасы үчүн BTI (Branch Target Indicator) жана PAC (Pointer Authentication Code) нускамаларына колдоо кошулду. 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 түрлөрүнүн атрибуттары кошулду , стд мумкунчулуктеру кецейтилди: :атомдук. GCC 4.9 колдоо токтотулду (GCC 5.1 жана жаңыраак релиздерде колдонсо болот). Кошулган колдоо WASI (WebAssembly System Interface, WebAssembly браузерден тышкары колдонуу үчүн интерфейс);
  • Жаңы оптималдаштыруулар кошулду. Кээ бир жагдайларда memcmp чалууларын bcmpге которуу иштетилген. Төмөнкү коммутатор блокторуна жетүүгө мүмкүн болбогон же инструкциялар колдонулбаган учурда, мисалы, void тибиндеги функцияларды чакырганда, секирүү үстөлдөрүн текшерүү диапазону ишке ашырылган;
  • RISC-V архитектурасынын сервери турукташтырылды, ал мындан ары эксперименталдык катары жайгаштырылбайт жана демейки боюнча курулган. MAFDC кеңейтүүлөрү менен RV32I жана RV64I инструкциялар топтому варианттары үчүн толук кодду түзүү колдоосун камсыз кылат;
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU жана PowerPC архитектуралары үчүн серверлерге көптөгөн жакшыртуулар киргизилген. Мисалы, архитектура үчүн
    AArch64 ARM серверинде SVE2 (Scalable Vector Extension 2) жана MTE (Memory Tagging Extensions) нускамаларына колдоо кошту, Armv8.1-M архитектурасын жана MVE (M-Profile Vector Extension) кеңейтүүсүн колдоо кошулду. GFX10 (Navi) архитектурасын колдоо AMDGPU серверине кошулду, функцияларды чакыруу мүмкүнчүлүктөрү демейки боюнча иштетилген жана айкалыштырылган өтүү иштетилген DPP (Data-Parallel Primitives).

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

Source: opennet.ru

Комментарий кошуу