LLVM 10.0 компиляторлар жинағының шығарылымы

Алты айлық дамудан кейін ұсынылды жобаның шығарылымы LLVM 10.0 — GCC-үйлесімді құралдар (компиляторлар, оңтайландырушылар және код генераторлары), бағдарламаларды RISC-тәрізді виртуалды нұсқаулардың аралық бит-кодына құрастыру (көп деңгейлі оңтайландыру жүйесі бар төмен деңгейлі виртуалды машина). Жасалған псевдокодты JIT компиляторының көмегімен бағдарламаны орындау кезінде тікелей машиналық нұсқауларға түрлендіруге болады.

LLVM 10.0 жаңа мүмкіндіктеріне C++ Concepts қолдауы кіреді, енді 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" - экспоненциациямен шатастыруға болатын операцияларда "^" (xor) операторын пайдалану сияқты құрылымдарды пайдаланудан сақтандырады (2^16).
    • «-Wfinal-dtor-non-final-class» - «соңғы» спецификаторымен белгіленбеген, бірақ «соңғы» атрибуты бар деструкторы бар сыныптар туралы ескертеді.
    • "-Wtautological-bitwise-compare" - биттік операция мен тұрақты арасындағы тавтологиялық салыстыруларды диагностикалауға және биттік НЕМЕСЕ операциясы теріс емес санға қолданылатын әрқашан ақиқат салыстыруларды анықтауға арналған ескертулер тобы.
    • "-Wbitwise-шартты-жақшалар" логикалық AND (&) және НЕМЕСЕ (|) операторларын шартты оператормен (?:) араластыру кезіндегі проблемалар туралы ескертеді.
    • “-Wmisleading-indentation” – GCC-тен аттас тексерудің аналогы, ол шегініс өрнектері туралы олар if/else/for/while блогының бөлігі сияқты ескертеді, бірақ іс жүзінде олар бұл блокқа кірмейді. .
    • “-Wextra” параметрін көрсеткенде, конструкторларды пайдалану туралы ескертетін “-Wdeprecated-copy” тексеруі қосылады.
      анық деструктор анықтамасы бар сыныптарда «жылжыту» және «көшіру».

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

  • Octeon отбасының MIPS процессорларына қолдау жақсартылған. Жарамды CPU түрлерінің тізіміне "octeon+" қосылды.
  • WebAssembly аралық кодына жинақтау кезінде, жүйеде қолжетімді болса, wasm-opt оңтайландырғышы автоматты түрде шақырылады.
  • RISC-V архитектурасына негізделген жүйелер үшін ассемблердің кірістірілген кірістірулерінің шартты блоктарында өзгермелі нүкте мәндерін сақтайтын регистрлерді пайдалануға рұқсат етіледі.
  • Жаңа компилятор жалаушалары қосылды: "__GNUC__" және ұқсас макростар үшін нұсқа мәнін орнату үшін "-fgnuc-version"; "-fmacro-prefix-map=OLD=NEW" каталог префиксін "__FILE__" сияқты макростарда ЖАҢА дегенге OLD дегенге ауыстыру үшін; "-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++ стандартының нұсқасын анықтауға мүмкіндік береді (Соңғы, Авто, 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 дерексіз атрибут.
  • Компиляторға енгізілген жаңа матрицалық математикалық функциялар қосылды (Ішкі қасиеттері), олар компиляция кезінде тиімді векторлық нұсқаулармен ауыстырылады.
  • 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 (Математикалық жеделдету ішкі жүйесі) кітапханасын пайдаланып математикалық ішкі бағдарламаларды векторлау қосылды, код генерациясы жақсартылды және циклдардан жадқа кіру оңтайландырылды. 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 байланыстырушы мүмкіндіктері. GNU сілтемесімен глоб үлгілерінің толық үйлесімділігін қамтамасыз етуді қоса, .note.gnu.property бөлімін анықтау үшін PT_GNU_PROPERTY сипатын қосу, ".zdebug" қысылған жөндеу бөлімдерін қолдауды қоса алғанда, ELF пішіміне арналған жақсартылған қолдау (болашақта пайдалануға болады). Linux ядролары),
    «-z мұрындық-код», «-z бөлек-код» және «-z бөлек жүктелетін сегменттер» режимдері іске асырылды. MinGW және WebAssembly үшін жақсартылған қолдау.

Ақпарат көзі: opennet.ru

пікір қалдыру