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

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

Жаңы релиздеги негизги өзгөрүү анын киргизилиши болду Фланк, Fortran тили үчүн алдыңкы. Flang Fortran 2018, OpenMP 4.5 жана OpenACC 3.0 колдойт, бирок долбоордун иштеп чыгуусу аягына чыга элек жана алдыңкы аягы кодду талдоо жана тууралыгын текшерүү менен чектелет. LLVM аралык кодун түзүү азырынча колдоого алынбайт жана аткарылуучу файлдарды түзүү үчүн канондук код түзүлүп, тышкы Fortran компиляторуна өткөрүлүп берилет.

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

  • Абстракттуу синтаксис дарагын калыбына келтирүү мүмкүнчүлүгү кошулду (Т КАТАРЫ) бузулган C++ коду үчүн, ал каталарды аныктоого жардам берет жана clang-tidy жана clangd сыяктуу тышкы утилиталарга кошумча маалымат берет. Бул функция C++ коду үчүн демейки боюнча иштетилген жана "-Xclang -f[no-]recovery-ast" параметрлери аркылуу башкарылат.
  • Жаңы диагностикалык режимдер кошулду:
    • “-Wpointer-to-int-cast” – бардык мүмкүн болгон маанилерди камтыбаган int түрүнө көрсөткүчтөрдү чыгаруу жөнүндө эскертүүлөрдүн тобу.
    • "-Wuninitialized-const-reference" - "const" атрибуту менен шилтеме аргументтерин кабыл алган функциянын параметрлеринде инициализацияланбаган өзгөрмөлөрдү өткөрүү жөнүндө эскертүү.
    • "-Wimplicit-const-int-float-conversion" - демейки боюнча реалдуу константаны бүтүн сан түрүнө имплициттүү конвертациялоо жөнүндө эскертүү иштетилген.
  • ARM платформасы үчүн компиляторго орнотулган C функциялары каралган (Intrinsics), натыйжалуу вектордук көрсөтмөлөр Arm v8.1-M MVE жана CDE менен алмаштырылган. Жеткиликтүү функциялар arm_mve.h жана arm_cde.h баш файлдарында аныкталган.
  • Кошулган _ExtInt(N) кеңейтилген бүтүн сан түрлөрүнүн жыйындысы, сизге FPGA/HLSде эффективдүү иштетилүүчү эки даражанын эселенген эмес түрлөрүн түзүүгө мүмкүндүк берет. Мисалы,, _ExtInt(7) 7 биттен турган бүтүн сан түрүн аныктайт.
  • ARM SVE (Scalable Vector Extension) нускамаларынын негизинде орнотулган C функцияларын колдоону аныктаган макростор кошулду:
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Мисалы, __ARM_FEATURE_SVE макроосу "-march=armv64-a+sve" команда сабынын опциясын коюу менен AArch8 кодун генерациялоодо аныкталат.

  • "-O" желеги эми "-O1" ордуна "-O2" оптималдаштыруу режими менен аныкталды.
  • Жаңы компилятордун желектери кошулду:
    • "-fstack-clash-protection" - каршы коргоону камсыз кылат стек менен үймөктүн кесилиши.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - калкыма чекит сандары үчүн өзгөчө кырдаалды иштетүүчү режимин тандоого мүмкүндүк берет.
    • "-ffp-model={precise,strict,fast}" - Калкыма чекиттүү сандар үчүн бир катар адистештирилген варианттарга кирүү мүмкүнчүлүгүн жеңилдетет.
    • "-fpch-codegen" жана "-fpch-debuginfo" код жана debuginfo үчүн өзүнчө объект файлдары менен алдын ала түзүлгөн башты (PCH) түзүү үчүн.
    • "-fsanitize-coverage-allowlist" жана "-fsanitize-coverage-blocklist" камтуу тестин текшерүү үчүн ак жана кара тизмелер.
    • TLS (жип-локалдык сактагыч) өлчөмүн тандоо үчүн “-mtls-size={12,24,32,48}”.
    • Эксперименттик RISC-V кеңейтүүлөрүн иштетүү үчүн "-menable-experimental-extension".
  • C үчүн демейки режим "-fno-common" болуп саналат, ал кээ бир платформаларда глобалдык өзгөрмөлөргө натыйжалуураак жетүүгө мүмкүндүк берет.
  • Демейки модулдун кэши /tmpден ~/.cache каталогуна жылдырылды. Жок кылуу үчүн "-fmodules-cache-path =" желегин колдонсоңуз болот.
  • Демейки С тилинин стандарты gnu11ден gnu17ге жаңыртылган.
  • GNU C кеңейтүүсү үчүн алдын ала колдоо кошулду "asm inline» ассемблер кошумчаларын кошуу үчүн. Кеңейтүү дагы эле талданууда, бирок эч кандай түрдө иштетилбейт.
  • OpenCL жана CUDA колдоосу менен байланышкан мүмкүнчүлүктөр кеңейтилген. OpenCL 2.0 блок диагностикасына колдоо кошулду жана OpenMP 5.0 жаңы функцияларын ишке ашырды.
  • Exter "C" жана extern "C++" блокторунун ичинде тегиздөө үчүн clang форматынын утилитасына IndentExternBlock опциясы кошулду.
  • Статикалык анализатор C++ тилинде тукум кууган конструкторлор менен иштөөнү жакшыртты. Кулпуларды текшерүү үчүн alpha.core.C11Lock жана alpha.fuchsia.Lock, putenv кооптуу колдонулушун аныктоо үчүн alpha.security.cert.pos.34c, webkit.NoUncountedMemberChecker жана webkit.RefCntblBaseVirtualDtor, alha менен көйгөйлөрдү аныктоо үчүн жаңы чектер кошулду. .cplusplus .SmartPtr нөлдүк акылдуу көрсөткүчтү текшерүү үчүн.
  • In linter clang-тыкан кошулду жаңы чектердин чоң бөлүгү.
  • Clangd кэш сервери (Clang Server) иштешин жакшыртты жана жаңы диагностикалык мүмкүнчүлүктөрдү кошту.

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

  • Куруу системасы Python 3 колдонууга которулду. Эгерде Python 3 жок болсо, Python 2ди колдонууга кайра артка кайтууга болот.
  • Go тилинин (llgo) компилятору бар алдыңкы бөлүк келечекте реструктуризацияланышы мүмкүн болгон релизден чыгарылат.
  • Вектор-функция-аби-вариант атрибуту чалууларды векторизациялоо үчүн скалярдык жана вектордук функциялардын ортосундагы картаны сүрөттөө үчүн аралык өкүлчүлүккө (IR) кошулган. llvm::VectorTypeден эки өзүнчө вектор түрү бар llvm::FixedVectorType жана llvm::ScalableVectorType.
  • Udef баалуулуктарынын негизинде бутактандыруу жана undef маанилерин стандарттуу китепкана функцияларына өткөрүү аныкталбаган жүрүм-турум катары таанылат. IN
    memset/memcpy/memmove undef көрсөткүчтөрүн өткөрүүгө мүмкүндүк берет, бирок өлчөмү менен параметр нөл болсо.

  • LLJIT статикалык инициализацияларды LLJIT::initialize жана LLJIT::deinitialize ыкмалары аркылуу аткаруу үчүн колдоону кошту. StaticLibraryDefinitionGenerator классын колдонуу менен JITDylibке статикалык китепканаларды кошуу мүмкүнчүлүгү ишке ашырылган. үчүн C API кошулду ORCv2 (JIT компиляторлорун куруу үчүн API).
  • Cortex-A64, Cortex-A34, Cortex-A77 жана Cortex-X78 процессорлорун колдоо AArch1 архитектурасынын аркасына кошулду. Ишке ашырылган ARMv8.2-BF16 (BFloat16) жана ARMv8.6-A кеңейтүүлөрү, анын ичинде RMv8.6-ECV (жакшыртылган эсептегич виртуалдаштыруу), ARMv8.6-FGT (майдаланган тузактар), ARMv8.6-AMU (Активдүүлүк мониторлорун виртуалдаштыруу) жана ARMv8.0-DGH (Маалыматтарды чогултуу боюнча ишарат). SVE вектордук инструкцияларына камтылган функциялар үчүн кодду түзүү мүмкүнчүлүгү берилген.
  • Cortex-M55, Cortex-A77, Cortex-A78 жана Cortex-X1 процессорлорун колдоо ARM архитектурасынын арткы бөлүгүнө кошулду. Кеңейтүүлөр ишке ашырылды
    Armv8.6-A Matrix көбөйтүү жана RMv8.2-AA32BF16 BFloat16.

  • POWER10 процессорлору үчүн код генерациясын колдоо PowerPC архитектурасынын арткы бөлүгүнө кошулду. Циклди оптималдаштыруу кеңейтилди жана калкыма чекиттерди колдоо жакшыртылды.
  • RISC-V архитектурасынын аркасы расмий түрдө бекитиле элек эксперименталдык кеңейтилген нускама топтомун колдогон патчтарды кабыл алууга мүмкүндүк берет.
  • AVR архитектурасынын бэкленди эксперименталдык категориядан туруктуу, негизги бөлүштүрүүгө киргизилген.
  • x86 архитектурасы үчүн сервер Intel AMX жана TXLDTRK нускамаларын колдойт. Кол салууларга каршы кошумча коргоо LVI (Load Value Injection), ошондой эле CPUдагы операциялардын спекулятивдик аткарылышынан келип чыккан чабуулдарды бөгөттөө үчүн жалпы Спекуляциялык Аткаруу Сиде Эффекттин Басынтуу механизмин ишке ашырат.
  • SystemZ архитектурасынын аркасында MemorySanitizer жана LeakSanitizer колдоо кошулду.
  • Libc++ үчүн математикалык константалары бар баш файлга колдоо кошулду .
  • Кеңейтилген LLD байланыштыргыч мүмкүнчүлүктөрү. ELF форматына жакшыртылган колдоо, анын ичинде "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shaffle-sections", "кошулган опциялар. -thinlto- бир модуль", "-уникалдуу", "-розегмент", "-жиптер = N". Изди файлга сактоо үчүн "--time-trace" опциясы кошулду, аны Chrome'догу chrome://tracing интерфейси аркылуу талдап чыгууга болот.

Source: opennet.ru

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