LLVM 15.0 compiler suite ကို ဖြန့်ချိသည်။

ဖွံ့ဖြိုးတိုးတက်မှု ခြောက်လအကြာတွင်၊ LLVM 15.0 ပရောဂျက်ကို ထုတ်လွှင့်ပြသခဲ့သည် - GCC-သဟဇာတဖြစ်သော ကိရိယာတန်ဆာပလာများ (compilers၊ optimizers နှင့် code generators) သည် ပရိုဂရမ်များကို RISC ကဲ့သို့သော အလယ်အလတ်ဘစ်ကုဒ်အဖြစ် စုစည်းထားသော RISC ကဲ့သို့သော virtual ညွှန်ကြားချက်များ (အဆင့်နိမ့် virtual machine တစ်ခုပါရှိသော၊ Multi-level optimization စနစ်)။ ထုတ်လုပ်လိုက်သော pseudocode ကို JIT compiler သုံးပြီး ပရိုဂရမ်ကို လုပ်ဆောင်သည့်အချိန်တွင် တိုက်ရိုက် စက်ညွှန်ကြားချက်များအဖြစ် ပြောင်းလဲနိုင်သည်။

Clang 15.0 တွင် အဓိကတိုးတက်မှုများ-

  • x86 ဗိသုကာကိုအခြေခံသည့်စနစ်များအတွက်၊ function မှထိန်းချုပ်မှုမပြန်မီတွင် "-fzero-call-used-regs" အလံကိုထည့်သွင်းထားပြီး၊ လုပ်ဆောင်ချက်တွင်အသုံးပြုသည့် CPU မှတ်ပုံတင်မှုများအားလုံးကို သုညသို့ပြန်လည်သတ်မှတ်ထားကြောင်းသေချာစေပါသည်။ ဤရွေးချယ်မှုသည် သင့်အား လုပ်ဆောင်ချက်များမှ အချက်အလက်များ ယိုစိမ့်ခြင်းမှ ကာကွယ်နိုင်ပြီး ROP (Return-Oriented Programming) gadget များကို တည်ဆောက်ရန်အတွက် သင့်လျော်သော block အရေအတွက်ကို ခန့်မှန်းခြေ 20% ဖြင့် လျှော့ချနိုင်စေပါသည်။
  • C ကုဒ်အတွက် တည်ဆောက်ပုံများ၏ မှတ်ဉာဏ်နေရာချထားမှုကို ကျပန်းပြုလုပ်ခြင်းအား လုပ်ဆောင်ပြီးဖြစ်ပြီး အားနည်းချက်များကို အသုံးချသည့်အခါတွင် ဖွဲ့စည်းပုံများမှ အချက်အလက်များကို ထုတ်ယူခြင်းကို ရှုပ်ထွေးစေပါသည်။ ကျပန်းပြုလုပ်ခြင်းကို randomize_layout နှင့် no_randomize_layout attributes များအသုံးပြု၍ ဖွင့်ပိတ်ပိတ်လိုက်ပြီး "-frandomize-layout-seed" သို့မဟုတ် "-frandomize-layout-seed-file" အလံကို အသုံးပြု၍ မျိုးစေ့တစ်ခုသတ်မှတ်ရန် လိုအပ်ပါသည်။
  • "-fstrict-flex-arrays=" အလံကို ထည့်သွင်းခဲ့သည်။ "ဖွဲ့စည်းတည်ဆောက်ပုံများတွင် လိုက်လျောညီထွေရှိသော array ဒြပ်စင်အတွက် နယ်နိမိတ်များကို သင်ထိန်းချုပ်နိုင်သည့် (Flexible Array Members၊ ဖွဲ့စည်းပုံ၏အဆုံးတွင် အကန့်အသတ်မရှိအရွယ်အစားရှိသော array တစ်ခု)။ 0 (ပုံသေ) ဟု သတ်မှတ်သောအခါ၊ ခင်းကျင်းမှုတစ်ခုနှင့် တည်ဆောက်မှု၏ နောက်ဆုံးဒြပ်စင်ကို လိုက်လျောညီထွေရှိသော ခင်းကျင်းတစ်ခုအဖြစ် အမြဲလုပ်ဆောင်သည်၊ 1 - အရွယ်အစားများသာ []၊ [0] နှင့် [1] ကို ပြောင်းလွယ်ပြင်လွယ်ရှိသော ခင်းကျင်းတစ်ခုအဖြစ် လုပ်ဆောင်သည်၊ 2 - အရွယ်အစားများသာ [] နှင့် [0] ကို ပြောင်းလွယ်ပြင်လွယ်ရှိသော ခင်းကျင်းတစ်ခုကဲ့သို့ လုပ်ဆောင်သည်။
  • DirectX တွင် အသုံးပြုထားသော C-like language HLSL (High-Level Shader Language) အတွက် စမ်းသပ်မှု ပံ့ပိုးမှု ပေါင်းထည့်ထားသည်။
  • fixed- နှင့် variable-length arrays များနှင့်ဆက်စပ်နေသော မကိုက်ညီသော အငြင်းအခုံကြေငြာချက်များဖြင့် လုပ်ဆောင်ချက်များကို ထပ်လောင်းသတိပေးရန်အတွက် "-Warray-parameter" ကို ထပ်ထည့်ထားပါသည်။
  • MSVC နှင့် တွဲဖက်အသုံးပြုနိုင်မှု ပိုမိုကောင်းမွန်လာသည်။ "#pragma လုပ်ဆောင်ချက်" အတွက် ထပ်လောင်းပံ့ပိုးမှု (ကွန်ပြူတာအား လိုင်းချဲ့ထွင်ခြင်းအစား လုပ်ဆောင်ချက်ခေါ်ဆိုမှုတစ်ခုထုတ်လုပ်ရန် ကွန်ပြူတာအား ညွှန်ကြားသည်) နှင့် "#pragma alloc_text" (MSVC တွင် ပေးထားသည့် လုပ်ဆောင်ချက်ကုဒ်ဖြင့် ကဏ္ဍအမည်ကို သတ်မှတ်သည်)။ MSVC-သဟဇာတဖြစ်သော /JMC နှင့် /JMC အလံများအတွက် ပံ့ပိုးမှု ပေါင်းထည့်ထားသည်။
  • အလုပ်သည် အနာဂတ် C2X နှင့် C++23 စံနှုန်းများကို ဆက်လက်ပံ့ပိုးပေးပါသည်။ C ဘာသာစကားအတွက်၊ အောက်ပါတို့ကို အကောင်အထည်ဖော်သည်- noreturn ရည်ညွှန်းချက်၊ သော့ချက်စာလုံးများ မှားယွင်းပြီး အမှန်၊ ပေးထားသော ဘစ်အတိမ်အနက်တစ်ခုအတွက် _BitInt(N) အမျိုးအစား၊ *_WIDTH မက်ခရို၊ UTF-8 ကုဒ်ဝှက်ထားသော စာလုံးများအတွက် u8 ရှေ့ဆက်။

    C++ အတွက်၊ အောက်ပါတို့ကို အကောင်အထည်ဖော်သည်- မော်ဂျူးပေါင်းစည်းခြင်း၊ လုပ်ဆောင်ချက်အဖွဲ့ဝင်များ၏ ABI အထီးကျန်ခြင်း၊ မော်ဂျူးများတွင် ဒေသဆိုင်ရာမပြောင်းလဲနိုင်သော ကိန်းရှင်များကို တက်ကြွစွာ အစပြုခြင်း၊ ဘက်ပေါင်းစုံ အညွှန်းအော်ပရေတာများ၊ အော်တို(x)၊ ပကတိမဟုတ်သော ကိန်းရှင်များ၊ goto နှင့် constexpr အဖြစ် ကြေညာထားသော လုပ်ဆောင်ချက်များတွင် အညွှန်းများ လွတ်ကင်းသော အက္ခရာများဟု ပိုင်းခြားထားသော လွတ်မြောက်မှု အစီအစဉ်များ။

  • OpenCL နှင့် OpenMP ပံ့ပိုးမှုတို့နှင့် ဆက်စပ်နေသော စွမ်းရည်များကို တိုးချဲ့ထားသည်။ OpenCL တိုးချဲ့မှု cl_khr_subgroup_rotate အတွက် ပံ့ပိုးမှု ထပ်ထည့်ထားသည်။
  • x86 ဗိသုကာအတွက်၊ ခြွင်းချက်မရှိ ရှေ့သို့ခုန်ခြင်းလုပ်ဆောင်ပြီးနောက် ခြွင်းချက်မရှိ ရှေ့သို့ခုန်ခြင်းလုပ်ဆောင်ပြီးနောက် ညွှန်ကြားချက်များကို မှန်းဆလုပ်ဆောင်ခြင်းကြောင့် ဖြစ်ပေါ်လာသော ပရိုဆက်ဆာများတွင် အားနည်းချက်များကို အကာအကွယ်ထည့်သွင်းထားသည်။ မှတ်ဉာဏ်ရှိ ဌာနခွဲညွှန်ကြားချက်များ (SLS၊ Straight Line Speculation) အပြီးတွင် ညွှန်ကြားချက်များကို ကြိုတင်လုပ်ဆောင်ခြင်းများကြောင့် ပြဿနာ ဖြစ်ပေါ်သည်။ အကာအကွယ်ကိုဖွင့်ရန်၊ “-mharden-sls=[none|all|return|indirect-jmp]” ရွေးချယ်မှုကို အဆိုပြုထားသည်။
  • SSE2 တိုးချဲ့မှုကို ပံ့ပိုးပေးသည့် ပလပ်ဖောင်းများအတွက်၊ AVX16-FP512 ညွှန်ကြားချက်များကို ပံ့ပိုးမှုမရှိသောအခါတွင် float အမျိုးအစားကို အသုံးပြု၍ _Float16 အမျိုးအစားကို ထည့်သွင်းထားပါသည်။
  • AMD Zen2 ပရိုဆက်ဆာများဖြင့် စတင်အသုံးပြုနိုင်သော RDPRU ညွှန်ကြားချက်အသုံးပြုမှုကို ထိန်းချုပ်ရန် "-m[no-]rdpru" အလံကို ပေါင်းထည့်ထားသည်။
  • သွယ်ဝိုက်သောအကိုင်းအခက်များအတွက် မှန်းဆလုပ်ဆောင်မှု ယန္တရား၏ပါဝင်ပတ်သက်မှုမှမပါဝင်သည့် ညွှန်ကြားချက်များ အတွဲလိုက်ထည့်ခြင်းဖြင့် အလုပ်လုပ်သော RETBLEED အားနည်းချက်ကို ကာကွယ်ရန် "-mfunction-return=thunk-extern" အလံကို ပေါင်းထည့်ထားသည်။

