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

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

LLVM 10.0-ийн шинэ боломжууд нь C++ Concepts-ийн дэмжлэг, Clang-г тусдаа процесс болгон ажиллуулахаа больсон, Windows-ийн CFG (control flow guard) шалгалтыг дэмжих, 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++ 99-д тохирохгүй тохиолдолд C20 эхлүүлэгчийг C++ горимд ашиглахгүй байхыг анхааруулж байна.
    • "-Wsizeof-array-div" - "int arr[10] гэх мэт нөхцөл байдлыг барьж авдаг; …sizeof(arr) / sizeof(short)…” (“sizeof(arr) / sizeof(int)” байх ёстой).
    • "-Wxor-used-as-po" - экспоненциал (2^16)-тай андуурч болох үйлдлүүдэд "^" (xor) операторыг ашиглах зэрэг бүтцийг ашиглахаас сэрэмжлүүлдэг.
    • "-Wfinal-dtor-non-final-class" - "эцсийн" тодорхойлогчоор тэмдэглэгдээгүй, харин "эцсийн" шинж чанартай устгагчтай ангиудын талаар анхааруулдаг.
    • "-Wtautological-bitwise-compare" нь битийн үйлдэл ба тогтмол тоонуудын хоорондох тавтологийн харьцуулалтыг оношлох, сөрөг бус тоонд битийн OR үйлдлийг ашигласан үргэлж үнэн харьцуулалтыг тодорхойлоход зориулагдсан анхааруулгын бүлэг юм.
    • "-Wbitwise-нөхцөлт-хаалт" нь AND (&) ба OR (|) логик операторуудыг нөхцөлт оператортой (?:) холих үед гарч болзошгүй асуудлуудыг анхааруулж байна.
    • "-Wmisleading-indentation" нь GCC-ийн ижил нэртэй чекийн аналог бөгөөд доголтой илэрхийллүүдийг if/else/for/while блокийн хэсэг мэт сануулдаг боловч үнэндээ тэдгээр нь энэ блокт ороогүй болно. .
    • "-Wextra"-г зааж өгөхдөө "-Wdeprecated-copy" шалгахыг идэвхжүүлж, бүтээгчийг ашиглахыг анхааруулж байна.
      Тодорхой устгагч тодорхойлолт бүхий ангиудад "зөөх" болон "хуулбарлах".

    • "-Wtautological-давхцах-харьцуулах", "-Wsizeof-заагч-div", "-Wtautological-харьцуулах", "-Wrange-loop-analysis" шалгалтуудыг өргөтгөсөн.
    • "-Wbitwise-op-haaltheses" болон "-Wlogical-op-haaltheses" шалгах нь анхдагчаар идэвхгүй байна.
  • C болон C++ кодуудад заагчийн арифметик үйлдлүүдийг зөвхөн массивуудад зөвшөөрдөг. "-fsanitize=заагч-халих" горим дахь тодорхойгүй зан үйлийн ариутгагч нь тэг биш заагчаас бүхэл тоог хасах үед тэгээс өөр офсет нэмэх эсвэл тэг заагч үүсгэх зэрэг тохиолдлуудыг барьж авдаг.
  • "-fsanitize=idplicit-conversion" (Далд хөрвүүлэлтийн ариутгагч) горим нь "int" төрлийнхөөс битийн хэмжээ багатай төрлүүдийг нэмэгдүүлэх, багасгах үйлдлүүдтэй холбоотой асуудлуудыг тодорхойлоход тохируулагдсан.
  • X86 зорилтот архитектурыг сонгохдоо "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" болон "-march=cooperlake" гэсэн үндсэн тохиргоог векторжуулсан The код нь 512 битийн zmm регистрүүдийг эх кодод шууд зааснаас бусад тохиолдолд ашиглахаа больсон. Үүний шалтгаан нь 512 битийн үйлдлийг гүйцэтгэх үед CPU-ийн давтамж буурч, ерөнхий гүйцэтгэлд сөргөөр нөлөөлдөг. Шинэ зан төлөвийг өөрчлөхийн тулд "-mprefer-vector-width=512" гэсэн сонголтыг өгсөн.
  • "-маалинга-вектор-хувиргах" тугийн үйлдэл нь GCC-тэй төстэй: бүхэл тоо ба хөвөгч цэгийн векторуудын хооронд далд вектор бит хувиргахыг хориглоно. Энэ хязгаарлалтыг арилгахын тулд тугийг ашиглахыг санал болгож байна
    "-Flax-vector-conversions=all" нь анхдагч юм.

  • Octeon гэр бүлийн MIPS CPU-ийн сайжруулсан дэмжлэг. Хүчинтэй CPU төрлүүдийн жагсаалтад "octeon+" нэмсэн.
  • WebAssembly завсрын код руу угсрах үед системд байгаа бол wasm-opt optimizer автоматаар дуудагдана.
  • RISC-V архитектурт суурилсан системүүдийн хувьд хөвөгч цэгийн утгыг хадгалдаг регистрийг ассемблерийн шугамын оруулгын нөхцөлт блокуудад ашиглахыг зөвшөөрдөг.
  • Шинэ хөрвүүлэгчийн тугуудыг нэмсэн: "__GNUC__" болон ижил төстэй макроны хувилбарын утгыг тохируулах "-fgnuc-version"; "__FILE__" гэх мэт макронуудын хуучин лавлах угтварыг ШИНЭ гэж солих "-fmacro-prefix-map=OLD=NEW"; "-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-format хэрэгсэлд стандарт сонголтыг нэмсэн бөгөөд энэ нь кодыг задлан шинжилж, форматлахад ашигладаг C++ стандартын хувилбарыг тодорхойлох боломжийг олгодог (Сүүлийн, Авто, c++03, c++11, c++14, c++17, c++20).
  • Статик анализаторт шинэ шалгалтууд нэмэгдсэн: хангалттай хадгалах зай байгаа эсэхийг тодорхойлох alpha.cplusplus.PlacementNew, Fuchsia зохицуулагчтай холбоотой алдагдлыг илрүүлэх fuchsia.HandleChecker, [buffer overflowderjpey-ийг ашиглах үед security.insecureAPI.decodeValueOfObjCType. :at:] .
  • Тодорхойгүй зан үйлийг ариутгагч (UBSan) нь NULL заагч руу тэгээс өөр офсет хэрэглэх эсвэл NULL заагч офсетийг нэмэхийн тулд заагч халих шалгалтаа өргөжүүлсэн.
  • In linter clang-эмх цэгцтэй нэмсэн шинэ чекүүдийн ихээхэн хэсэг.

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

  • Хүрээ рүү Атрибут Процедур хоорондын шинэ оновчлол, анализатор нэмэгдсэн. 19 шинж чанар 12 LLVM IR, амьд байдал зэрэг 12 хийсвэр шинж чанар зэрэг 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 холбогчтой glob загваруудын бүрэн нийцтэй байдлыг хангах, ".zdebug" шахагдсан дибаг хийх хэсгүүдэд дэмжлэг үзүүлэх, .note.gnu.property хэсгийг тодорхойлохын тулд PT_GNU_PROPERTY өмчийг нэмэх зэрэг ELF форматын сайжруулсан дэмжлэг (цаашид ашиглах боломжтой) Linux цөмүүд),
    “-z noseparate-code”, “-z тусдаа код”, “-z тусдаа-ачаалах-segments” горимуудыг хэрэгжүүлсэн. MinGW болон WebAssembly-д зориулсан сайжруулсан дэмжлэг.

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

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