LLVM 11.0 хөрвүүлэгчийн багцыг гаргасан

Зургаан сарын хөгжлийн дараа танилцуулсан төслийн хувилбар LLVM 11.0 — GCC-тэй нийцтэй хэрэгслүүд (эмхэтгэгчид, оновчтой болгогчид болон код үүсгэгчид), програмуудыг RISC-тэй төстэй виртуал зааврын завсрын бит код болгон хөрвүүлэх (олон түвшний оновчлолын систем бүхий доод түвшний виртуал машин). Үүсгэсэн псевдокодыг JIT хөрвүүлэгч ашиглан программыг гүйцэтгэх үед шууд машины заавар болгон хувиргаж болно.

Шинэ хувилбарын гол өөрчлөлт нь оруулсан явдал байв Жигүүр, Фортран хэлний урд тал. Flang нь Fortran 2018, OpenMP 4.5 болон OpenACC 3.0-ийг дэмждэг боловч төслийн боловсруулалт хараахан дуусаагүй байгаа бөгөөд урд тал нь код задлан шинжлэх, зөв ​​эсэхийг шалгахаар хязгаарлагддаг. LLVM завсрын кодыг үүсгэх хараахан дэмжигдээгүй байгаа бөгөөд гүйцэтгэх боломжтой файлуудыг үүсгэхийн тулд каноник кодыг үүсгэн гадаад Fortran хөрвүүлэгч рүү дамжуулдаг.

Сайжруулалт Clang 11.0 дээр:

  • Хийсвэр синтакс модыг сэргээх чадварыг нэмсэн (AST) эвдэрсэн C++ кодын хувьд алдааг оношлоход ашиглаж болох ба clang-tidy, clangd гэх мэт гадны хэрэгслүүдэд нэмэлт мэдээлэл өгдөг. Энэ функц нь 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 толгой файлуудад тодорхойлсон.
  • Нэмсэн _ExtInt(N) өргөтгөсөн бүхэл тоон төрлүүдийн багц нь FPGA/HLS дээр үр ашигтай боловсруулах боломжтой хоёрын үржвэр биш төрлүүдийг үүсгэх боломжийг олгодог. Жишээ нь, _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 макро нь AArch64 кодыг үүсгэх үед "-march=armv8-a+sve" командын мөрийн сонголтыг тохируулснаар тодорхойлогддог.

  • Одоо "-O" тугийг "-O1"-ийн оронд "-O2" оновчтой болгох горимоор тодорхойлсон.
  • Шинэ хөрвүүлэгчийн тугуудыг нэмсэн:
    • "-fstack-clash-protection" - хамгаалалтыг идэвхжүүлдэг стек ба овоолгын огтлолцол.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - хөвөгч цэгийн тоонуудад онцгой тохиолдлын зохицуулагчийн горимыг сонгох боломжийг танд олгоно.
    • "-ffp-model={precise,strict,fast}" - Хөвөгч цэгийн тоонуудын тусгайлсан сонголтуудын цувралд хандах хандалтыг хялбаршуулдаг.
    • "-fpch-codegen" болон "-fpch-debuginfo" нь код болон дибаг мэдээллийн тусдаа объект файл бүхий урьдчилан эмхэтгэсэн толгой (PCH) үүсгэх.
    • "-fsanitize-coverage-allowlist" болон "-fsanitize-coverage-blocklist" нь хамрах хүрээний тестийн цагаан болон хар жагсаалтыг шалгахад зориулагдсан.
    • TLS (thread-local storage) хэмжээг сонгохын тулд "-mtls-size={12,24,32,48}".
    • Туршилтын RISC-V өргөтгөлүүдийг идэвхжүүлэхийн тулд "-menable-experimental-extension".
  • Си хэлний анхдагч горим нь "-fno-common" бөгөөд энэ нь зарим платформ дээрх глобал хувьсагчдад илүү үр дүнтэй хандах боломжийг олгодог.
  • Өгөгдмөл модулийн кэшийг /tmp-аас ~/.cache сан руу шилжүүлсэн. Дарахын тулд та “-fmodules-cache-path=” тугийг ашиглаж болно.
  • Анхдагч Си хэлний стандартыг gnu11-ээс gnu17 болгон шинэчилсэн.
  • GNU C өргөтгөлийн урьдчилсан дэмжлэгийг нэмсэн "asm inline» ассемблерийн оруулга нэмэх. Өргөтгөлд дүн шинжилгээ хийж байгаа боловч ямар ч байдлаар боловсруулаагүй байна.
  • OpenCL болон CUDA-ийн дэмжлэгтэй холбоотой боломжуудыг өргөжүүлсэн. OpenCL 2.0 блокийн оношлогооны дэмжлэгийг нэмж, OpenMP 5.0-ийн шинэ функцуудыг хэрэгжүүлсэн.
  • Extern "C" болон extern "C++" блокуудын хооронд зэрэгцүүлэхийн тулд clang форматын хэрэгсэлд IndentExternBlock сонголтыг нэмсэн.
  • Статик анализатор нь C++ хэл дээр удамшсан констракторуудтай ажиллах чадварыг сайжруулсан. Түгжээ байгаа эсэхийг шалгах alpha.core.C11Lock болон alpha.fuchsia.Lock, putenv-ийн аюултай хэрэглээг илрүүлэх alpha.security.cert.pos.34c, webkit.NoUncountedMemberChecker болон webkit.RefCntblBaseVirtualDtor, alha-тай холбоотой асуудлуудыг илрүүлэх шинэ чекүүд нэмэгдсэн. .cplusplus .SmartPtr нь ухаалаг заагчийн утгыг шалгах.
  • In linter clang-эмх цэгцтэй нэмсэн шинэ чекүүдийн ихээхэн хэсэг.
  • Clangd кэш сервер (Clang Server) нь гүйцэтгэлийг сайжруулж, оношилгооны шинэ боломжуудыг нэмсэн.

Үндсэн инноваци LLVM 11.0:

  • Бүтээлийн системийг Python 3 ашиглах руу шилжүүлсэн. Хэрэв Python 3 байхгүй бол Python 2 руу буцах боломжтой.
  • Go хэлний (llgo) хөрвүүлэгчтэй нүүр хэсэг нь энэ хувилбараас хасагдсан бөгөөд ирээдүйд бүтцийн өөрчлөлт хийх боломжтой.
  • Завсрын дүрслэлд (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 (Ачааллын үнэ цэнийн тарилга), мөн CPU дээрх үйлдлүүдийн таамаглалаас үүдэлтэй халдлагуудыг хаахын тулд ерөнхий таамаглалын гүйцэтгэлийн гаж нөлөөг дарах механизмыг хэрэгжүүлдэг.
  • SystemZ архитектурын арын хэсэгт MemorySanitizer болон LeakSanitizer-ийн дэмжлэг нэмэгдсэн.
  • Libc++-д математикийн тогтмолууд бүхий толгой файлын дэмжлэгийг нэмсэн .
  • Өргөтгөсөн LLD холбогчийн чадвар. "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", "сонголтуудыг багтаасан ELF форматын сайжруулсан дэмжлэг. -thinlto- single-module", "-unique", "-rosegment", "-threads=N". Файл руу ул мөрийг хадгалах "--time-trace" сонголтыг нэмсэн бөгөөд дараа нь Chrome дахь chrome://tracing интерфейсээр дамжуулан дүн шинжилгээ хийх боломжтой.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх