Издање комплета компајлера ЛЛВМ 16.0

Након шест месеци развоја, представљено је издање ЛЛВМ 16.0 пројекта - ГЦЦ-компатибилног комплета алата (компајлери, оптимизатори и генератори кода) који компајлира програме у средњи бит код виртуелних инструкција сличних РИСЦ-у (виртуелна машина ниског нивоа са систем оптимизације на више нивоа). Генерисани псеудокод се може конвертовати помоћу ЈИТ компајлера у машинске инструкције директно у време извршавања програма.

Главна побољшања у Цланг 16.0:

  • Подразумевани Ц++/ОбјЦ++ стандард је гну++17 (раније гну++14), што значи да су функције Ц++17 са ГНУ екстензијама подржане подразумевано. Да бисте вратили претходно понашање, можете користити опцију "-стд=гну++14".
  • Имплементиране напредне функције везане за Ц++20 стандард:
    • Условно тривијалне специјалне функције члана,
    • хватање структурираних веза у ламбда функцијама,
    • Оператор једнакости унутар израза,
    • Опција да се изостави кључна реч типенаме у неким контекстима,
    • Важећа иницијализација агрегата у заградама („Аггр(вал1, вал2)“).
  • Имплементиране су карактеристике дефинисане у будућем стандарду Ц++2б:
    • Дозвољено је постављање ознака на крај сложених израза,
    • статички оператор(),
    • статички оператор[],
    • Осигурана је компатибилност са типом цхар8_т,
    • Опсег знакова дозвољених за употребу у „\Н{...}“ је проширен
    • Додата је могућност коришћења променљивих декларисаних као "статички цонстекпр" у функцијама декларисаним као цонстекпр.
  • Функције дефинисане у будућем Ц-стандарду Ц2к су имплементиране:
    • Да бисте онемогућили упозорење „-Вунусед-лабел“, дозвољено је да се атрибут „[[маибе_унусед]]“ примени на ознаке
    • Дозвољено је постављање ознака било где у сложеним изразима,
    • Додати оператори типеоф и типеоф_ункуал,
    • Нови тип нуллптр_т и константа нуллптр за дефинисање нулл показивача који могу да се конвертују у било који тип показивача и представљају варијанту НУЛЛ која није везана за интегер и воид* типове.
    • У Ц2к режиму је дозвољено позивање макроа ва_старт са променљивим бројем аргумената (варијадно).
  • У режимима усклађености са Ц99, Ц11 и Ц17, подразумеване опције „-Вимплицит-фунцтион-децларатион“ и „-Вимплицит-инт“ сада производе грешку уместо упозорења.
  • Индиректна употреба "воид *" (нпр. "воид фунц(воид *п) { *п; }") у Ц++ режиму сада генерише грешку, слично ИСО Ц++, ГЦЦ, ИЦЦ и МСВЦ.
  • Навођење битних поља као операнада инструкција (нпр. "__асм { мов еак, с.бф }") у уграђеним блоковима склопа у Мицрософт стилу сада генерише грешку.
  • Додата дијагностика за присуство различитих структура и синдиката са истим именима у различитим модулима.
  • Могућности повезане са подршком за ОпенЦЛ и ОпенМП су проширене. Побољшана дијагностика за Ц++ шаблоне који се користе у аргументима ОпенЦЛ кернела. Побољшана подршка блокова чекања за АМДГПУ. Атрибут ноунвинд се имплицитно додаје свим функцијама. Побољшана подршка за уграђене функције.
  • Додата је могућност коришћења променљиве окружења ЦЛАНГ_ЦРАСХ_ДИАГНОСТИЦС_ДИР за дефинисање директоријума у ​​коме се чувају дијагностички подаци о квару.
  • Подршка за Уницоде је ажурирана на Уницоде 15.0 спецификацију. Неки математички симболи су дозвољени у идентификаторима, као што је „₊“ (нпр. „доубле кₖ₊₁“).
  • Додата подршка за учитавање више конфигурационих датотека (прво се учитавају подразумеване конфигурационе датотеке, а затим оне наведене преко „--цонфиг=“ заставице, која се сада може навести више пута). Промењен подразумевани редослед учитавања конфигурационих датотека: цланг прво покушава да учита датотеку - .цфг, а ако се не пронађе, покушава да учита две датотеке .цфг анд .цфг. Да бисте подразумевано онемогућили учитавање конфигурационих датотека, додата је заставица „--но-дефаулт-цонфиг“.
  • Да бисте обезбедили поновљиве градње, могуће је заменити тренутне вредности датума и времена у макроима __ДАТЕ__, __ТИМЕ__ и __ТИМЕСТАМП__ временом наведеним у променљивој окружења СОУРЦЕ_ДАТЕ_ЕПОЦХ.
  • Да би се проверило присуство уграђених функција (уграђених) које се могу користити у контексту константи, додат је макро „__хас_цонстекпр_буилтин“.
  • Додата нова заставица компилације "-фцоро-алигнед-аллоцатион" за доделу оквира усклађене корутине.
  • Ознака “-фстрицт-флек-арраис=” имплементира подршку за трећи ниво провере флексибилних елемената низа у структурама (Флексибилни чланови низа, низ неодређене величине на крају структуре). На трећем нивоу, само величина „[]“ (на пример, „инт б[]“) се третира као флексибилан низ, али величина „[0]“ (на пример, „инт б[0]“) није.
  • Додата "-фмодуле-оутпут" заставица за омогућавање једнофазног модела компилације за стандардне Ц++ модуле.
  • Додан режим „-Рпасс-аналисис=стацк-фраме-лаиоут“ да би се лакше дијагностиковали проблеми са распоредом оквира стека.
  • Додао је нови атрибут __аттрибуте__((таргет_версион("цпу_феатурес"))) и проширио функционалност атрибута __аттрибуте__((таргет_цлонес("цпу_феатурес1","цпу_феатурес2",...))) да изабере одређене верзије функција које обезбеђује ААрцх64 ЦПУ.
  • Дијагностички алати проширени:
    • Додато упозорење „-Всингле-бит-битфиелд-цонстант-цонверсион“ да би се открило имплицитно скраћење када се једнобитно поље додељује једном битном пољу.
    • Дијагностика неиницијализованих цонстекпр варијабли је проширена.
    • Додата упозорења "-Вцаст-фунцтион-типе-стрицт" и "-Винцомпатибле-фунцтион-поинтер-типес-стрицт" да би се идентификовали потенцијални проблеми са пребацивањем типа функције.
    • Додата дијагностика за коришћење нетачних или резервисаних назива модула у блоковима за извоз.
    • Побољшано откривање недостајућих „аутоматских“ кључних речи у дефиницијама.
    • Имплементација упозорења "-Винтегер-оверфлов" додала је проверу за додатне ситуације које доводе до преливања.
  • Имплементирана подршка за архитектуру скупа инструкција ЛоонгАрцх (-марцх=лоонгарцх64 или -марцх=ла464), која се користи у Лоонгсон 3 5000 процесорима и имплементира нови РИСЦ ИСА, сличан МИПС и РИСЦ-В.

Кључне иновације у ЛЛВМ 16.0:

  • ЛЛВМ коду је дозвољено да користи елементе дефинисане у Ц++17 стандарду.
  • Захтеви за животну средину за изградњу ЛЛВМ су повећани. Алати за прављење би сада требало да подржавају Ц++17 стандард, тј. Да бисте направили, потребан вам је најмање ГЦЦ 7.1, Цланг 5.0, Аппле Цланг 10.0 или Висуал Студио 2019 16.7.
  • Позадински део за ААрцх64 архитектуру додаје подршку за Цортек-А715, Цортек-Кс3 и Неоверсе В2 ЦПУ, асемблер за РМЕ МЕЦ (контексти шифровања меморије), Армв8.3 екстензије (комплексни број) и више верзија функција.
  • У позадини за АРМ архитектуру, подршка за Армв2, Армв2А, Армв3 и Армв3М циљне платформе је укинута, за које генерисање исправног кода није било загарантовано. Додата могућност генерисања кода за упутства за рад са комплексним бројевима.
  • Позадински део за архитектуру Кс86 је додао подршку за архитектуре скупа инструкција (ИСА) АМКС-ФП16, ЦМПЦЦКСАДД, АВКС-ИФМА, АВКС-ВННИ-ИНТ8, АВКС-НЕ-ЦОНВЕРТ. Додата подршка за упутства РДМСРЛИСТ, РМСРЛИСТ и ВРМСРНС. Имплементиране опције "-мцпу=рапторлаке", "-мцпу=метеорлаке", "-мцпу=емералдрапидс", "-мцпу=сиеррафорест", "-мцпу=гранитерапидс" и "-мцпу=грандридге".
  • Додата званична подршка за платформу ЛоонгАрцх.
  • Побољшана позадина за МИПС, ПоверПЦ и РИСЦ-В архитектуре
  • LLDB програм за отклањање грешака сада подржава отклањање грешака 64-битних извршних датотека за LoongArch архитектуру. Побољшано руковање COFF симболима за отклањање грешака. Дуплиране DLL датотеке се сада филтрирају са листе за учитавање. Windows-модули.
  • У библиотеци Либц++ главни рад је био усмерен на имплементацију подршке за нове карактеристике стандарда Ц++20 и Ц++23.
  • ЛДД линкер значајно смањује време повезивања тако што паралелизује скенирање премештања адресе и операције иницијализације секција. Додата подршка за компресију секција помоћу ЗСТД алгоритма.

Извор: опеннет.ру

Купите поуздан хостинг за сајтове са ДДоС заштитом, ВПС ВДС сервере 🔥 Купите поуздан веб хостинг са DDoS заштитом, VPS VDS сервере | ProHoster