LLVM 12.0 கம்பைலர் தொகுப்பின் வெளியீடு

ஆறு மாத வளர்ச்சிக்குப் பிறகு, LLVM 12.0 திட்டத்தின் வெளியீடு வழங்கப்பட்டது - ஒரு GCC-இணக்கமான கருவித்தொகுப்பு (தொகுப்பாளர்கள், மேம்படுத்திகள் மற்றும் குறியீடு ஜெனரேட்டர்கள்) நிரல்களை RISC போன்ற மெய்நிகர் அறிவுறுத்தல்களின் இடைநிலை பிட்கோடில் தொகுக்கிறது (ஒரு குறைந்த-நிலை மெய்நிகர் இயந்திரம் பல நிலை தேர்வுமுறை அமைப்பு). உருவாக்கப்பட்ட சூடோகோட் ஒரு JIT கம்பைலரைப் பயன்படுத்தி நிரல் செயல்படுத்தும் நேரத்தில் நேரடியாக இயந்திர வழிமுறைகளாக மாற்றப்படலாம்.

க்ளாங் 12.0 இல் மேம்பாடுகள்:

  • C++20 தரநிலையில் முன்மொழியப்பட்ட "சாத்தியமான" மற்றும் "சாத்தியமற்ற" பண்புக்கூறுகளுக்கான ஆதரவு முன்னிருப்பாக செயல்படுத்தப்பட்டு இயக்கப்பட்டது, இது நிபந்தனைக்குட்பட்ட கட்டமைப்பைத் தூண்டுவதற்கான நிகழ்தகவு பற்றி உகப்பாக்கிக்குத் தெரிவிக்க அனுமதிக்கிறது (எடுத்துக்காட்டாக, "[[சாத்தியம்" ]] என்றால் (ரேண்டம் > 0) {“).
  • AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) மற்றும் Intel Sapphire Rapids (-march=sapphirerapids) செயலிகளுக்கான ஆதரவு சேர்க்கப்பட்டது.
  • x86-64 கட்டிடக்கலை நிலைகளைத் தேர்ந்தெடுக்க "-march=x234-86-v[64]" கொடிகளுக்கான ஆதரவு சேர்க்கப்பட்டது (v2 - SSE4.2, SSSE3, POPCNT மற்றும் CMPXCHG16B நீட்டிப்புகள்; v3 - AVX2 மற்றும் MOVBE; v4 - AVX-512 ) .
  • Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) மற்றும் Fujitsu A64FX (a64fx) செயலிகளுக்கான ஆதரவு சேர்க்கப்பட்டது. எடுத்துக்காட்டாக, Neoverse-V1 CPUகளுக்கான மேம்படுத்தல்களை இயக்க, நீங்கள் “-mcpu=neoverse-v1” ஐக் குறிப்பிடலாம்.
  • AArch64 கட்டமைப்பிற்கு, "__aarch64_cas8_relax" போன்ற அணு செயல்பாட்டு உதவி செயல்பாடுகளை இயக்க அல்லது முடக்க புதிய கம்பைலர் கொடிகள் "-மவுட்லைன்-அணுவியல்" மற்றும் "-mno-அவுட்லைன்-அணுவியல்" சேர்க்கப்பட்டுள்ளன. LSE (Large System Extensions) ஆதரவு கிடைக்கிறதா என்பதை இயக்க நேரத்தில் இத்தகைய செயல்பாடுகள் கண்டறிந்து, வழங்கப்பட்ட அணு செயலி வழிமுறைகளைப் பயன்படுத்துகின்றன அல்லது ஒத்திசைவுக்கான LL/SC (Load-link/store-conditional) வழிமுறைகளைப் பயன்படுத்துகின்றன.
  • பழைய இணைப்பான் மற்றும் அசெம்பிளர் நடத்தையுடன் இணக்கத்தன்மைக்காக பினுட்டில்ஸ் தொகுப்பின் இலக்கு பதிப்பைத் தேர்ந்தெடுக்க "-fbinutils-version" விருப்பம் சேர்க்கப்பட்டது.
  • ELF இயங்கக்கூடிய கோப்புகளுக்கு, "-gz" கொடி குறிப்பிடப்பட்டால், zlib நூலகத்தைப் பயன்படுத்தி பிழைத்திருத்தத் தகவலின் சுருக்கமானது இயல்புநிலையாக இயக்கப்படும் (gz=zlib). இதன் விளைவாக வரும் பொருள் கோப்புகளை இணைக்க lld அல்லது GNU binutils 2.26+ தேவைப்படுகிறது. பினுட்டில்களின் பழைய பதிப்புகளுடன் இணக்கத்தன்மையை மீட்டெடுக்க, நீங்கள் "-gz=zlib-gnu" ஐக் குறிப்பிடலாம்.
  • 'இந்த' சுட்டி இப்போது பூஜ்யமற்ற மற்றும் dereferenceable(N) காசோலைகளுடன் செயலாக்கப்படுகிறது. நீங்கள் NULL மதிப்புகளைப் பயன்படுத்த வேண்டியிருக்கும் போது, ​​nonnull பண்புக்கூறை அகற்ற, நீங்கள் "-fdelete-null-pointer-checks" விருப்பத்தைப் பயன்படுத்தலாம்.
  • லினக்ஸ் இயங்குதளத்தில், ஜிசிசியில் உள்ளதைப் போல, AArch64 மற்றும் PowerPC கட்டமைப்புகளுக்கு "-fasynchronous-unwind-tables" பயன்முறை இயக்கப்பட்டுள்ளது.
  • "#pragma clang loop vectorize_width" இல் வெக்டரைசேஷன் முறையைத் தேர்ந்தெடுக்க "நிலையான" (இயல்புநிலை) மற்றும் "அளவிடக்கூடிய" விருப்பங்களைக் குறிப்பிடும் திறனைச் சேர்த்தது. "அளவிடக்கூடிய" பயன்முறையானது, திசையன் நீளத்திலிருந்து சுயாதீனமானது, சோதனையானது மற்றும் அளவிடக்கூடிய திசையன்மயமாக்கலை ஆதரிக்கும் வன்பொருளில் பயன்படுத்தப்படலாம்.
  • விண்டோஸ் இயங்குதளத்திற்கான மேம்படுத்தப்பட்ட ஆதரவு: Clang கம்பைலர், எல்எல்டி லிங்கர் மற்றும் கம்பைலர்-ஆர்டி ரன்டைம் லைப்ரரிகள் உட்பட Arm64 கணினிகளில் Windows க்கான அதிகாரப்பூர்வ பைனரி அசெம்பிளிகள் தயார் செய்யப்பட்டுள்ளன. MinGW இலக்கு தளங்களை உருவாக்கும்போது, ​​குறுக்கு-தொகுக்கும் போது கூட, .exe பின்னொட்டு சேர்க்கப்படும்.
  • OpenCL, OpenMP மற்றும் CUDA ஆகியவற்றிற்கான ஆதரவுடன் தொடர்புடைய திறன்கள் விரிவாக்கப்பட்டுள்ளன. OpenCL 3.0 மற்றும் OpenCL 1.0 க்கான மேக்ரோ விருப்பங்களைத் தேர்ந்தெடுக்க "-cl-std=CL3.0" மற்றும் "-cl-std=CL1.0" விருப்பங்கள் சேர்க்கப்பட்டன. கண்டறியும் கருவிகள் விரிவுபடுத்தப்பட்டுள்ளன.
  • சில x86-அடிப்படையிலான செயலிகளில் செயல்படுத்தப்பட்ட HRESET, UINTR மற்றும் AVXVNNI வழிமுறைகளுக்கான ஆதரவு சேர்க்கப்பட்டது.
  • x86 கணினிகளில், "-mtune=" விருப்பத்திற்கான ஆதரவு செயல்படுத்தப்படுகிறது ", "-march= இன் மதிப்பைப் பொருட்படுத்தாமல், தேர்ந்தெடுக்கப்பட்ட மைக்ரோஆர்கிடெக்ச்சுரல் மேம்படுத்தல்களை செயல்படுத்துகிறது. "
  • நிலையான பகுப்பாய்வி சில POSIX செயல்பாடுகளின் செயலாக்கத்தை மேம்படுத்தியுள்ளது மற்றும் ஒப்பீட்டில் பல குறியீட்டு மதிப்புகள் இருக்கும்போது நிபந்தனை செயல்பாடுகளின் முடிவை கணிசமாக மேம்படுத்தியுள்ளது. புதிய காசோலைகள் சேர்க்கப்பட்டுள்ளன: fuchia.HandleChecker (கட்டமைப்புகளில் கையாளுதல்களை வரையறுக்கிறது), webkit.UncountedLambdaCapturesChecker வெப்கிட் மற்றும் alpha.webkit.UncountedLocalVarsChecker (WebKit இன்ஜின் குறியீட்டில் சுட்டிகளுடன் பணிபுரியும் தனித்தன்மைகளை கணக்கில் எடுத்துக்கொள்கிறது).
  • மாறிலிகளின் சூழலில் பயன்படுத்தப்படும் வெளிப்பாடுகளில், உள்ளமைக்கப்பட்ட செயல்பாடுகளின் பயன்பாடு __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bs__prbs, reverse, __bs__prbs, reverse, __bswap64, அனுமதிக்கப்படுகிறது __bswapq , _castf*, __rol* மற்றும் __ror*.
  • அடையாளங்காட்டிகள், நெடுவரிசைகள் மற்றும் புல வரையறைகளைச் சுற்றியுள்ள இடைவெளியைத் தேர்ந்தெடுக்க, clang-format பயன்பாட்டிற்கு BitFieldColonSpacing விருப்பம் சேர்க்கப்பட்டது.
  • லினக்ஸ் இயங்குதளத்தில் உள்ள clangd கேச்சிங் சர்வர் (Clang Server) நீண்ட கால செயல்பாட்டின் போது நினைவக நுகர்வு கணிசமாகக் குறைந்துள்ளது (இலவச நினைவக பக்கங்களை இயக்க முறைமைக்கு திரும்ப malloc_trim க்கு அவ்வப்போது அழைப்புகள் வழங்கப்படுகின்றன).

