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

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

LLVM 10.0 жаңы функцияларына C++ концепцияларын колдоо кирет, мындан ары Clang өзүнчө процесс катары иштебейт, Windows үчүн CFG (контролдук агым коргоочу) текшерүүлөрүн колдоо жана жаңы CPU мүмкүнчүлүктөрүн колдоо.

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

  • Кошулган колдоо "түшүнүктөр", кийинки стандартка киргизиле турган C++ шаблонунун кеңейтүүсү, код аты C++2a (-std=c++2a желекчеси менен күйгүзүлгөн).
    Түшүнүктөр компиляция убагында калыптын параметрлери катары кабыл алынышы мүмкүн болгон аргументтердин топтомун чектеген шаблон параметрлеринин талаптарынын топтомун аныктоого мүмкүндүк берет. Түшүнүктөр шаблон ичинде колдонулган маалымат типтеринин касиеттери менен киргизүү параметрлеринин маалымат түрүнүн касиеттеринин ортосундагы логикалык карама-каршылыктарды болтурбоо үчүн колдонулушу мүмкүн.

    шаблон
    түшүнүк ТеңдикСалыштырылуучу = талап кылат(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" - экспонентация (2^16) менен чаташтырылышы мүмкүн болгон операцияларда "^" (xor) операторун колдонуу сыяктуу конструкцияларды колдонууну эскертет.
    • "-Wfinal-dtor-non-final-class" - "акыркы" спецификациясы менен белгиленбеген, бирок "акыркы" атрибуту бар деструктору бар класстар жөнүндө эскертет.
    • "-Wtautological-bitwise-compare" - бул биттик операция менен константтын ортосундагы тавтологиялык салыштырууларды диагностикалоо жана биттик ЖЕ операциясы терс эмес санга колдонулган ар дайым чыныгы салыштырууларды аныктоо үчүн эскертүүлөр тобу.
    • "-Wbitwise-шарттуу кашаа" логикалык операторлорду ЖАНА (&) жана ЖЕ (|) шарттуу оператору (?:) менен аралаштыруудагы көйгөйлөрдү эскертет.
    • "-Wmisleading-indentation" GCC бир эле аталыштагы текшерүүнүн аналогу болуп саналат, анда алар if/else/for/while блогунун бир бөлүгү сыяктуу чегинген туюнтмалар жөнүндө эскертет, бирок чындыгында алар бул блокко кирбейт. .
    • "-Wextra" көрсөтүлгөндө, "-Wdeprecated-copy" текшерүүсү иштетилип, конструкторлорду колдонуу жөнүндө эскертет.
      ачык кыйратуучу аныктамасы менен класстарда "жылдыруу" жана "көчүрүү".

    • "-Wtautological-overlap-салыштыруу", "-Wsizeof-pointer-div", "-Wtautological-салыштыруу", "-Wrange-loop-analysis" текшерүүлөрү кеңейтилди.
    • "-Wbitwise-op-parentheses" жана "-Wlogical-op-parentheses" текшерүүлөрү демейки боюнча өчүрүлгөн.
  • C жана C++ коддорунда көрсөткүчтөрдүн арифметикалык операцияларына массивдерде гана уруксат берилет. "-fsanitize=pointer-overflow" режиминдеги Белгисиз жүрүм-турумду тазалоочу азыр нөл эмес көрсөткүчкө нөл эмес офсетти кошуу же нөл эмес көрсөткүчтөн бүтүн санды алып салууда нөл көрсөткүчтү түзүү сыяктуу учурларды кармайт.
  • "-fsanitize=implicit-conversion" (Имплиситтүү конвертацияны тазалоочу) режими "int" түрүнөн бир аз кичине өлчөмдөгү түрлөр үчүн көбөйтүү жана азайтуу операцияларындагы көйгөйлөрдү аныктоого ылайыкташтырылган.
  • x86 максаттуу архитектурасын тандоодо "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" жана "-march=cooperlake" векторлоштурулганда демейки боюнча код 512-бит zmm регистрлерин колдонууну токтотту, алардын баштапкы кодунда түз көрсөтүлүшүнөн башкасы. Себеби, 512 биттик операцияларды аткарууда CPU жыштыгы төмөндөйт, бул жалпы иштөөгө терс таасирин тийгизиши мүмкүн. Жаңы жүрүм-турумду өзгөртүү үчүн "-mprefer-vector-width=512" опциясы каралган.
  • "-flax-vektor-conversions" желекчесинин жүрүм-туруму GCCге окшош: бүтүн жана калкыма чекит векторлорунун ортосундагы имплициттүү вектордук биттик конверсияларга тыюу салынган. Бул чектөөнү жоюу үчүн желекти колдонуу сунушталууда
    "-flax-vector-conversions=all" демейки болуп саналат.

  • Octeon үй-бүлөсүнүн MIPS процессорлору үчүн жакшыртылган колдоо. Жарактуу CPU түрлөрүнүн тизмесине "octeon+" кошулду.
  • WebAssembly аралык кодуна чогултулганда, системада бар болсо, wasm-opt оптимизатору автоматтык түрдө чакырылат.
  • RISC-V архитектурасына негизделген системалар үчүн ассемблердин саптык кошумчаларынын шарттуу блокторунда калкыма чекиттин маанилерин сактоочу регистрлерди колдонууга жол берилет.
  • Жаңы компилятордун желектери кошулду: "-fgnuc-version" "__GNUC__" жана ушул сыяктуу макростор үчүн версиянын маанисин коюу үчүн; "-fmacro-prefix-map=OLD=NEW" каталогунун ALD префиксин ЖАНЫ менен алмаштыруу үчүн "__FILE__" сыяктуу макростарда; "-fpatchable-function-entry=N[,M]" функциянын кирүү чекитине чейин жана андан кийин белгилүү бир сандагы NOP нускамаларын түзүү. RISC-V үчүн
    "-ffixed-xX", "-mcmodel=medany" жана "-mcmodel=medlow" желектери үчүн кошумча колдоо.

  • '__attribute__((target(“branch-protection=..."))) атрибутун колдоо кошулду, анын эффектиси опцияга окшош - тармактык коргоо.
  • Windows платформасында "-cfguard" желекчесин көрсөтүүдө кыйыр функциялык чакыруулар үчүн агымдын бүтүндүгүн текшерүүнү (Control Flow Guard) алмаштыруу ишке ашырылат. Текшерүүнү алмаштырууну өчүрүү үчүн "-cfguard-nochecks" желекчесин же "__declspec(guard(nocf))" модификаторун колдонсоңуз болот.
  • gnu_inline атрибутунун жүрүм-туруму "extern" ачкыч сөзү жок колдонулган учурларда GCCге окшош.
  • OpenCL жана CUDA колдоосу менен байланышкан мүмкүнчүлүктөр кеңейтилген. Жаңы OpenMP 5.0 функциялары үчүн колдоо кошулду.
  • Clang форматынын утилитасына Стандарттык опция кошулду, ал кодду талдоодо жана форматтоодо колдонулган C++ стандартынын версиясын аныктоого мүмкүндүк берет (Акыркы, Auto, c++03, c++11, c++14, c++17, c++20).
  • Статикалык анализаторго жаңы текшерүүлөр кошулду: жетиштүү сактоо мейкиндиги бар же жок экенин аныктоо үчүн alpha.cplusplus.PlacementNew, Fuchsia иштеткичтерине байланыштуу агып кетүүлөрдү аныктоо үчүн fuchsia.HandleChecker, буферди колдонууда мүмкүн болуучу буферди аныктоо үчүн security.insecureAPI.decodeValueOfObjCType. :at:] .
  • Белгисиз жүрүм-турумду тазалоочу каражат (UBSan) NULL көрсөткүчтөрүнө нөлдүк эмес офсеттердин колдонулушун же натыйжада NULL көрсөткүчүнүн офсетинин кошулушун кармоо үчүн көрсөткүчтүн ашыкча текшерүүлөрүн кеңейтти.
  • In linter clang-тыкан кошулду жаңы чектердин чоң бөлүгү.

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

  • рамкага Атрибутор Жаңы процедуралар аралык оптималдаштыруу жана анализаторлор кошулду. 19 түрдүү атрибуттардын абалы болжолдонууда, анын ичинде 12 атрибут 12 LLVM IR жана 7 абстракттуу атрибуттар, мисалы, жандуу.
  • Компиляторго жаңы матрицалык математикалык функциялар кошулду (Intrinsics), алар компиляция учурунда эффективдүү вектордук инструкциялар менен алмаштырылат.
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU жана PowerPC архитектуралары үчүн серверлерге көптөгөн жакшыртуулар киргизилген. Кошулган CPU колдоосу
    Cortex-A65, Cortex-A65AE, Neoverse E1 жана Neoverse N1. ARMv8.1-M үчүн кодду түзүү процесси оптималдаштырылган (мисалы, минималдуу чыгымы бар циклдерди колдоо пайда болгон) жана MVE кеңейтүүсүн колдонуу менен автовекторизацияны колдоо кошулган. Жакшыртылган CPU MIPS Octeon колдоосу. PowerPC үчүн, MASSV (Mathematical Acceleration SubSystem) китепканасын колдонуу менен математикалык подпрограммаларды векторизациялоо иштетилди, кодду түзүү жакшыртылды жана циклдерден эстутумга жетүү оптималдаштырылган. x86 үчүн, v2i32, v4i16, v2i16, v8i8, v4i8 жана v2i8 вектордук түрлөрүн иштетүү өзгөртүлгөн.

  • WebAssembly үчүн жакшыртылган код генератору. TLS (Thread-Local Storage) жана atomic.fence нускамалары үчүн кошумча колдоо. SIMD колдоо кыйла кеңейтилди. WebAssembly объектинин файлдары эми көп баалуу функция колдорун колдонуу мүмкүнчүлүгүнө ээ.
  • Анализатор циклдерди иштетүүдө колдонулат MemorySSA, бул ар кандай эс тутум операцияларынын ортосундагы көз карандылыкты аныктоого мүмкүндүк берет. MemorySSA компиляция жана аткаруу убактысын кыскарта алат же AliasSetTracker ордуна колдонулушу мүмкүн.
  • LLDB мүчүлүштүктөрдү оңдоочу DWARF v5 форматын колдоону кыйла жакшыртты. MinGW менен куруу үчүн жакшыртылган колдоо
    жана ARM жана ARM64 архитектуралары үчүн Windowsтун аткарылуучу файлдарын оңдоонун баштапкы мүмкүнчүлүгүн кошту. Өтмөктү басуу менен киргизүүнү автотолтурууда сунушталган варианттардын сүрөттөмөлөрү кошулду.

  • Кеңейтилген LLD байланыштыргыч мүмкүнчүлүктөрү. ELF форматына жакшыртылган колдоо, анын ичинде GNU шилтемеси менен глоб үлгүлөрүнүн толук шайкештигин камсыз кылуу, ".zdebug" кысылган мүчүлүштүктөрдү оңдоо бөлүмдөрү үчүн колдоо кошуу, .note.gnu.property бөлүмүн аныктоо үчүн PT_GNU_PROPERTY касиетин кошуу (келечекте колдонулушу мүмкүн) Linux ядролору),
    "-z мурунтан-код", "-z өзүнчө-код" жана "-z өзүнчө жүктөөчү сегменттер" режимдери ишке ашырылган. MinGW жана WebAssembly үчүн жакшыртылган колдоо.

Source: opennet.ru

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