Experiência da equipe PVS-Studio: melhorando o desempenho do analisador C ++ no Windows ao mudar para Clang

Desde o início, o analisador PVS-Studio C ++ para Windows (então ainda Viva64 versão 1.00 em 2006) foi montado com o compilador MSVC. Com o lançamento de novos lançamentos C ++, o núcleo do analisador aprendeu a trabalhar em Linux e macOS, e a estrutura do projeto foi trocada para usar CMake. Mas no Windows, a construção ainda era feita usando o compilador MSVC. Em 29 de abril de 2019, os desenvolvedores do Visual Studio anunciaram a inclusão de um conjunto de utilitários LLVM e o compilador Clang em seu ambiente de desenvolvimento. E agora finalmente colocamos nossas mãos em ação para experimentá-lo.





Teste de performance

SelfTester. . , - , , . SelfTester "".





– . , , SelfTester' . , .





C++ Clang, SelfTester 11 .





13% — , , , ?





, . 8 , 1,6 ( ~500 - ).





, LTO ( ) .





, .





Clang

CMake .





Clang Visual Studio Installer.





Clang-cl — "", clang cl.exe. , MSBuild, .





LLVM, GitHub. , Visual Studio . toolset' llvm, clangcl, .





toolchain solution Visual Studio:





cmake -G "Visual Studio 16 2019" -Tclangcl <src>

      
      



GUI:





, . , , .





lang-cl CL, , .





, /W4 /WX. Clang , . :





if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  ....

  if (WIN32)
    add_compile_options(-Wno-error=deprecated-declarations
                        -Wno-error=reorder-ctor
                        -Wno-error=format-security
                        -Wno-error=macro-redefined
                        -Wno-error=bitwise-op-parentheses
                        -Wno-error=missing-field-initializers
                        -Wno-error=overloaded-virtual
                        -Wno-error=invalid-source-encoding
                        -Wno-error=multichar
                        -Wno-unused-local-typedef
                        -Wno-c++11-narrowing)
  ....
  endif()
endif()

      
      



.





GCC Clang int128, MSVC Windows. Int128 Windows ( ifdef', C/C++). , :





if (MSVC)
  set(DEFAULT_INT128_ASM ON)
else ()
  set(DEFAULT_INT128_ASM OFF)
endif ()

      
      







if (MSVC AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  set(DEFAULT_INT128_ASM ON)
else ()
  set(DEFAULT_INT128_ASM OFF)
endif ()

      
      



builtin' (lld) , clang.exe clang-cl.exe. MSBuild , , . , , .





if (CMAKE_GENERATOR MATCHES "Visual Studio")

  link_libraries("$(LLVMInstallDir)\\lib\\clang\\\
${CMAKE_CXX_COMPILER_VERSION}\\lib\\windows\\\
clang_rt.builtins-x86_64.lib")

else()
  link_libraries(clang_rt.builtins-x86_64)
endif()

      
      



! . :





- IntegerInterval, :





Dataflow- Int128, SIMD-. :





MOVAPS SIMD-. , 0, 8. , :





class alignas(16) Int128
      
      



.





- Docker-:





MSVC , Clang . , Windows Microsoft Visual C++ Redistributable. , .





, , 10%.





PVS-Studio Windows Clang.





, : Alexey Govorov, Sergey Larin. PVS-Studio Team: Switching to Clang Improved PVS-Studio C++ Analyzer's Performance.








All Articles