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

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

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

Жақсартулар Clang 11.0 нұсқасында:

  • Абстрактілі синтаксис ағашын қалпына келтіру мүмкіндігі қосылды (AST) қателерді диагностикалауға көмектесетін және clang-tidy және clangd сияқты сыртқы утилиталарға қосымша ақпаратты беретін сынған C++ коды үшін. Мүмкіндік әдепкі бойынша C++ коды үшін қосылады және "-Xclang -f[no-]recovery-ast" опциялары арқылы басқарылады.
  • Жаңа диагностикалық режимдер қосылды:
    • “-Wpointer-to-int-cast” – барлық мүмкін мәндерді сыйдыра алмайтын int бүтін түріндегі көрсеткіштерді шығару туралы ескертулер тобы.
    • “-Wuninitialized-const-reference” – “const” атрибуты бар анықтамалық аргументтерді қабылдайтын функция параметрлерінде инициализацияланбаған айнымалы мәндерді беру туралы ескерту.
    • "-Wimplicit-const-int-float-conversion" - нақты тұрақтыны бүтін түрге жасырын түрлендіру туралы әдепкі ескерту бойынша қосылған.
  • ARM платформасы үшін компиляторға енгізілген C функциялары қамтамасыз етілген (Ішкі қасиеттері), тиімді векторлық нұсқаулармен ауыстырылды Arm v8.1-M MVE және CDE. Қол жетімді функциялар arm_mve.h және arm_cde.h тақырып файлдарында анықталған.
  • Қосылды FPGA/HLS жүйесінде тиімді өңдеуге болатын екінің дәрежелерінің еселігі емес түрлерді жасауға мүмкіндік беретін _ExtInt(N) кеңейтілген бүтін сан түрлерінің жинағы. Мысалы, _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={нақты, қатаң, жылдам}" - өзгермелі нүкте сандары үшін арнайы опциялар сериясына қол жеткізуді жеңілдетеді.
    • "-fpch-codegen" және "-fpch-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=” жалауын пайдалануға болады.
  • Әдепкі C тілінің стандарты gnu11-ден gnu17-ге дейін жаңартылды.
  • GNU C кеңейтімі үшін алдын ала қолдау қосылды.asm кірістірілген» ассемблер кірістірулерін қосу үшін. Кеңейтім әлі де талдануда, бірақ ешқандай жолмен өңделмейді.
  • OpenCL және CUDA қолдауымен байланысты мүмкіндіктер кеңейтілді. OpenCL 2.0 блок диагностикасына қолдау қосылды және жаңа OpenMP 5.0 мүмкіндіктері енгізілді.
  • Extern "C" және extern "C++" блоктарында теңестіру үшін clang пішімінің утилитасына IndentExternBlock опциясы қосылды.
  • Статикалық анализатор C++ тілінде мұраланған конструкторларды өңдеуді жақсартты. Жаңа тексерулер қосылды alpha.core.C11Lock және alpha.fuchsia.Lock құлыптарды тексеру үшін, alpha.security.cert.pos.34c - putenv-ті қауіпті пайдалануды анықтау үшін, webkit.NoUncountedMemberChecker және webkit.RefCntblBaseVirtualDtor, unha-мен ақауларды анықтау үшін .cplusplus .SmartPtr нөлдік смарт көрсеткіш сілтемесін тексеру үшін.
  • In linter clang-жақсы қосылды жаңа чектердің үлкен бөлігі.
  • Clangd кэштеу сервері (Clang Server) өнімділікті жақсартты және жаңа диагностикалық мүмкіндіктерді қосты.

басты инновациялар LLVM 11.0:

  • Құрастыру жүйесі Python 3 нұсқасын пайдалануға ауыстырылды. Егер Python 3 қол жетімді болмаса, Python 2 нұсқасын пайдалануға кері қайтаруға болады.
  • Go тіліне арналған компиляторы бар алдыңғы жақ (llgo) шығарылымнан алынып тасталды, ол болашақта қайта құрылуы мүмкін.
  • Вектор-функция-abi-variant атрибуты шақыруларды векторлау үшін скалярлық және векторлық функциялар арасындағы салыстыруды сипаттау үшін аралық көрініске (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 матрицалық көбейту және RMv8.2-AA32BF16 BFloat16.

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

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

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