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

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

Нове функције у ЛЛВМ 10.0 укључују подршку за Ц++ концепте, више не покреће Цланг као посебан процес, подршку за ЦФГ (цонтрол флов гуард) провере за Виндовс и подршку за нове могућности процесора.

Побољшања у Цланг 10.0:

  • Додата подршка за "концепти“, проширење Ц++ шаблона које ће бити укључено у следећи стандард, кодног имена Ц++2а (укључено заставицом -стд=ц++2а).
    Концепти вам омогућавају да дефинишете скуп захтева параметара шаблона који, у време компајлирања, ограничавају скуп аргумената који се могу прихватити као параметри шаблона. Концепти се могу користити да би се избегле логичке недоследности између својстава типова података који се користе у оквиру шаблона и својстава типа података улазних параметара.

    шаблон
    концепт ЈеднакостУпоредиви = захтева(Т а, Т б) {
    { а == б } -> стд::боолеан;
    { а != б } -> стд::боолеан;
    };

  • Подразумевано, покретање посебног процеса („цланг -цц1“) у коме се врши компилација је заустављено. Компилација је сада урађена у главном процесу, а опција "-фно-интегратед-цц1" се може користити за враћање старог понашања.
  • Нови дијагностички режими:
    • „-Вц99-десигнатор“ и „-Вреордер-инит-лист“ упозоравају на коришћење Ц99 иницијализатора у Ц++ режиму у случајевима када су исправни у Ц99, али не и у Ц++20.
    • "-Всизеоф-арраи-див" - хвата ситуације као што је "инт арр[10]; …сизеоф(арр) / сизеоф(схорт)…” (требало би да буде „сизеоф(арр) / сизеоф(инт)”).
    • "-Вкор-усед-ас-по" - упозорава на употребу конструкција као што је употреба "^" (кор) оператора у операцијама које се могу помешати са експоненцијацијом (2^16).
    • "-Вфинал-дтор-нон-финал-цласс" - упозорава на класе које нису означене спецификацијом "финал", али имају деструктор са атрибутом "финал".
    • „-Втаутологицал-битвисе-цомпаре“ је група упозорења за дијагностиковање таутолошких поређења између операције по биту и константе и за идентификацију увек тачних поређења у којима се операција ОР примењује на ненегативан број.
    • „-Вбитвисе-цондитионал-парентхесес“ упозорава на проблеме при мешању логичких оператора АНД (&) и ОР (|) са условним оператором (?:).
    • „-Вмислеадинг-индентатион“ је аналог истоимене провере из ГЦЦ-а, која упозорава на увучене изразе као да су део иф/елсе/фор/вхиле блока, али у ствари нису укључени у овај блок .
    • Када наведете „-Вектра“, омогућена је провера „-Вдепрецатед-цопи“, која упозорава на употребу конструктора
      „премести“ и „копирај“ у класама са експлицитном дефиницијом деструктора.

    • Провере "-Втаутологицал-оверлап-цомпаре", "-Всизеоф-поинтер-див", "-Втаутологицал-цомпаре", "-Вранге-лооп-аналисис" су проширене.
    • Провере „-Вбитвисе-оп-парентхесес“ и „-Влогицал-оп-парентхесес“ су подразумевано онемогућене.
  • У Ц и Ц++ коду, аритметичке операције показивача су дозвољене само у низовима. Ундефинед Бехавиор Санитизер у режиму „-фсанитизе=поинтер-оверфлов“ сада хвата случајеве као што је додавање помака различитог од нуле нултом показивачу или креирање нулте показивача приликом одузимања целог броја од показивача који није нула.
  • Режим „-фсанитизе=имплицит-цонверсион“ (Имплицит Цонверсион Санитизер) је прилагођен да идентификује проблеме са операцијама повећања и смањења за типове чија је величина бита мања од оне типа „инт“.
  • Када изаберете к86 циљну архитектуру "-марцх=скилаке-авк512", "-марцх=ицелаке-цлиент", "-марцх=ицелаке-сервер", "-марцх=цасцаделаке" и "-марцх=цооперлаке" подразумевано у векторизованој код је престао да користи 512-битне змм регистре, осим њихове директне индикације у изворном коду. Разлог је тај што се фреквенција процесора смањује приликом извођења 512-битних операција, што може негативно утицати на укупне перформансе. Да бисте променили ново понашање, обезбеђена је опција „-мпрефер-вецтор-видтх=512“.
  • Понашање заставице "-флак-вецтор-цонверсионс" је слично ГЦЦ-у: имплицитне конверзије битова вектора између целобројних вектора и вектора са покретним зарезом су забрањене. Да би се елиминисало ово ограничење, предлаже се употреба заставе
    "-флак-вецтор-цонверсионс=алл" што је подразумевано.

  • Побољшана подршка за МИПС процесоре из породице Оцтеон. Додан "оцтеон+" на листу важећих типова процесора.
  • Приликом склапања у ВебАссембли средњи код, аутоматски се позива васм-опт оптимизатор, ако је доступан у систему.
  • За системе засноване на РИСЦ-В архитектури, употреба регистара који чувају вредности с помичним зарезом је дозвољена у условним блоковима асемблерских инлине уметака.
  • Додате нове заставице компајлера: "-фгнуц-версион" за постављање вредности верзије за "__ГНУЦ__" и сличне макрое; "-фмацро-префик-мап=ОЛД=НЕВ" за замену префикса директоријума ОЛД са НЕВ у макроима као што је "__ФИЛЕ__"; "-фпатцхабле-фунцтион-ентри=Н[,М]" за генерисање одређеног броја НОП инструкција пре и после тачке улаза функције. За РИСЦ-В
    додата подршка за заставице "-ффикед-кКс", "-мцмодел=медани" и "-мцмодел=медлов".

  • Додата подршка за „__аттрибуте__((таргет(“бранцх-протецтион=..."))) атрибут, чији је ефекат сличан опцији -мбранцх-заштита.
  • На Виндовс платформи, када се специфицира „-цфгуард” заставица, имплементирана је замена провера интегритета тока извршавања (Цонтрол Флов Гуард) за индиректне позиве функција. Да бисте онемогућили замену провера, можете користити ознаку „-цфгуард-ноцхецкс“ или модификатор „__децлспец(гуард(ноцф))“.
  • Понашање атрибута гну_инлине је слично ГЦЦ-у у случајевима када се користи без кључне речи „ектерн“.
  • Могућности повезане са ОпенЦЛ и ЦУДА подршком су проширене. Додата подршка за нове функције ОпенМП 5.0.
  • Додата је опција Стандард у помоћни програм цланг-формат, који вам омогућава да одредите верзију Ц++ стандарда који се користи приликом рашчлањивања и форматирања кода (Најновије, Аутоматски, ц++03, ц++11, ц++14, ц++17, ц++20).
  • Нове провере су додате у статички анализатор: алпха.цплусплус.ПлацементНев да би се утврдило да ли има довољно простора за складиштење, фуцхсиа.ХандлеЦхецкер за откривање цурења везаних за Фуцхсиа руковаоце, сецурити.инсецуреАПИ.децодеВалуеОфОбјЦТипе за откривање потенцијалних прекорачења бафера када се користи [НСаЦТЦоедер дефцодеВ :ат:] .
  • Ундефинед Бехавиор Санитизер (УБСан) је проширио своје провере прекорачења показивача како би ухватио примену помака који нису нула на НУЛЛ показиваче или резултирајуће додавање НУЛЛ померања показивача.
  • У линтеру звекет-уредно додао је велики део нових чекова.

Главни иновације ЛЛВМ 10.0:

  • До оквира Аттрибутор Додате су нове интерпроцедуралне оптимизације и анализатори. Предвиђено је стање 19 различитих атрибута, укључујући 12 атрибута 12 ЛЛВМ ИР и 7 апстрактних атрибута као што је животност.
  • Додате нове матричне математичке функције уграђене у компајлер (Интринсицс), које се замењују ефикасним векторским инструкцијама током компилације.
  • Бројна побољшања су направљена на позадинским површинама за архитектуре Кс86, ААрцх64, АРМ, СистемЗ, МИПС, АМДГПУ и ПоверПЦ. Додата подршка за ЦПУ
    Цортек-А65, Цортек-А65АЕ, Неоверсе Е1 и Неоверсе Н1. За АРМв8.1-М оптимизован је процес генерисања кода (на пример, појавила се подршка за петље са минималним трошковима) и додата је подршка за аутовекторизацију помоћу МВЕ екстензије. Побољшана подршка за ЦПУ МИПС Оцтеон. За ПоверПЦ је омогућена векторизација математичких потпрограма помоћу библиотеке МАССВ (Матхематицал Аццелератион СубСистем), генерисање кода је побољшано, а приступ меморији из петљи је оптимизован. За к86, руковање типовима вектора в2и32, в4и16, в2и16, в8и8, в4и8 и в2и8 је промењено.

  • Побољшан генератор кода за ВебАссембли. Додата подршка за ТЛС (Тхреад-Лоцал Стораге) и атомиц.фенце упутства. СИМД подршка је значајно проширена. ВебАссембли објектне датотеке сада имају могућност коришћења потписа функција са више вредности.
  • Анализатор се користи приликом обраде петљи МемориССА, који вам омогућава да дефинишете зависности између различитих меморијских операција. МемориССА може смањити време компилације и извршавања или се може користити уместо АлиасСетТрацкер-а без губитка перформанси.
  • ЛЛДБ дебагер је значајно побољшао подршку за ДВАРФ в5 формат. Побољшана подршка за изградњу са МинГВ
    и додата је иницијална могућност отклањања грешака у Виндовс извршним датотекама за АРМ и АРМ64 архитектуре. Додати су описи опција које се нуде приликом аутоматског довршавања уноса притиском на таб.

  • Проширен ЛЛД линкер могућности. Побољшана подршка за ЕЛФ формат, укључујући пуну компатибилност глоб шаблона са ГНУ линкером, додата подршка за компримоване одељке за отклањање грешака „.здебуг“, додато својство ПТ_ГНУ_ПРОПЕРТИ за дефинисање одељка .ноте.гну.проперти (може се користити у будућем Линук-у језгра),
    Имплементирани су режими “-з носепарате-цоде”, “-з сепарате-цоде” и “-з сепарате-лоадабле-сегментс”. Побољшана подршка за МинГВ и ВебАссембли.

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

Додај коментар