LLVM 15.0 တွင် အဓိက တီထွင်ဆန်းသစ်မှုများ-

  • Cortex-M85 CPU၊ Armv9-A၊ Armv9.1-A နှင့် Armv9.2-A ဗိသုကာများ၊ Armv8.1-M PACBTI-M တိုးချဲ့မှုများကို ပံ့ပိုးပေးထားသည်။
  • DirectX အရိပ်အာဝါသအတွက် အသုံးပြုသည့် DXIL (DirectX Intermediate Language) ဖော်မတ်ကို ပံ့ပိုးပေးသည့် DirectX အတွက် စမ်းသပ်မှု နောက်ခံကို ပေါင်းထည့်ထားပါသည်။ စုဝေးစဉ်အတွင်း “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” ပါရာမီတာကို သတ်မှတ်ခြင်းဖြင့် နောက်ခံကို ဖွင့်ထားသည်။
  • Libc++ သည် “ဖော်မတ်” စာကြည့်တိုက်၏ အကောင်အထည်ဖော်မှု ပြီးစီးမှုနှင့် “အပိုင်းအခြားများ” စာကြည့်တိုက်၏ အဆိုပြုထားသော စမ်းသပ်ဗားရှင်းအပါအဝင် C++20 နှင့် C++2b စံနှုန်းအသစ်များကို ဆက်လက်အကောင်အထည်ဖော်လျက်ရှိသည်။
  • x86၊ PowerPC နှင့် RISC-V ဗိသုကာများ အတွက် ပိုမိုကောင်းမွန်သော နောက်ခံများ။
  • LLD linker နှင့် LLDB debugger ၏စွမ်းရည်များကို မြှင့်တင်ထားပါသည်။

source: opennet.ru

မှတ်ချက် Add