Након шест месеци развоја, представљено је издање ЛЛВМ 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.
- ЛДД линкер значајно смањује време повезивања тако што паралелизује скенирање премештања адресе и операције иницијализације секција. Додата подршка за компресију секција помоћу ЗСТД алгоритма.
Извор: опеннет.ру