LLVM 12.0 இல் முக்கிய கண்டுபிடிப்புகள்:

  • பைத்தானில் எழுதப்பட்ட llvm-build பில்ட் டூலுக்கான ஆதரவு நிறுத்தப்பட்டது, அதற்குப் பதிலாக CMake பில்ட் சிஸ்டத்தைப் பயன்படுத்துவதற்கு திட்டம் முற்றிலும் மாறிவிட்டது.
  • AArch64 கட்டமைப்பிற்கான பின்தளத்தில், Windows இயங்குதளத்திற்கான ஆதரவு மேம்படுத்தப்பட்டுள்ளது: இலக்கு விண்டோஸ் அமைப்புகளுக்கான அசெம்பிளர் வெளியீட்டின் சரியான தலைமுறை உறுதி செய்யப்பட்டுள்ளது, அன்விண்ட் அழைப்புகளில் தரவு உருவாக்கம் உகந்ததாக உள்ளது (அத்தகைய தரவின் அளவு 60 ஆக குறைக்கப்பட்டுள்ளது. %), அசெம்பிளரைப் பயன்படுத்தி அன்வைண்ட் டேட்டாவை உருவாக்கும் திறன் .seh_* கட்டளைகள் சேர்க்கப்பட்டுள்ளது.
  • PowerPC கட்டமைப்பிற்கான பின்தளத்தில் லூப்கள் மற்றும் இன்லைன் வரிசைப்படுத்தலுக்கான புதிய மேம்படுத்தல்கள், Power10 செயலிகளுக்கான விரிவாக்கப்பட்ட ஆதரவு, மேட்ரிக்ஸ் கையாளுதலுக்கான MMA வழிமுறைகளுக்கான ஆதரவு மற்றும் AIX இயக்க முறைமைக்கான மேம்படுத்தப்பட்ட ஆதரவு ஆகியவை உள்ளன.
  • x86 பின்தளத்தில் AMD Zen 3, Intel Alder Lake மற்றும் Intel Sapphire Rapids செயலிகள் மற்றும் HRESET, UINTR மற்றும் AVXVNNI செயலி வழிமுறைகளுக்கு ஆதரவு சேர்க்கிறது. நினைவக எல்லைகள் இனி ஆதரிக்கப்படாது என்பதை உறுதிப்படுத்த சுட்டிகளைச் சரிபார்ப்பதற்கான MPX (நினைவகப் பாதுகாப்பு நீட்டிப்புகள்) க்கான ஆதரவு (இந்தத் தொழில்நுட்பம் பரவலாக இல்லை மற்றும் ஏற்கனவே GCC மற்றும் clang இலிருந்து அகற்றப்பட்டது). {disp32} மற்றும் {disp8} முன்னொட்டுகள் மற்றும் .d32 மற்றும் .d8 பின்னொட்டுகளுக்கு அசெம்பிளருக்கு ஆதரவு சேர்க்கப்பட்டது. மைக்ரோஆர்கிடெக்சரல் மேம்படுத்தல்களைச் சேர்ப்பதைக் கட்டுப்படுத்த "ட்யூன்-சிபியு" என்ற புதிய பண்பு சேர்க்கப்பட்டது.
  • கையொப்பமிடாத முழு எண்களின் மேலோட்டத்தைக் கண்டறிய, முழு எண் சிக்கல் கண்டறிதலில் (முழு எண் சுத்திகரிப்பு, “-fsanitize=integer”) ஒரு புதிய பயன்முறை “-fsanitize=unsigned-shift-base” சேர்க்கப்பட்டுள்ளது.
  • பல்வேறு டிடெக்டர்களில் (asan, cfi, lsan, msan, tsan, ubsan sanitizer) நிலையான Musl நூலகத்துடன் லினக்ஸ் விநியோகங்களுக்கான ஆதரவு சேர்க்கப்பட்டுள்ளது.
  • எல்எல்டி இணைப்பாளரின் திறன்கள் விரிவாக்கப்பட்டுள்ளன. "--சார்பு-கோப்பு", "-பிழை-கையாளுதல்-ஸ்கிரிப்ட்", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program" உள்ளிட்ட கூடுதல் விருப்பங்கள் உட்பட ELF வடிவமைப்பிற்கான மேம்படுத்தப்பட்ட ஆதரவு -பார்வை" " மேம்படுத்தப்பட்ட MinGW ஆதரவு. Mach-O வடிவமைப்பிற்கு (macOS), arm64, arm மற்றும் i386 கட்டமைப்புகளுக்கான ஆதரவு, இணைப்பு நேர மேம்படுத்தல்கள் (LTO) மற்றும் விதிவிலக்கு கையாளுதலுக்கான ஸ்டாக் அன்வைண்டிங் ஆகியவை செயல்படுத்தப்பட்டுள்ளன.
  • Libc++ ஆனது C++20 தரநிலையின் புதிய அம்சங்களை செயல்படுத்துகிறது மற்றும் C++2b விவரக்குறிப்பின் அம்சங்களை உருவாக்கத் தொடங்கியுள்ளது. உள்ளூர்மயமாக்கல் ஆதரவை முடக்கும் (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) மற்றும் போலி-ரேண்டம் எண்களை உருவாக்குவதற்கான சாதனங்களுடன் (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”) உருவாக்குவதற்கான ஆதரவு சேர்க்கப்பட்டது.

ஆதாரம்: opennet.ru

கருத்தைச் சேர்