Experiencia del equipo de PVS-Studio: mejora del rendimiento del analizador C ++ en Windows al cambiar a Clang

Desde el principio, el analizador PVS-Studio C ++ para Windows (entonces todavía Viva64 versión 1.00 en 2006) se ensambló con el compilador MSVC. Con el lanzamiento de las nuevas versiones de C ++, el núcleo del analizador aprendió a trabajar en Linux y macOS, y la estructura del proyecto se cambió para usar CMake. Pero en Windows, la compilación aún se realizó utilizando el compilador MSVC. El 29 de abril de 2019, los desarrolladores de Visual Studio anunciaron la inclusión de un conjunto de utilidades LLVM y el compilador Clang en su entorno de desarrollo. Y ahora finalmente logramos probarlo en acción.





Pruebas de rendimiento

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