From 0b5fa33f559237119a79a91747123503956e8974 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Sat, 30 Sep 2023 16:23:51 +0200 Subject: [PATCH 01/35] Pin swift version --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6e4c32f0b..ccf529334 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,6 +55,8 @@ jobs: libclang-rt-14-dev - uses: swift-actions/setup-swift@v1 + with: + swift-version: "5.8.1" - name: Building Phasar in ${{ matrix.build }} with ${{ matrix.compiler[0] }} env: BUILD_TYPE: ${{ matrix.build }} From 26d43e021dc8382ad0565a9c1bc52e1f087202e0 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Sun, 1 Oct 2023 11:54:47 +0200 Subject: [PATCH 02/35] Some build cleanup --- .github/workflows/ci.yml | 1 + CMakeLists.txt | 61 +++---------------- cmake/phasar_macros.cmake | 12 ++-- lib/AnalysisStrategy/CMakeLists.txt | 14 +---- lib/Config/CMakeLists.txt | 16 ++--- lib/ControlFlow/CMakeLists.txt | 14 +---- lib/Controller/CMakeLists.txt | 16 +---- lib/DB/CMakeLists.txt | 10 +-- lib/PhasarClang/CMakeLists.txt | 14 +---- lib/PhasarLLVM/CMakeLists.txt | 14 +---- lib/PhasarLLVM/ControlFlow/CMakeLists.txt | 14 +---- lib/PhasarLLVM/DB/CMakeLists.txt | 14 +---- .../DataFlow/IfdsIde/CMakeLists.txt | 14 +---- lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt | 14 +---- lib/PhasarLLVM/Passes/CMakeLists.txt | 16 +---- lib/PhasarLLVM/Pointer/CMakeLists.txt | 17 ++---- lib/PhasarLLVM/TaintConfig/CMakeLists.txt | 16 ++--- lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt | 17 ++---- lib/PhasarLLVM/Utils/CMakeLists.txt | 16 +---- lib/PhasarPass/CMakeLists.txt | 15 +---- lib/Pointer/CMakeLists.txt | 14 +---- lib/Utils/CMakeLists.txt | 16 +---- tools/example-tool/CMakeLists.txt | 4 +- tools/phasar-cli/CMakeLists.txt | 32 +++++----- .../PhasarLLVM/ControlFlow/CMakeLists.txt | 4 ++ .../IDELinearConstantAnalysis_DotTest.cpp | 1 - 26 files changed, 95 insertions(+), 301 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6e4c32f0b..2935d6890 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,6 +68,7 @@ jobs: -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ -DCMAKE_CXX_COMPILER=$CXX \ -DBUILD_SWIFT_TESTS=1 \ + -DPHASAR_DEBUG_LIBDEPS=ON \ -G Ninja cmake --build . diff --git a/CMakeLists.txt b/CMakeLists.txt index b9eb75366..38ad8245e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -177,8 +177,7 @@ add_compile_definitions(PHASAR_DIR="${PHASAR_SRC_DIR}") find_package(Threads) # Boost -find_package(Boost 1.65.1 COMPONENTS graph ${BOOST_THREAD} REQUIRED) -#find_package(Boost 1.72.0 COMPONENTS graph ${BOOST_THREAD} REQUIRED) +find_package(Boost 1.65.1 COMPONENTS graph REQUIRED) include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) # Disable clang-tidy for the external projects @@ -213,13 +212,12 @@ include_directories(SYSTEM external/json-schema-validator/src/) # Googletest if (NOT PHASAR_IN_TREE) + set(BUILD_GMOCK OFF) add_subdirectory(external/googletest EXCLUDE_FROM_ALL) include_directories(SYSTEM external/googletest/googletest/include) - include_directories(SYSTEM external/googletest/googlemock/include) else() # Set llvm distributed includes for gtest header include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include) - include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googlemock/include) endif() # SQL @@ -233,22 +231,21 @@ if (NOT PHASAR_IN_TREE) find_package(LLVM 14 REQUIRED CONFIG) include_directories(SYSTEM ${LLVM_INCLUDE_DIRS}) link_directories(${LLVM_LIB_PATH} ${LLVM_LIBRARY_DIRS}) + + find_library(LLVM_LIBRARY NAMES LLVM PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) endif() -add_definitions(${LLVM_DEFINITIONS}) +separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS}) +add_definitions(${LLVM_DEFINITIONS_LIST}) -if (NOT PHASAR_IN_TREE) - find_library(LLVM_LIBRARY NAMES LLVM PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) - if(NOT ${LLVM_LIBRARY} STREQUAL "LLVM_LIBRARY-NOTFOUND") - message(STATUS "Found consolidated shared LLVM lib " ${LLVM_LIBRARY} " that will be linked against.") - set(USE_LLVM_FAT_LIB on) - endif() +if(NOT LLVM_ENABLE_RTTI) + message(FATAL_ERROR "PhASAR requires a LLVM version that is built with RTTI") endif() # Clang # The clang-cpp shared library is now the preferred way to link dynamically against libclang if we build out of tree. if(NOT PHASAR_IN_TREE) - find_library(CLANG_LIBRARY NAMES clang-cpp libclang-cpp REQUIRED HINTS ${LLVM_LIBRARY_DIRS}) + find_library(CLANG_LIBRARY NAMES clang-cpp libclang-cpp HINTS ${LLVM_LIBRARY_DIRS}) if(${CLANG_LIBRARY} STREQUAL "CLANG_LIBRARY-NOTFOUND") set(NEED_LIBCLANG_COMPONENT_LIBS on) endif() @@ -306,32 +303,6 @@ endif () add_subdirectory(include) add_subdirectory(lib) -set(LLVM_LINK_COMPONENTS - coverage - coroutines - demangle - libdriver - lto - support - analysis - bitwriter - core - ipo - irreader - instcombine - instrumentation - linker - objcarcopts - scalaropts - transformutils - codegen - vectorize -) - -llvm_map_components_to_libnames(llvm_libs - ${LLVM_LINK_COMPONENTS} -) - # phasar-based binaries add_subdirectory(tools) @@ -452,20 +423,6 @@ set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${MAJOR_VERSION}.${MIN # package dependencies can be set-up here # better use autogenerated dependency information set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) -# set(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost_program_options (>= 1.66.0), -# libboost_graph (>= 1.66.0), -# libboost_thread (>= 1.66.0), -# libsqlite3 (>= 4.5.0), -# libpthread (>= 4.5.0), -# libdl (>= 4.5.0), -# librt (>= 4.5.0), -# libtinfo (>= 4.5.0), -# libz (>= 4.5.0), -# libm (>= 4.5.0), -# libstdc++ (>= 4.5.0), -# libgcc_s (>= 4.5.0), -# libc (>= 4.5.0), -# ld-linux-x86-64 (>= 4.5.0)") set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") set(CPACK_DEBIAN_PACKAGE_SECTION "kde") set(CPACK_DEBIAN_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) diff --git a/cmake/phasar_macros.cmake b/cmake/phasar_macros.cmake index db0096471..0e8c60e04 100644 --- a/cmake/phasar_macros.cmake +++ b/cmake/phasar_macros.cmake @@ -148,7 +148,9 @@ macro(add_phasar_executable name) endmacro(add_phasar_executable) macro(add_phasar_library name) - set(srcs ${ARGN}) + set(PHASAR_LIB_OPTIONS SHARED STATIC MODULE INTERFACE) + cmake_parse_arguments(PHASAR_LIB "${PHASAR_LIB_OPTIONS}" "" "" ${ARGN}) + set(srcs ${PHASAR_LIB_UNPARSED_ARGUMENTS}) if(MSVC_IDE OR XCODE) file(GLOB_RECURSE headers *.h *.td *.def) @@ -160,12 +162,14 @@ macro(add_phasar_library name) set(srcs ${srcs} ${headers}) endif(MSVC_IDE OR XCODE) - if(MODULE) + if(PHASAR_LIB_MODULE) set(libkind MODULE) - elseif(SHARED_LIBRARY) + elseif(PHASAR_LIB_INTERFACE) + set(libkind INTERFACE) + elseif(PHASAR_LIB_SHARED OR BUILD_SHARED_LIBS) set(libkind SHARED) else() - set(libkind) + set(libkind STATIC) endif() add_library(${name} ${libkind} ${srcs}) diff --git a/lib/AnalysisStrategy/CMakeLists.txt b/lib/AnalysisStrategy/CMakeLists.txt index 3b205207d..dbb3a1831 100644 --- a/lib/AnalysisStrategy/CMakeLists.txt +++ b/lib/AnalysisStrategy/CMakeLists.txt @@ -9,17 +9,9 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_analysis_strategy - SHARED - ${ANALYSIS_STRATEGY_SRC} - ) -else() - add_phasar_library(phasar_analysis_strategy - STATIC - ${ANALYSIS_STRATEGY_SRC} - ) -endif() +add_phasar_library(phasar_analysis_strategy + ${ANALYSIS_STRATEGY_SRC} +) set_target_properties(phasar_analysis_strategy PROPERTIES diff --git a/lib/Config/CMakeLists.txt b/lib/Config/CMakeLists.txt index 10ae4447d..397500e13 100644 --- a/lib/Config/CMakeLists.txt +++ b/lib/Config/CMakeLists.txt @@ -8,20 +8,12 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_config - SHARED - ${CONFIG_SRC} - ) -else() - add_phasar_library(phasar_config - STATIC - ${CONFIG_SRC} - ) -endif() +add_phasar_library(phasar_config + ${CONFIG_SRC} +) target_link_libraries(phasar_config - LINK_PUBLIC + LINK_PRIVATE ${Boost_LIBRARIES} ) diff --git a/lib/ControlFlow/CMakeLists.txt b/lib/ControlFlow/CMakeLists.txt index b757c3d62..153e8c13c 100644 --- a/lib/ControlFlow/CMakeLists.txt +++ b/lib/ControlFlow/CMakeLists.txt @@ -7,17 +7,9 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_controlflow - SHARED - ${CONTROLFLOW_SRC} - ) -else() - add_phasar_library(phasar_controlflow - STATIC - ${CONTROLFLOW_SRC} - ) -endif() +add_phasar_library(phasar_controlflow + ${CONTROLFLOW_SRC} +) set_target_properties(phasar_controlflow PROPERTIES diff --git a/lib/Controller/CMakeLists.txt b/lib/Controller/CMakeLists.txt index 8b3df9478..801165960 100644 --- a/lib/Controller/CMakeLists.txt +++ b/lib/Controller/CMakeLists.txt @@ -19,22 +19,12 @@ set(LLVM_LINK_COMPONENTS Demangle ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_controller - SHARED - ${CONTROLLER_SRC} - ) -else() - add_phasar_library(phasar_controller - STATIC - ${CONTROLLER_SRC} - ) -endif() +add_phasar_library(phasar_controller + ${CONTROLLER_SRC} +) target_link_libraries(phasar_controller LINK_PUBLIC - curl - ${CMAKE_THREAD_LIBS_INIT} ${PHASAR_STD_FILESYSTEM} ) diff --git a/lib/DB/CMakeLists.txt b/lib/DB/CMakeLists.txt index 4579879ce..161f3acaa 100644 --- a/lib/DB/CMakeLists.txt +++ b/lib/DB/CMakeLists.txt @@ -13,20 +13,12 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) add_phasar_library(phasar_db - SHARED ${DB_SRC} ) -else() - add_phasar_library(phasar_db - STATIC - ${DB_SRC} - ) -endif() target_link_libraries(phasar_db - LINK_PUBLIC + LINK_PRIVATE ${SQLITE3_LIBRARY} ) diff --git a/lib/PhasarClang/CMakeLists.txt b/lib/PhasarClang/CMakeLists.txt index cd6955610..5d74c5972 100644 --- a/lib/PhasarClang/CMakeLists.txt +++ b/lib/PhasarClang/CMakeLists.txt @@ -13,17 +13,9 @@ set(LLVM_LINK_COMPONENTS Option ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_clang - SHARED - ${PHASARCLANG_SRC} - ) -else() - add_phasar_library(phasar_clang - STATIC - ${PHASARCLANG_SRC} - ) -endif() +add_phasar_library(phasar_clang + ${PHASARCLANG_SRC} +) target_link_libraries(phasar_clang LINK_PUBLIC diff --git a/lib/PhasarLLVM/CMakeLists.txt b/lib/PhasarLLVM/CMakeLists.txt index 7d446b251..5959655cb 100644 --- a/lib/PhasarLLVM/CMakeLists.txt +++ b/lib/PhasarLLVM/CMakeLists.txt @@ -21,14 +21,6 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm - SHARED - ${PHASAR_LLVM_SRC} - ) -else() - add_phasar_library(phasar_llvm - STATIC - ${PHASAR_LLVM_SRC} - ) -endif() +add_phasar_library(phasar_llvm + ${PHASAR_LLVM_SRC} +) diff --git a/lib/PhasarLLVM/ControlFlow/CMakeLists.txt b/lib/PhasarLLVM/ControlFlow/CMakeLists.txt index 3f93e7e90..69f15c960 100644 --- a/lib/PhasarLLVM/ControlFlow/CMakeLists.txt +++ b/lib/PhasarLLVM/ControlFlow/CMakeLists.txt @@ -14,17 +14,9 @@ set(LLVM_LINK_COMPONENTS Demangle ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_controlflow - SHARED - ${CONTROLFLOW_SRC} - ) -else() - add_phasar_library(phasar_llvm_controlflow - STATIC - ${CONTROLFLOW_SRC} - ) -endif() +add_phasar_library(phasar_llvm_controlflow + ${CONTROLFLOW_SRC} +) set_target_properties(phasar_llvm_controlflow PROPERTIES diff --git a/lib/PhasarLLVM/DB/CMakeLists.txt b/lib/PhasarLLVM/DB/CMakeLists.txt index cda931d3f..78c1a2f67 100644 --- a/lib/PhasarLLVM/DB/CMakeLists.txt +++ b/lib/PhasarLLVM/DB/CMakeLists.txt @@ -12,17 +12,9 @@ set(LLVM_LINK_COMPONENTS IRReader ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_db - SHARED - ${PSR_LLVM_DB_SRC} - ) -else() - add_phasar_library(phasar_llvm_db - STATIC - ${PSR_LLVM_DB_SRC} - ) -endif() +add_phasar_library(phasar_llvm_db + ${PSR_LLVM_DB_SRC} +) set_target_properties(phasar_llvm_db PROPERTIES diff --git a/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt b/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt index 7ab2b533a..fee602022 100644 --- a/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt +++ b/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt @@ -19,17 +19,9 @@ set(LLVM_LINK_COMPONENTS Demangle ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_ifdside - SHARED - ${IFDSIDE_SRC} - ) -else() - add_phasar_library(phasar_llvm_ifdside - STATIC - ${IFDSIDE_SRC} - ) -endif() +add_phasar_library(phasar_llvm_ifdside + ${IFDSIDE_SRC} +) set_target_properties(phasar_llvm_ifdside PROPERTIES diff --git a/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt b/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt index 9c11f2066..0c509620d 100644 --- a/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt +++ b/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt @@ -14,17 +14,9 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_mono - SHARED - ${MONO_SRC} - ) -else() - add_phasar_library(phasar_mono - STATIC - ${MONO_SRC} - ) -endif() +add_phasar_library(phasar_mono + ${MONO_SRC} +) set_target_properties(phasar_mono PROPERTIES diff --git a/lib/PhasarLLVM/Passes/CMakeLists.txt b/lib/PhasarLLVM/Passes/CMakeLists.txt index f40831353..3419073bf 100644 --- a/lib/PhasarLLVM/Passes/CMakeLists.txt +++ b/lib/PhasarLLVM/Passes/CMakeLists.txt @@ -11,20 +11,8 @@ set(LLVM_LINK_COMPONENTS Demangle ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_passes - SHARED - ${PASSES_SRC} - ) -else() - add_phasar_library(phasar_passes - STATIC - ${PASSES_SRC} - ) -endif() - -target_link_libraries(phasar_passes - LINK_PUBLIC +add_phasar_library(phasar_passes + ${PASSES_SRC} ) set_target_properties(phasar_passes diff --git a/lib/PhasarLLVM/Pointer/CMakeLists.txt b/lib/PhasarLLVM/Pointer/CMakeLists.txt index b01e8274d..d164dcfa7 100644 --- a/lib/PhasarLLVM/Pointer/CMakeLists.txt +++ b/lib/PhasarLLVM/Pointer/CMakeLists.txt @@ -17,21 +17,12 @@ set(LLVM_LINK_COMPONENTS ) # Handle the library files -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_pointer - SHARED - ${POINTER_SRC} - ) -else() - add_phasar_library(phasar_llvm_pointer - STATIC - ${POINTER_SRC} - ) -endif() +add_phasar_library(phasar_llvm_pointer + ${POINTER_SRC} +) -find_package(Boost COMPONENTS graph REQUIRED) target_link_libraries(phasar_llvm_pointer - LINK_PUBLIC + LINK_PRIVATE ${Boost_LIBRARIES} ) diff --git a/lib/PhasarLLVM/TaintConfig/CMakeLists.txt b/lib/PhasarLLVM/TaintConfig/CMakeLists.txt index 81d9ad6a8..cbacfef00 100644 --- a/lib/PhasarLLVM/TaintConfig/CMakeLists.txt +++ b/lib/PhasarLLVM/TaintConfig/CMakeLists.txt @@ -14,20 +14,12 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_taintconfig - SHARED - ${TAINTCONFIG_SRC} - ) -else() - add_phasar_library(phasar_taintconfig - STATIC - ${TAINTCONFIG_SRC} - ) -endif() +add_phasar_library(phasar_taintconfig + ${TAINTCONFIG_SRC} +) target_link_libraries(phasar_taintconfig - LINK_PUBLIC + LINK_PRIVATE nlohmann_json_schema_validator ) diff --git a/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt b/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt index 1094db186..2d02a47fc 100644 --- a/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt +++ b/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt @@ -12,21 +12,12 @@ set(LLVM_LINK_COMPONENTS ) # Handle the library files -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_typehierarchy - SHARED - ${TYPEHIERARCHY_SRC} - ) -else() - add_phasar_library(phasar_llvm_typehierarchy - STATIC - ${TYPEHIERARCHY_SRC} - ) -endif() +add_phasar_library(phasar_llvm_typehierarchy + ${TYPEHIERARCHY_SRC} +) -find_package(Boost COMPONENTS graph REQUIRED) target_link_libraries(phasar_llvm_typehierarchy - LINK_PUBLIC + LINK_PRIVATE ${Boost_LIBRARIES} ) diff --git a/lib/PhasarLLVM/Utils/CMakeLists.txt b/lib/PhasarLLVM/Utils/CMakeLists.txt index 6c05a4112..fd072a0f0 100644 --- a/lib/PhasarLLVM/Utils/CMakeLists.txt +++ b/lib/PhasarLLVM/Utils/CMakeLists.txt @@ -13,20 +13,8 @@ set(LLVM_LINK_COMPONENTS ) # Handle the library files -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_utils - SHARED - ${UTILS_SRC} - ) -else() - add_phasar_library(phasar_llvm_utils - STATIC - ${UTILS_SRC} - ) -endif() - -target_link_libraries(phasar_llvm_utils - LINK_PUBLIC +add_phasar_library(phasar_llvm_utils + ${UTILS_SRC} ) set_target_properties(phasar_llvm_utils diff --git a/lib/PhasarPass/CMakeLists.txt b/lib/PhasarPass/CMakeLists.txt index cec9dc7b5..29ee4c850 100644 --- a/lib/PhasarPass/CMakeLists.txt +++ b/lib/PhasarPass/CMakeLists.txt @@ -18,22 +18,13 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_pass - SHARED - ${PHASARPASS_SRC} - ) -else() - add_phasar_library(phasar_pass - STATIC - ${PHASARPASS_SRC} - ) -endif() +add_phasar_library(phasar_pass + ${PHASARPASS_SRC} +) # We specifically link internal phasar libs into phasar_pass so on that the # llvm user side only has to specify one library. -find_package(Boost COMPONENTS graph REQUIRED) target_link_libraries(phasar_pass LINK_PUBLIC ${CMAKE_THREAD_LIBS_INIT} diff --git a/lib/Pointer/CMakeLists.txt b/lib/Pointer/CMakeLists.txt index 791168961..e6f7b8a3b 100644 --- a/lib/Pointer/CMakeLists.txt +++ b/lib/Pointer/CMakeLists.txt @@ -10,17 +10,9 @@ set(LLVM_LINK_COMPONENTS ) # Handle the library files -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_pointer - SHARED - ${POINTER_SRC} - ) -else() - add_phasar_library(phasar_pointer - STATIC - ${POINTER_SRC} - ) -endif() +add_phasar_library(phasar_pointer + ${POINTER_SRC} +) set_target_properties(phasar_pointer PROPERTIES diff --git a/lib/Utils/CMakeLists.txt b/lib/Utils/CMakeLists.txt index e8d429fc8..a19d5a1a4 100644 --- a/lib/Utils/CMakeLists.txt +++ b/lib/Utils/CMakeLists.txt @@ -16,24 +16,14 @@ set(LLVM_LINK_COMPONENTS Demangle ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_utils - SHARED - ${UTILS_SRC} - ) -else() - add_phasar_library(phasar_utils - STATIC - ${UTILS_SRC} - ) -endif() +add_phasar_library(phasar_utils + ${UTILS_SRC} +) target_include_directories(phasar_utils PUBLIC ${LLVM_INCLUDE_DIRS}) target_link_libraries(phasar_utils LINK_PUBLIC - ${CMAKE_DL_LIBS} - ${Boost_LIBRARIES} ${PHASAR_STD_FILESYSTEM} ) diff --git a/tools/example-tool/CMakeLists.txt b/tools/example-tool/CMakeLists.txt index aab2a9a7d..4b440878d 100644 --- a/tools/example-tool/CMakeLists.txt +++ b/tools/example-tool/CMakeLists.txt @@ -13,9 +13,9 @@ endif() target_link_libraries(myphasartool LINK_PUBLIC - phasar + phasar LINK_PRIVATE - ${PHASAR_STD_FILESYSTEM} + ${PHASAR_STD_FILESYSTEM} ) install(TARGETS myphasartool diff --git a/tools/phasar-cli/CMakeLists.txt b/tools/phasar-cli/CMakeLists.txt index f696adea4..ff5b64fc9 100644 --- a/tools/phasar-cli/CMakeLists.txt +++ b/tools/phasar-cli/CMakeLists.txt @@ -24,25 +24,21 @@ endif() # If this list is altered the other one should be altered accordingly. target_link_libraries(phasar-cli LINK_PUBLIC - phasar_config - phasar_controller - phasar_llvm_controlflow - phasar_llvm_utils - phasar_analysis_strategy - phasar_llvm_ifdside - phasar_utils - phasar_mono - phasar_llvm_db - phasar_passes - phasar_llvm_pointer - phasar_llvm - phasar_llvm_typehierarchy - ${SQLITE3_LIBRARY} - ${Boost_LIBRARIES} - ${CMAKE_DL_LIBS} - ${CMAKE_THREAD_LIBS_INIT} + phasar_config + phasar_controller + phasar_llvm_controlflow + phasar_llvm_utils + phasar_analysis_strategy + phasar_llvm_ifdside + phasar_utils + phasar_mono + phasar_llvm_db + phasar_passes + phasar_llvm_pointer + phasar_llvm + phasar_llvm_typehierarchy LINK_PRIVATE - ${PHASAR_STD_FILESYSTEM} + ${PHASAR_STD_FILESYSTEM} ) if (NOT PHASAR_IN_TREE) diff --git a/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt b/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt index 04cb11d94..2cb3c3a29 100644 --- a/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt +++ b/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt @@ -12,6 +12,10 @@ set(ControlFlowSources LLVMBasedICFGSerializationTest.cpp ) +set(LLVM_LINK_COMPONENTS + Linker +) + foreach(TEST_SRC ${ControlFlowSources}) add_phasar_unittest(${TEST_SRC}) endforeach(TEST_SRC) diff --git a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDELinearConstantAnalysis_DotTest.cpp b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDELinearConstantAnalysis_DotTest.cpp index 61a7912d4..8f14daced 100644 --- a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDELinearConstantAnalysis_DotTest.cpp +++ b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDELinearConstantAnalysis_DotTest.cpp @@ -9,7 +9,6 @@ #include "phasar/PhasarLLVM/TypeHierarchy/LLVMTypeHierarchy.h" #include "TestConfig.h" -#include "gmock/gmock.h" #include "gtest/gtest.h" #include From 20aec5ed559f21e125a44253e6cb21c43d1c72c8 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 2 Oct 2023 15:35:57 +0200 Subject: [PATCH 03/35] Correctly find unittests even if the build-folder is not called "build" --- unittests/TestUtils/TestConfig.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/unittests/TestUtils/TestConfig.h b/unittests/TestUtils/TestConfig.h index a58bc45ae..efd0076c3 100644 --- a/unittests/TestUtils/TestConfig.h +++ b/unittests/TestUtils/TestConfig.h @@ -1,8 +1,9 @@ #ifndef UNITTEST_TESTUTILS_TESTCONFIG_H_ #define UNITTEST_TESTUTILS_TESTCONFIG_H_ -#include "phasar/Config/Configuration.h" +#include "llvm/ADT/StringRef.h" +#include "config.h" #include "gtest/gtest.h" #include @@ -10,19 +11,19 @@ namespace psr::unittest { static constexpr llvm::StringLiteral PathToLLTestFiles = - PHASAR_DIR "/build/test/llvm_test_code/"; + PHASAR_BUILD_DIR "/test/llvm_test_code/"; static constexpr llvm::StringLiteral PathToTxtTestFiles = - PHASAR_DIR "/build/test/text_test_code/"; + PHASAR_BUILD_DIR "/test/text_test_code/"; static constexpr llvm::StringLiteral PathToJSONTestFiles = - PHASAR_DIR "/test/json_test_code/"; + PHASAR_SRC_DIR "/test/json_test_code/"; #define PHASAR_BUILD_SWIFT_SUBFOLDER(SUB) \ - llvm::StringLiteral(PHASAR_DIR "/build/test/llvm_swift_test_code/" SUB) + llvm::StringLiteral(PHASAR_BUILD_DIR "/test/llvm_swift_test_code/" SUB) #define PHASAR_BUILD_SUBFOLDER(SUB) \ - llvm::StringLiteral(PHASAR_DIR "/build/test/llvm_test_code/" SUB) + llvm::StringLiteral(PHASAR_BUILD_DIR "/test/llvm_test_code/" SUB) // Remove wrapped tests in case GTEST_SKIP is not available. This is needed as // LLVM currently ships with an older version of gtest (<1.10.0) that does not From dc8fb862c2d7e80b9ac13d2aaed329b5e0d9300f Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 2 Oct 2023 15:38:01 +0200 Subject: [PATCH 04/35] Greater build variety in the CI --- .github/workflows/ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2935d6890..6925a9ecc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,12 @@ jobs: fail-fast: true matrix: compiler: [ [clang++-14, clang-14] ] - build: [ Debug, Release ] + build: [ DebugSan, Release ] + include: + - build: DebugSan + flags: -DPHASAR_BUILD_DYNLIB=ON + - build: Release + flags: -DPHASAR_ENABLE_DYNAMIC_LOG=OFF continue-on-error: false steps: @@ -69,6 +74,7 @@ jobs: -DCMAKE_CXX_COMPILER=$CXX \ -DBUILD_SWIFT_TESTS=1 \ -DPHASAR_DEBUG_LIBDEPS=ON \ + ${{ matrix.flags }} \ -G Ninja cmake --build . From beb086ef1640d184c443630c9655edf3dae183f1 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 2 Oct 2023 17:59:21 +0200 Subject: [PATCH 05/35] Minimize direct modification of CMAKE_CXX_FLAGS + use portable variants of some compilation flags if available + add the ability to turn on -march=native + minor --- CMakeLists.txt | 69 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 38ad8245e..5ec12f355 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,14 @@ cmake_minimum_required (VERSION 3.9) cmake_policy(SET CMP0069 NEW) set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) +# Allow overwriting options of external projects from this CMakeLists file +cmake_policy(SET CMP0077 NEW) +set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) + +# Allow portable use of CMAKE_VISIBILITY_INLINES_HIDDEN not only for shared libraries +cmake_policy(SET CMP0063 NEW) +set(CMAKE_POLICY_DEFAULT_CMP0063 NEW) + # Check if we build within the llvm source tree if (DEFINED LLVM_MAIN_SRC_DIR) set(PHASAR_IN_TREE 1) @@ -18,7 +26,7 @@ option(PHASAR_EXPERIMENTAL_CXX20 "Build phasar in C++20 mode. This is an experim set(CMAKE_EXPORT_COMPILE_COMMANDS YES) if(PHASAR_EXPERIMENTAL_CXX20) - message(STATUS "Selected experimental C++ build") + message(STATUS "Selected experimental C++20 build") set(CMAKE_CXX_STANDARD 20) else() set(CMAKE_CXX_STANDARD 17) @@ -34,19 +42,55 @@ if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build mode ('DebugSan' or 'Debug' or 'Release', default is 'Debug')" FORCE) endif () +option(CMAKE_VISIBILITY_INLINES_HIDDEN "Hide inlined functions from the DSO table (default ON)" ON) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -MP -fstack-protector-strong -ffunction-sections -fdata-sections -pipe") + +# NOTE: Use gcc -march=native -Q --help=target | grep -- '-march=' | cut -f3 +# to check the architecture detected by match=native +set(PHASAR_TARGET_ARCH "" CACHE STRING "Optimize the build for the given target architecture, e.g. -march=native. Most useful in Release builds. Disabled by default") + +if (NOT PHASAR_TARGET_ARCH STREQUAL "") + include(CheckCXXCompilerFlag) + check_cxx_compiler_flag("-march=${PHASAR_TARGET_ARCH}" MARCH_SUPPORTED) + if(MARCH_SUPPORTED) + message(STATUS "Target architecture ${PHASAR_TARGET_ARCH} enabled") + add_compile_options(-march=${PHASAR_TARGET_ARCH}) + else() + message(STATUS "Target architecture ${PHASAR_TARGET_ARCH} not supported") + endif() +endif() + +# TODO: Once available, we may want to use -fextend-lifetimes on Debug- and RelWithDebInfo builds to improve debugging experience +# https://reviews.llvm.org/D157613 + if(CMAKE_BUILD_TYPE STREQUAL "DebugSan") - message(STATUS "Selected Debug Build with sanitizers") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -MP -fvisibility-inlines-hidden -fstack-protector-strong -ffunction-sections -fdata-sections -pipe -g -fno-omit-frame-pointer -fsanitize=address,undefined") + message(STATUS "Selected Debug Build with Sanitizers") + add_compile_options( + -fno-omit-frame-pointer + -fsanitize=address,undefined + -O1 + ) + add_link_options( + -fsanitize=address,undefined + ) elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Selected Debug Build") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -MP -fvisibility-inlines-hidden -fstack-protector-strong -ffunction-sections -fdata-sections -pipe -g") + add_compile_options( + -Og + -fno-omit-frame-pointer + ) +elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") + message(STATUS "Selected Optimized Debug Build (RelWithDebInfo") + add_compile_options( + -fno-omit-frame-pointer + ) else() message(STATUS "Selected Release Build") include(CheckIPOSupported) check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT LTO_SUPPORT_ERROR) - if(LTO_SUPPORTED) message(STATUS "IPO/LTO enabled") set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) # LTO @@ -54,9 +98,6 @@ else() message(STATUS "IPO/LTO not supported: ${LTO_SUPPORT_ERROR}") endif() - - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -MP -fvisibility-inlines-hidden -fstack-protector-strong -ffunction-sections -fdata-sections -pipe") - endif() # Enable testing @@ -104,12 +145,18 @@ endif() option(PHASAR_ENABLE_WARNINGS "Enable warnings" ON) if (PHASAR_ENABLE_WARNINGS) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-variable -Wno-unused-parameter -Wno-return-type-c-linkage ") + add_compile_options( + -Wall + -Wextra + -Wno-unused-variable + -Wno-unused-parameter + -Wno-return-type-c-linkage + ) endif (PHASAR_ENABLE_WARNINGS) option(PHASAR_ENABLE_PIC "Build Position-Independed Code" ON) if (PHASAR_ENABLE_PIC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") + set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif (PHASAR_ENABLE_PIC) if (NOT PHASAR_ENABLE_PAMM) @@ -132,7 +179,7 @@ option(PHASAR_ENABLE_DYNAMIC_LOG "Makes it possible to switch the logger on and if (PHASAR_ENABLE_DYNAMIC_LOG) message(STATUS "Dynamic log enabled") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDYNAMIC_LOG") + add_compile_definitions(DYNAMIC_LOG) else() message(STATUS "Dynamic log disabled") endif() From 1d5d25d2a409e6dcc09ca27a84e9afa617214ba7 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 2 Oct 2023 20:13:19 +0200 Subject: [PATCH 06/35] Add compile options only for C++ build + link LLVM publicly to support BUILD_SHARED_LIBS --- CMakeLists.txt | 33 ++++++++++++++++++--------------- cmake/phasar_macros.cmake | 32 ++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ec12f355..dd0a04070 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,10 @@ include(GNUInstallDirs) set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF) +set(PHASAR_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PHASAR_SRC_DIR}/cmake") +include("phasar_macros") + if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build mode ('DebugSan' or 'Debug' or 'Release', default is 'Debug')" FORCE) endif () @@ -55,7 +59,7 @@ if (NOT PHASAR_TARGET_ARCH STREQUAL "") check_cxx_compiler_flag("-march=${PHASAR_TARGET_ARCH}" MARCH_SUPPORTED) if(MARCH_SUPPORTED) message(STATUS "Target architecture ${PHASAR_TARGET_ARCH} enabled") - add_compile_options(-march=${PHASAR_TARGET_ARCH}) + add_cxx_compile_options(-march=${PHASAR_TARGET_ARCH}) else() message(STATUS "Target architecture ${PHASAR_TARGET_ARCH} not supported") endif() @@ -66,7 +70,7 @@ endif() if(CMAKE_BUILD_TYPE STREQUAL "DebugSan") message(STATUS "Selected Debug Build with Sanitizers") - add_compile_options( + add_cxx_compile_options( -fno-omit-frame-pointer -fsanitize=address,undefined -O1 @@ -76,13 +80,13 @@ if(CMAKE_BUILD_TYPE STREQUAL "DebugSan") ) elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Selected Debug Build") - add_compile_options( + add_cxx_compile_options( -Og -fno-omit-frame-pointer ) elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") message(STATUS "Selected Optimized Debug Build (RelWithDebInfo") - add_compile_options( + add_cxx_compile_options( -fno-omit-frame-pointer ) else() @@ -108,15 +112,10 @@ enable_testing() # message(FATAL_ERROR "Phasar is not a llvm drop-in, abort!") # endif() -set(PHASAR_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PHASAR_SRC_DIR}/cmake") - file(STRINGS ${PHASAR_SRC_DIR}/include/phasar/Config/Version.h VERSION_NUMBER_FILE) string(REPLACE " " ";" VERSION_NUMBER_FILE ${VERSION_NUMBER_FILE}) list(GET VERSION_NUMBER_FILE 2 VERSION_NUMBER_PHASAR) -include("phasar_macros") - option(PHASAR_BUILD_UNITTESTS "Build all tests (default is ON)" ON) option(BUILD_SWIFT_TESTS "Builds the Swift tests (Swift compiler has to be installed manually beforehand!)" OFF) @@ -145,7 +144,7 @@ endif() option(PHASAR_ENABLE_WARNINGS "Enable warnings" ON) if (PHASAR_ENABLE_WARNINGS) - add_compile_options( + add_cxx_compile_options( -Wall -Wextra -Wno-unused-variable @@ -164,10 +163,10 @@ if (NOT PHASAR_ENABLE_PAMM) set_property(CACHE PHASAR_ENABLE_PAMM PROPERTY STRINGS "Off" "Core" "Full") endif() if(PHASAR_ENABLE_PAMM STREQUAL "Core" AND NOT PHASAR_BUILD_UNITTESTS) - add_compile_definitions(PAMM_CORE) + add_cxx_compile_definitions(PAMM_CORE) message(STATUS "PAMM metric severity level: Core") elseif(PHASAR_ENABLE_PAMM STREQUAL "Full" AND NOT PHASAR_BUILD_UNITTESTS) - add_compile_definitions(PAMM_FULL) + add_cxx_compile_definitions(PAMM_FULL) message(STATUS "PAMM metric severity level: Full") elseif(PHASAR_BUILD_UNITTESTS AND (PHASAR_ENABLE_PAMM STREQUAL "Core" OR PHASAR_ENABLE_PAMM STREQUAL "Full")) message(WARNING "PAMM metric severity level: Off (due to unittests)") @@ -179,7 +178,7 @@ option(PHASAR_ENABLE_DYNAMIC_LOG "Makes it possible to switch the logger on and if (PHASAR_ENABLE_DYNAMIC_LOG) message(STATUS "Dynamic log enabled") - add_compile_definitions(DYNAMIC_LOG) + add_cxx_compile_definitions(DYNAMIC_LOG) else() message(STATUS "Dynamic log disabled") endif() @@ -215,8 +214,8 @@ else() set(PHASAR_CONFIG_INSTALL_DIR "${PHASAR_CUSTOM_CONFIG_INSTALL_DIR}") endif() -add_compile_definitions(PHASAR_CONFIG_DIR="${PHASAR_CONFIG_INSTALL_DIR}") -add_compile_definitions(PHASAR_DIR="${PHASAR_SRC_DIR}") +add_cxx_compile_definitions(PHASAR_CONFIG_DIR="${PHASAR_CONFIG_INSTALL_DIR}") +add_cxx_compile_definitions(PHASAR_DIR="${PHASAR_SRC_DIR}") ### Adding external libraries @@ -280,6 +279,10 @@ if (NOT PHASAR_IN_TREE) link_directories(${LLVM_LIB_PATH} ${LLVM_LIBRARY_DIRS}) find_library(LLVM_LIBRARY NAMES LLVM PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) + if(BUILD_SHARED_LIBS AND NOT ${LLVM_LIBRARY} STREQUAL "LLVM_LIBRARY-NOTFOUND") + message(STATUS "Found consolidated shared LLVM lib ${LLVM_LIBRARY} that will be linked against.") + set(USE_LLVM_FAT_LIB ON) + endif() endif() separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS}) diff --git a/cmake/phasar_macros.cmake b/cmake/phasar_macros.cmake index 0e8c60e04..27b7d0134 100644 --- a/cmake/phasar_macros.cmake +++ b/cmake/phasar_macros.cmake @@ -1,3 +1,21 @@ + +macro(phasar_link_llvm executable) + # llvm_config links LLVM as LINK_PRIVATE. We want to LINK_PUBLIC + if (USE_LLVM_FAT_LIB) + target_link_libraries(${executable} LINK_PUBLIC LLVM) + else() + llvm_map_components_to_libnames(LLVM_LIBRARIES ${LLVM_LINK_COMPONENTS}) + target_link_libraries(${executable} LINK_PUBLIC ${LLVM_LIBRARIES}) + endif() +endmacro() + +macro(add_cxx_compile_options opts) + add_compile_options("$<$:${opts}>") +endmacro() +macro(add_cxx_compile_definitions defs) + add_compile_definitions("$<$:${defs}>") +endmacro() + function(add_phasar_unittest test_name) message("Set-up unittest: ${test_name}") get_filename_component(test ${test_name} NAME_WE) @@ -6,11 +24,7 @@ function(add_phasar_unittest test_name) ) add_dependencies(PhasarUnitTests ${test}) - if(USE_LLVM_FAT_LIB) - llvm_config(${test} USE_SHARED ${LLVM_LINK_COMPONENTS}) - else() - llvm_config(${test} ${LLVM_LINK_COMPONENTS}) - endif() + phasar_link_llvm(${test}) target_link_libraries(${test} LINK_PUBLIC @@ -195,13 +209,7 @@ macro(add_phasar_library name) endforeach(lib) endif(PHASAR_LINK_LIBS) - if(LLVM_LINK_COMPONENTS) - if(USE_LLVM_FAT_LIB) - llvm_config(${name} USE_SHARED ${LLVM_LINK_COMPONENTS}) - else() - llvm_config(${name} ${LLVM_LINK_COMPONENTS}) - endif() - endif(LLVM_LINK_COMPONENTS) + phasar_link_llvm(${name}) if(MSVC) get_target_property(cflag ${name} COMPILE_FLAGS) From bb76601efc82ba0392e115ccbb82c2c8aa2aae64 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Tue, 3 Oct 2023 12:12:32 +0200 Subject: [PATCH 07/35] Only add asan for CXX builds --- CMakeLists.txt | 2 +- cmake/phasar_macros.cmake | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dd0a04070..b8e6a52c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,7 +75,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "DebugSan") -fsanitize=address,undefined -O1 ) - add_link_options( + add_cxx_link_options( -fsanitize=address,undefined ) elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") diff --git a/cmake/phasar_macros.cmake b/cmake/phasar_macros.cmake index 27b7d0134..8b8f4db41 100644 --- a/cmake/phasar_macros.cmake +++ b/cmake/phasar_macros.cmake @@ -15,6 +15,9 @@ endmacro() macro(add_cxx_compile_definitions defs) add_compile_definitions("$<$:${defs}>") endmacro() +macro(add_cxx_link_options opts) + add_link_options("$<$:${opts}>") +endmacro() function(add_phasar_unittest test_name) message("Set-up unittest: ${test_name}") From e31e6cb49ed40682d71fd87580a943d1233a12c4 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Sun, 1 Oct 2023 11:54:47 +0200 Subject: [PATCH 08/35] Some build cleanup --- .github/workflows/ci.yml | 1 + CMakeLists.txt | 61 +++---------------- cmake/phasar_macros.cmake | 12 ++-- lib/AnalysisStrategy/CMakeLists.txt | 14 +---- lib/Config/CMakeLists.txt | 16 ++--- lib/ControlFlow/CMakeLists.txt | 14 +---- lib/Controller/CMakeLists.txt | 16 +---- lib/DB/CMakeLists.txt | 10 +-- lib/PhasarClang/CMakeLists.txt | 14 +---- lib/PhasarLLVM/CMakeLists.txt | 14 +---- lib/PhasarLLVM/ControlFlow/CMakeLists.txt | 14 +---- lib/PhasarLLVM/DB/CMakeLists.txt | 14 +---- .../DataFlow/IfdsIde/CMakeLists.txt | 14 +---- lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt | 14 +---- lib/PhasarLLVM/Passes/CMakeLists.txt | 16 +---- lib/PhasarLLVM/Pointer/CMakeLists.txt | 17 ++---- lib/PhasarLLVM/TaintConfig/CMakeLists.txt | 16 ++--- lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt | 17 ++---- lib/PhasarLLVM/Utils/CMakeLists.txt | 16 +---- lib/PhasarPass/CMakeLists.txt | 15 +---- lib/Pointer/CMakeLists.txt | 14 +---- lib/Utils/CMakeLists.txt | 16 +---- tools/example-tool/CMakeLists.txt | 4 +- tools/phasar-cli/CMakeLists.txt | 32 +++++----- .../PhasarLLVM/ControlFlow/CMakeLists.txt | 4 ++ .../IDELinearConstantAnalysis_DotTest.cpp | 1 - 26 files changed, 95 insertions(+), 301 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ccf529334..0240ebe2d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,6 +70,7 @@ jobs: -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ -DCMAKE_CXX_COMPILER=$CXX \ -DBUILD_SWIFT_TESTS=1 \ + -DPHASAR_DEBUG_LIBDEPS=ON \ -G Ninja cmake --build . diff --git a/CMakeLists.txt b/CMakeLists.txt index b9eb75366..38ad8245e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -177,8 +177,7 @@ add_compile_definitions(PHASAR_DIR="${PHASAR_SRC_DIR}") find_package(Threads) # Boost -find_package(Boost 1.65.1 COMPONENTS graph ${BOOST_THREAD} REQUIRED) -#find_package(Boost 1.72.0 COMPONENTS graph ${BOOST_THREAD} REQUIRED) +find_package(Boost 1.65.1 COMPONENTS graph REQUIRED) include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) # Disable clang-tidy for the external projects @@ -213,13 +212,12 @@ include_directories(SYSTEM external/json-schema-validator/src/) # Googletest if (NOT PHASAR_IN_TREE) + set(BUILD_GMOCK OFF) add_subdirectory(external/googletest EXCLUDE_FROM_ALL) include_directories(SYSTEM external/googletest/googletest/include) - include_directories(SYSTEM external/googletest/googlemock/include) else() # Set llvm distributed includes for gtest header include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include) - include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googlemock/include) endif() # SQL @@ -233,22 +231,21 @@ if (NOT PHASAR_IN_TREE) find_package(LLVM 14 REQUIRED CONFIG) include_directories(SYSTEM ${LLVM_INCLUDE_DIRS}) link_directories(${LLVM_LIB_PATH} ${LLVM_LIBRARY_DIRS}) + + find_library(LLVM_LIBRARY NAMES LLVM PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) endif() -add_definitions(${LLVM_DEFINITIONS}) +separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS}) +add_definitions(${LLVM_DEFINITIONS_LIST}) -if (NOT PHASAR_IN_TREE) - find_library(LLVM_LIBRARY NAMES LLVM PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) - if(NOT ${LLVM_LIBRARY} STREQUAL "LLVM_LIBRARY-NOTFOUND") - message(STATUS "Found consolidated shared LLVM lib " ${LLVM_LIBRARY} " that will be linked against.") - set(USE_LLVM_FAT_LIB on) - endif() +if(NOT LLVM_ENABLE_RTTI) + message(FATAL_ERROR "PhASAR requires a LLVM version that is built with RTTI") endif() # Clang # The clang-cpp shared library is now the preferred way to link dynamically against libclang if we build out of tree. if(NOT PHASAR_IN_TREE) - find_library(CLANG_LIBRARY NAMES clang-cpp libclang-cpp REQUIRED HINTS ${LLVM_LIBRARY_DIRS}) + find_library(CLANG_LIBRARY NAMES clang-cpp libclang-cpp HINTS ${LLVM_LIBRARY_DIRS}) if(${CLANG_LIBRARY} STREQUAL "CLANG_LIBRARY-NOTFOUND") set(NEED_LIBCLANG_COMPONENT_LIBS on) endif() @@ -306,32 +303,6 @@ endif () add_subdirectory(include) add_subdirectory(lib) -set(LLVM_LINK_COMPONENTS - coverage - coroutines - demangle - libdriver - lto - support - analysis - bitwriter - core - ipo - irreader - instcombine - instrumentation - linker - objcarcopts - scalaropts - transformutils - codegen - vectorize -) - -llvm_map_components_to_libnames(llvm_libs - ${LLVM_LINK_COMPONENTS} -) - # phasar-based binaries add_subdirectory(tools) @@ -452,20 +423,6 @@ set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${MAJOR_VERSION}.${MIN # package dependencies can be set-up here # better use autogenerated dependency information set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) -# set(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost_program_options (>= 1.66.0), -# libboost_graph (>= 1.66.0), -# libboost_thread (>= 1.66.0), -# libsqlite3 (>= 4.5.0), -# libpthread (>= 4.5.0), -# libdl (>= 4.5.0), -# librt (>= 4.5.0), -# libtinfo (>= 4.5.0), -# libz (>= 4.5.0), -# libm (>= 4.5.0), -# libstdc++ (>= 4.5.0), -# libgcc_s (>= 4.5.0), -# libc (>= 4.5.0), -# ld-linux-x86-64 (>= 4.5.0)") set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") set(CPACK_DEBIAN_PACKAGE_SECTION "kde") set(CPACK_DEBIAN_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) diff --git a/cmake/phasar_macros.cmake b/cmake/phasar_macros.cmake index db0096471..0e8c60e04 100644 --- a/cmake/phasar_macros.cmake +++ b/cmake/phasar_macros.cmake @@ -148,7 +148,9 @@ macro(add_phasar_executable name) endmacro(add_phasar_executable) macro(add_phasar_library name) - set(srcs ${ARGN}) + set(PHASAR_LIB_OPTIONS SHARED STATIC MODULE INTERFACE) + cmake_parse_arguments(PHASAR_LIB "${PHASAR_LIB_OPTIONS}" "" "" ${ARGN}) + set(srcs ${PHASAR_LIB_UNPARSED_ARGUMENTS}) if(MSVC_IDE OR XCODE) file(GLOB_RECURSE headers *.h *.td *.def) @@ -160,12 +162,14 @@ macro(add_phasar_library name) set(srcs ${srcs} ${headers}) endif(MSVC_IDE OR XCODE) - if(MODULE) + if(PHASAR_LIB_MODULE) set(libkind MODULE) - elseif(SHARED_LIBRARY) + elseif(PHASAR_LIB_INTERFACE) + set(libkind INTERFACE) + elseif(PHASAR_LIB_SHARED OR BUILD_SHARED_LIBS) set(libkind SHARED) else() - set(libkind) + set(libkind STATIC) endif() add_library(${name} ${libkind} ${srcs}) diff --git a/lib/AnalysisStrategy/CMakeLists.txt b/lib/AnalysisStrategy/CMakeLists.txt index 3b205207d..dbb3a1831 100644 --- a/lib/AnalysisStrategy/CMakeLists.txt +++ b/lib/AnalysisStrategy/CMakeLists.txt @@ -9,17 +9,9 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_analysis_strategy - SHARED - ${ANALYSIS_STRATEGY_SRC} - ) -else() - add_phasar_library(phasar_analysis_strategy - STATIC - ${ANALYSIS_STRATEGY_SRC} - ) -endif() +add_phasar_library(phasar_analysis_strategy + ${ANALYSIS_STRATEGY_SRC} +) set_target_properties(phasar_analysis_strategy PROPERTIES diff --git a/lib/Config/CMakeLists.txt b/lib/Config/CMakeLists.txt index 10ae4447d..397500e13 100644 --- a/lib/Config/CMakeLists.txt +++ b/lib/Config/CMakeLists.txt @@ -8,20 +8,12 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_config - SHARED - ${CONFIG_SRC} - ) -else() - add_phasar_library(phasar_config - STATIC - ${CONFIG_SRC} - ) -endif() +add_phasar_library(phasar_config + ${CONFIG_SRC} +) target_link_libraries(phasar_config - LINK_PUBLIC + LINK_PRIVATE ${Boost_LIBRARIES} ) diff --git a/lib/ControlFlow/CMakeLists.txt b/lib/ControlFlow/CMakeLists.txt index b757c3d62..153e8c13c 100644 --- a/lib/ControlFlow/CMakeLists.txt +++ b/lib/ControlFlow/CMakeLists.txt @@ -7,17 +7,9 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_controlflow - SHARED - ${CONTROLFLOW_SRC} - ) -else() - add_phasar_library(phasar_controlflow - STATIC - ${CONTROLFLOW_SRC} - ) -endif() +add_phasar_library(phasar_controlflow + ${CONTROLFLOW_SRC} +) set_target_properties(phasar_controlflow PROPERTIES diff --git a/lib/Controller/CMakeLists.txt b/lib/Controller/CMakeLists.txt index 8b3df9478..801165960 100644 --- a/lib/Controller/CMakeLists.txt +++ b/lib/Controller/CMakeLists.txt @@ -19,22 +19,12 @@ set(LLVM_LINK_COMPONENTS Demangle ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_controller - SHARED - ${CONTROLLER_SRC} - ) -else() - add_phasar_library(phasar_controller - STATIC - ${CONTROLLER_SRC} - ) -endif() +add_phasar_library(phasar_controller + ${CONTROLLER_SRC} +) target_link_libraries(phasar_controller LINK_PUBLIC - curl - ${CMAKE_THREAD_LIBS_INIT} ${PHASAR_STD_FILESYSTEM} ) diff --git a/lib/DB/CMakeLists.txt b/lib/DB/CMakeLists.txt index 4579879ce..161f3acaa 100644 --- a/lib/DB/CMakeLists.txt +++ b/lib/DB/CMakeLists.txt @@ -13,20 +13,12 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) add_phasar_library(phasar_db - SHARED ${DB_SRC} ) -else() - add_phasar_library(phasar_db - STATIC - ${DB_SRC} - ) -endif() target_link_libraries(phasar_db - LINK_PUBLIC + LINK_PRIVATE ${SQLITE3_LIBRARY} ) diff --git a/lib/PhasarClang/CMakeLists.txt b/lib/PhasarClang/CMakeLists.txt index cd6955610..5d74c5972 100644 --- a/lib/PhasarClang/CMakeLists.txt +++ b/lib/PhasarClang/CMakeLists.txt @@ -13,17 +13,9 @@ set(LLVM_LINK_COMPONENTS Option ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_clang - SHARED - ${PHASARCLANG_SRC} - ) -else() - add_phasar_library(phasar_clang - STATIC - ${PHASARCLANG_SRC} - ) -endif() +add_phasar_library(phasar_clang + ${PHASARCLANG_SRC} +) target_link_libraries(phasar_clang LINK_PUBLIC diff --git a/lib/PhasarLLVM/CMakeLists.txt b/lib/PhasarLLVM/CMakeLists.txt index 7d446b251..5959655cb 100644 --- a/lib/PhasarLLVM/CMakeLists.txt +++ b/lib/PhasarLLVM/CMakeLists.txt @@ -21,14 +21,6 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm - SHARED - ${PHASAR_LLVM_SRC} - ) -else() - add_phasar_library(phasar_llvm - STATIC - ${PHASAR_LLVM_SRC} - ) -endif() +add_phasar_library(phasar_llvm + ${PHASAR_LLVM_SRC} +) diff --git a/lib/PhasarLLVM/ControlFlow/CMakeLists.txt b/lib/PhasarLLVM/ControlFlow/CMakeLists.txt index 3f93e7e90..69f15c960 100644 --- a/lib/PhasarLLVM/ControlFlow/CMakeLists.txt +++ b/lib/PhasarLLVM/ControlFlow/CMakeLists.txt @@ -14,17 +14,9 @@ set(LLVM_LINK_COMPONENTS Demangle ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_controlflow - SHARED - ${CONTROLFLOW_SRC} - ) -else() - add_phasar_library(phasar_llvm_controlflow - STATIC - ${CONTROLFLOW_SRC} - ) -endif() +add_phasar_library(phasar_llvm_controlflow + ${CONTROLFLOW_SRC} +) set_target_properties(phasar_llvm_controlflow PROPERTIES diff --git a/lib/PhasarLLVM/DB/CMakeLists.txt b/lib/PhasarLLVM/DB/CMakeLists.txt index cda931d3f..78c1a2f67 100644 --- a/lib/PhasarLLVM/DB/CMakeLists.txt +++ b/lib/PhasarLLVM/DB/CMakeLists.txt @@ -12,17 +12,9 @@ set(LLVM_LINK_COMPONENTS IRReader ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_db - SHARED - ${PSR_LLVM_DB_SRC} - ) -else() - add_phasar_library(phasar_llvm_db - STATIC - ${PSR_LLVM_DB_SRC} - ) -endif() +add_phasar_library(phasar_llvm_db + ${PSR_LLVM_DB_SRC} +) set_target_properties(phasar_llvm_db PROPERTIES diff --git a/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt b/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt index 7ab2b533a..fee602022 100644 --- a/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt +++ b/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt @@ -19,17 +19,9 @@ set(LLVM_LINK_COMPONENTS Demangle ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_ifdside - SHARED - ${IFDSIDE_SRC} - ) -else() - add_phasar_library(phasar_llvm_ifdside - STATIC - ${IFDSIDE_SRC} - ) -endif() +add_phasar_library(phasar_llvm_ifdside + ${IFDSIDE_SRC} +) set_target_properties(phasar_llvm_ifdside PROPERTIES diff --git a/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt b/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt index 9c11f2066..0c509620d 100644 --- a/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt +++ b/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt @@ -14,17 +14,9 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_mono - SHARED - ${MONO_SRC} - ) -else() - add_phasar_library(phasar_mono - STATIC - ${MONO_SRC} - ) -endif() +add_phasar_library(phasar_mono + ${MONO_SRC} +) set_target_properties(phasar_mono PROPERTIES diff --git a/lib/PhasarLLVM/Passes/CMakeLists.txt b/lib/PhasarLLVM/Passes/CMakeLists.txt index f40831353..3419073bf 100644 --- a/lib/PhasarLLVM/Passes/CMakeLists.txt +++ b/lib/PhasarLLVM/Passes/CMakeLists.txt @@ -11,20 +11,8 @@ set(LLVM_LINK_COMPONENTS Demangle ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_passes - SHARED - ${PASSES_SRC} - ) -else() - add_phasar_library(phasar_passes - STATIC - ${PASSES_SRC} - ) -endif() - -target_link_libraries(phasar_passes - LINK_PUBLIC +add_phasar_library(phasar_passes + ${PASSES_SRC} ) set_target_properties(phasar_passes diff --git a/lib/PhasarLLVM/Pointer/CMakeLists.txt b/lib/PhasarLLVM/Pointer/CMakeLists.txt index b01e8274d..d164dcfa7 100644 --- a/lib/PhasarLLVM/Pointer/CMakeLists.txt +++ b/lib/PhasarLLVM/Pointer/CMakeLists.txt @@ -17,21 +17,12 @@ set(LLVM_LINK_COMPONENTS ) # Handle the library files -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_pointer - SHARED - ${POINTER_SRC} - ) -else() - add_phasar_library(phasar_llvm_pointer - STATIC - ${POINTER_SRC} - ) -endif() +add_phasar_library(phasar_llvm_pointer + ${POINTER_SRC} +) -find_package(Boost COMPONENTS graph REQUIRED) target_link_libraries(phasar_llvm_pointer - LINK_PUBLIC + LINK_PRIVATE ${Boost_LIBRARIES} ) diff --git a/lib/PhasarLLVM/TaintConfig/CMakeLists.txt b/lib/PhasarLLVM/TaintConfig/CMakeLists.txt index 81d9ad6a8..cbacfef00 100644 --- a/lib/PhasarLLVM/TaintConfig/CMakeLists.txt +++ b/lib/PhasarLLVM/TaintConfig/CMakeLists.txt @@ -14,20 +14,12 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_taintconfig - SHARED - ${TAINTCONFIG_SRC} - ) -else() - add_phasar_library(phasar_taintconfig - STATIC - ${TAINTCONFIG_SRC} - ) -endif() +add_phasar_library(phasar_taintconfig + ${TAINTCONFIG_SRC} +) target_link_libraries(phasar_taintconfig - LINK_PUBLIC + LINK_PRIVATE nlohmann_json_schema_validator ) diff --git a/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt b/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt index 1094db186..2d02a47fc 100644 --- a/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt +++ b/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt @@ -12,21 +12,12 @@ set(LLVM_LINK_COMPONENTS ) # Handle the library files -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_typehierarchy - SHARED - ${TYPEHIERARCHY_SRC} - ) -else() - add_phasar_library(phasar_llvm_typehierarchy - STATIC - ${TYPEHIERARCHY_SRC} - ) -endif() +add_phasar_library(phasar_llvm_typehierarchy + ${TYPEHIERARCHY_SRC} +) -find_package(Boost COMPONENTS graph REQUIRED) target_link_libraries(phasar_llvm_typehierarchy - LINK_PUBLIC + LINK_PRIVATE ${Boost_LIBRARIES} ) diff --git a/lib/PhasarLLVM/Utils/CMakeLists.txt b/lib/PhasarLLVM/Utils/CMakeLists.txt index 6c05a4112..fd072a0f0 100644 --- a/lib/PhasarLLVM/Utils/CMakeLists.txt +++ b/lib/PhasarLLVM/Utils/CMakeLists.txt @@ -13,20 +13,8 @@ set(LLVM_LINK_COMPONENTS ) # Handle the library files -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_llvm_utils - SHARED - ${UTILS_SRC} - ) -else() - add_phasar_library(phasar_llvm_utils - STATIC - ${UTILS_SRC} - ) -endif() - -target_link_libraries(phasar_llvm_utils - LINK_PUBLIC +add_phasar_library(phasar_llvm_utils + ${UTILS_SRC} ) set_target_properties(phasar_llvm_utils diff --git a/lib/PhasarPass/CMakeLists.txt b/lib/PhasarPass/CMakeLists.txt index cec9dc7b5..29ee4c850 100644 --- a/lib/PhasarPass/CMakeLists.txt +++ b/lib/PhasarPass/CMakeLists.txt @@ -18,22 +18,13 @@ set(LLVM_LINK_COMPONENTS Support ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_pass - SHARED - ${PHASARPASS_SRC} - ) -else() - add_phasar_library(phasar_pass - STATIC - ${PHASARPASS_SRC} - ) -endif() +add_phasar_library(phasar_pass + ${PHASARPASS_SRC} +) # We specifically link internal phasar libs into phasar_pass so on that the # llvm user side only has to specify one library. -find_package(Boost COMPONENTS graph REQUIRED) target_link_libraries(phasar_pass LINK_PUBLIC ${CMAKE_THREAD_LIBS_INIT} diff --git a/lib/Pointer/CMakeLists.txt b/lib/Pointer/CMakeLists.txt index 791168961..e6f7b8a3b 100644 --- a/lib/Pointer/CMakeLists.txt +++ b/lib/Pointer/CMakeLists.txt @@ -10,17 +10,9 @@ set(LLVM_LINK_COMPONENTS ) # Handle the library files -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_pointer - SHARED - ${POINTER_SRC} - ) -else() - add_phasar_library(phasar_pointer - STATIC - ${POINTER_SRC} - ) -endif() +add_phasar_library(phasar_pointer + ${POINTER_SRC} +) set_target_properties(phasar_pointer PROPERTIES diff --git a/lib/Utils/CMakeLists.txt b/lib/Utils/CMakeLists.txt index e8d429fc8..a19d5a1a4 100644 --- a/lib/Utils/CMakeLists.txt +++ b/lib/Utils/CMakeLists.txt @@ -16,24 +16,14 @@ set(LLVM_LINK_COMPONENTS Demangle ) -if(BUILD_SHARED_LIBS) - add_phasar_library(phasar_utils - SHARED - ${UTILS_SRC} - ) -else() - add_phasar_library(phasar_utils - STATIC - ${UTILS_SRC} - ) -endif() +add_phasar_library(phasar_utils + ${UTILS_SRC} +) target_include_directories(phasar_utils PUBLIC ${LLVM_INCLUDE_DIRS}) target_link_libraries(phasar_utils LINK_PUBLIC - ${CMAKE_DL_LIBS} - ${Boost_LIBRARIES} ${PHASAR_STD_FILESYSTEM} ) diff --git a/tools/example-tool/CMakeLists.txt b/tools/example-tool/CMakeLists.txt index aab2a9a7d..4b440878d 100644 --- a/tools/example-tool/CMakeLists.txt +++ b/tools/example-tool/CMakeLists.txt @@ -13,9 +13,9 @@ endif() target_link_libraries(myphasartool LINK_PUBLIC - phasar + phasar LINK_PRIVATE - ${PHASAR_STD_FILESYSTEM} + ${PHASAR_STD_FILESYSTEM} ) install(TARGETS myphasartool diff --git a/tools/phasar-cli/CMakeLists.txt b/tools/phasar-cli/CMakeLists.txt index f696adea4..ff5b64fc9 100644 --- a/tools/phasar-cli/CMakeLists.txt +++ b/tools/phasar-cli/CMakeLists.txt @@ -24,25 +24,21 @@ endif() # If this list is altered the other one should be altered accordingly. target_link_libraries(phasar-cli LINK_PUBLIC - phasar_config - phasar_controller - phasar_llvm_controlflow - phasar_llvm_utils - phasar_analysis_strategy - phasar_llvm_ifdside - phasar_utils - phasar_mono - phasar_llvm_db - phasar_passes - phasar_llvm_pointer - phasar_llvm - phasar_llvm_typehierarchy - ${SQLITE3_LIBRARY} - ${Boost_LIBRARIES} - ${CMAKE_DL_LIBS} - ${CMAKE_THREAD_LIBS_INIT} + phasar_config + phasar_controller + phasar_llvm_controlflow + phasar_llvm_utils + phasar_analysis_strategy + phasar_llvm_ifdside + phasar_utils + phasar_mono + phasar_llvm_db + phasar_passes + phasar_llvm_pointer + phasar_llvm + phasar_llvm_typehierarchy LINK_PRIVATE - ${PHASAR_STD_FILESYSTEM} + ${PHASAR_STD_FILESYSTEM} ) if (NOT PHASAR_IN_TREE) diff --git a/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt b/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt index 04cb11d94..2cb3c3a29 100644 --- a/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt +++ b/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt @@ -12,6 +12,10 @@ set(ControlFlowSources LLVMBasedICFGSerializationTest.cpp ) +set(LLVM_LINK_COMPONENTS + Linker +) + foreach(TEST_SRC ${ControlFlowSources}) add_phasar_unittest(${TEST_SRC}) endforeach(TEST_SRC) diff --git a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDELinearConstantAnalysis_DotTest.cpp b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDELinearConstantAnalysis_DotTest.cpp index 61a7912d4..8f14daced 100644 --- a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDELinearConstantAnalysis_DotTest.cpp +++ b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDELinearConstantAnalysis_DotTest.cpp @@ -9,7 +9,6 @@ #include "phasar/PhasarLLVM/TypeHierarchy/LLVMTypeHierarchy.h" #include "TestConfig.h" -#include "gmock/gmock.h" #include "gtest/gtest.h" #include From df57b8f47a8d8259deb38998564a46a007489344 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 2 Oct 2023 15:35:57 +0200 Subject: [PATCH 09/35] Correctly find unittests even if the build-folder is not called "build" --- unittests/TestUtils/TestConfig.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/unittests/TestUtils/TestConfig.h b/unittests/TestUtils/TestConfig.h index a58bc45ae..efd0076c3 100644 --- a/unittests/TestUtils/TestConfig.h +++ b/unittests/TestUtils/TestConfig.h @@ -1,8 +1,9 @@ #ifndef UNITTEST_TESTUTILS_TESTCONFIG_H_ #define UNITTEST_TESTUTILS_TESTCONFIG_H_ -#include "phasar/Config/Configuration.h" +#include "llvm/ADT/StringRef.h" +#include "config.h" #include "gtest/gtest.h" #include @@ -10,19 +11,19 @@ namespace psr::unittest { static constexpr llvm::StringLiteral PathToLLTestFiles = - PHASAR_DIR "/build/test/llvm_test_code/"; + PHASAR_BUILD_DIR "/test/llvm_test_code/"; static constexpr llvm::StringLiteral PathToTxtTestFiles = - PHASAR_DIR "/build/test/text_test_code/"; + PHASAR_BUILD_DIR "/test/text_test_code/"; static constexpr llvm::StringLiteral PathToJSONTestFiles = - PHASAR_DIR "/test/json_test_code/"; + PHASAR_SRC_DIR "/test/json_test_code/"; #define PHASAR_BUILD_SWIFT_SUBFOLDER(SUB) \ - llvm::StringLiteral(PHASAR_DIR "/build/test/llvm_swift_test_code/" SUB) + llvm::StringLiteral(PHASAR_BUILD_DIR "/test/llvm_swift_test_code/" SUB) #define PHASAR_BUILD_SUBFOLDER(SUB) \ - llvm::StringLiteral(PHASAR_DIR "/build/test/llvm_test_code/" SUB) + llvm::StringLiteral(PHASAR_BUILD_DIR "/test/llvm_test_code/" SUB) // Remove wrapped tests in case GTEST_SKIP is not available. This is needed as // LLVM currently ships with an older version of gtest (<1.10.0) that does not From 1aee661d6220df07205bad213b9d503251923add Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 2 Oct 2023 15:38:01 +0200 Subject: [PATCH 10/35] Greater build variety in the CI --- .github/workflows/ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0240ebe2d..94f19503c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,12 @@ jobs: fail-fast: true matrix: compiler: [ [clang++-14, clang-14] ] - build: [ Debug, Release ] + build: [ DebugSan, Release ] + include: + - build: DebugSan + flags: -DPHASAR_BUILD_DYNLIB=ON + - build: Release + flags: -DPHASAR_ENABLE_DYNAMIC_LOG=OFF continue-on-error: false steps: @@ -71,6 +76,7 @@ jobs: -DCMAKE_CXX_COMPILER=$CXX \ -DBUILD_SWIFT_TESTS=1 \ -DPHASAR_DEBUG_LIBDEPS=ON \ + ${{ matrix.flags }} \ -G Ninja cmake --build . From 7911cd97da08b61fc6ea8e18983f9a04f51c164d Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 2 Oct 2023 17:59:21 +0200 Subject: [PATCH 11/35] Minimize direct modification of CMAKE_CXX_FLAGS + use portable variants of some compilation flags if available + add the ability to turn on -march=native + minor --- CMakeLists.txt | 69 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 38ad8245e..5ec12f355 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,14 @@ cmake_minimum_required (VERSION 3.9) cmake_policy(SET CMP0069 NEW) set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) +# Allow overwriting options of external projects from this CMakeLists file +cmake_policy(SET CMP0077 NEW) +set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) + +# Allow portable use of CMAKE_VISIBILITY_INLINES_HIDDEN not only for shared libraries +cmake_policy(SET CMP0063 NEW) +set(CMAKE_POLICY_DEFAULT_CMP0063 NEW) + # Check if we build within the llvm source tree if (DEFINED LLVM_MAIN_SRC_DIR) set(PHASAR_IN_TREE 1) @@ -18,7 +26,7 @@ option(PHASAR_EXPERIMENTAL_CXX20 "Build phasar in C++20 mode. This is an experim set(CMAKE_EXPORT_COMPILE_COMMANDS YES) if(PHASAR_EXPERIMENTAL_CXX20) - message(STATUS "Selected experimental C++ build") + message(STATUS "Selected experimental C++20 build") set(CMAKE_CXX_STANDARD 20) else() set(CMAKE_CXX_STANDARD 17) @@ -34,19 +42,55 @@ if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build mode ('DebugSan' or 'Debug' or 'Release', default is 'Debug')" FORCE) endif () +option(CMAKE_VISIBILITY_INLINES_HIDDEN "Hide inlined functions from the DSO table (default ON)" ON) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -MP -fstack-protector-strong -ffunction-sections -fdata-sections -pipe") + +# NOTE: Use gcc -march=native -Q --help=target | grep -- '-march=' | cut -f3 +# to check the architecture detected by match=native +set(PHASAR_TARGET_ARCH "" CACHE STRING "Optimize the build for the given target architecture, e.g. -march=native. Most useful in Release builds. Disabled by default") + +if (NOT PHASAR_TARGET_ARCH STREQUAL "") + include(CheckCXXCompilerFlag) + check_cxx_compiler_flag("-march=${PHASAR_TARGET_ARCH}" MARCH_SUPPORTED) + if(MARCH_SUPPORTED) + message(STATUS "Target architecture ${PHASAR_TARGET_ARCH} enabled") + add_compile_options(-march=${PHASAR_TARGET_ARCH}) + else() + message(STATUS "Target architecture ${PHASAR_TARGET_ARCH} not supported") + endif() +endif() + +# TODO: Once available, we may want to use -fextend-lifetimes on Debug- and RelWithDebInfo builds to improve debugging experience +# https://reviews.llvm.org/D157613 + if(CMAKE_BUILD_TYPE STREQUAL "DebugSan") - message(STATUS "Selected Debug Build with sanitizers") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -MP -fvisibility-inlines-hidden -fstack-protector-strong -ffunction-sections -fdata-sections -pipe -g -fno-omit-frame-pointer -fsanitize=address,undefined") + message(STATUS "Selected Debug Build with Sanitizers") + add_compile_options( + -fno-omit-frame-pointer + -fsanitize=address,undefined + -O1 + ) + add_link_options( + -fsanitize=address,undefined + ) elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Selected Debug Build") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -MP -fvisibility-inlines-hidden -fstack-protector-strong -ffunction-sections -fdata-sections -pipe -g") + add_compile_options( + -Og + -fno-omit-frame-pointer + ) +elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") + message(STATUS "Selected Optimized Debug Build (RelWithDebInfo") + add_compile_options( + -fno-omit-frame-pointer + ) else() message(STATUS "Selected Release Build") include(CheckIPOSupported) check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT LTO_SUPPORT_ERROR) - if(LTO_SUPPORTED) message(STATUS "IPO/LTO enabled") set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) # LTO @@ -54,9 +98,6 @@ else() message(STATUS "IPO/LTO not supported: ${LTO_SUPPORT_ERROR}") endif() - - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -MP -fvisibility-inlines-hidden -fstack-protector-strong -ffunction-sections -fdata-sections -pipe") - endif() # Enable testing @@ -104,12 +145,18 @@ endif() option(PHASAR_ENABLE_WARNINGS "Enable warnings" ON) if (PHASAR_ENABLE_WARNINGS) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-variable -Wno-unused-parameter -Wno-return-type-c-linkage ") + add_compile_options( + -Wall + -Wextra + -Wno-unused-variable + -Wno-unused-parameter + -Wno-return-type-c-linkage + ) endif (PHASAR_ENABLE_WARNINGS) option(PHASAR_ENABLE_PIC "Build Position-Independed Code" ON) if (PHASAR_ENABLE_PIC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") + set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif (PHASAR_ENABLE_PIC) if (NOT PHASAR_ENABLE_PAMM) @@ -132,7 +179,7 @@ option(PHASAR_ENABLE_DYNAMIC_LOG "Makes it possible to switch the logger on and if (PHASAR_ENABLE_DYNAMIC_LOG) message(STATUS "Dynamic log enabled") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDYNAMIC_LOG") + add_compile_definitions(DYNAMIC_LOG) else() message(STATUS "Dynamic log disabled") endif() From 31edaada778eb47350646d8a21681a84380278f0 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 2 Oct 2023 20:13:19 +0200 Subject: [PATCH 12/35] Add compile options only for C++ build + link LLVM publicly to support BUILD_SHARED_LIBS --- CMakeLists.txt | 33 ++++++++++++++++++--------------- cmake/phasar_macros.cmake | 32 ++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ec12f355..dd0a04070 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,10 @@ include(GNUInstallDirs) set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF) +set(PHASAR_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PHASAR_SRC_DIR}/cmake") +include("phasar_macros") + if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build mode ('DebugSan' or 'Debug' or 'Release', default is 'Debug')" FORCE) endif () @@ -55,7 +59,7 @@ if (NOT PHASAR_TARGET_ARCH STREQUAL "") check_cxx_compiler_flag("-march=${PHASAR_TARGET_ARCH}" MARCH_SUPPORTED) if(MARCH_SUPPORTED) message(STATUS "Target architecture ${PHASAR_TARGET_ARCH} enabled") - add_compile_options(-march=${PHASAR_TARGET_ARCH}) + add_cxx_compile_options(-march=${PHASAR_TARGET_ARCH}) else() message(STATUS "Target architecture ${PHASAR_TARGET_ARCH} not supported") endif() @@ -66,7 +70,7 @@ endif() if(CMAKE_BUILD_TYPE STREQUAL "DebugSan") message(STATUS "Selected Debug Build with Sanitizers") - add_compile_options( + add_cxx_compile_options( -fno-omit-frame-pointer -fsanitize=address,undefined -O1 @@ -76,13 +80,13 @@ if(CMAKE_BUILD_TYPE STREQUAL "DebugSan") ) elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Selected Debug Build") - add_compile_options( + add_cxx_compile_options( -Og -fno-omit-frame-pointer ) elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") message(STATUS "Selected Optimized Debug Build (RelWithDebInfo") - add_compile_options( + add_cxx_compile_options( -fno-omit-frame-pointer ) else() @@ -108,15 +112,10 @@ enable_testing() # message(FATAL_ERROR "Phasar is not a llvm drop-in, abort!") # endif() -set(PHASAR_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PHASAR_SRC_DIR}/cmake") - file(STRINGS ${PHASAR_SRC_DIR}/include/phasar/Config/Version.h VERSION_NUMBER_FILE) string(REPLACE " " ";" VERSION_NUMBER_FILE ${VERSION_NUMBER_FILE}) list(GET VERSION_NUMBER_FILE 2 VERSION_NUMBER_PHASAR) -include("phasar_macros") - option(PHASAR_BUILD_UNITTESTS "Build all tests (default is ON)" ON) option(BUILD_SWIFT_TESTS "Builds the Swift tests (Swift compiler has to be installed manually beforehand!)" OFF) @@ -145,7 +144,7 @@ endif() option(PHASAR_ENABLE_WARNINGS "Enable warnings" ON) if (PHASAR_ENABLE_WARNINGS) - add_compile_options( + add_cxx_compile_options( -Wall -Wextra -Wno-unused-variable @@ -164,10 +163,10 @@ if (NOT PHASAR_ENABLE_PAMM) set_property(CACHE PHASAR_ENABLE_PAMM PROPERTY STRINGS "Off" "Core" "Full") endif() if(PHASAR_ENABLE_PAMM STREQUAL "Core" AND NOT PHASAR_BUILD_UNITTESTS) - add_compile_definitions(PAMM_CORE) + add_cxx_compile_definitions(PAMM_CORE) message(STATUS "PAMM metric severity level: Core") elseif(PHASAR_ENABLE_PAMM STREQUAL "Full" AND NOT PHASAR_BUILD_UNITTESTS) - add_compile_definitions(PAMM_FULL) + add_cxx_compile_definitions(PAMM_FULL) message(STATUS "PAMM metric severity level: Full") elseif(PHASAR_BUILD_UNITTESTS AND (PHASAR_ENABLE_PAMM STREQUAL "Core" OR PHASAR_ENABLE_PAMM STREQUAL "Full")) message(WARNING "PAMM metric severity level: Off (due to unittests)") @@ -179,7 +178,7 @@ option(PHASAR_ENABLE_DYNAMIC_LOG "Makes it possible to switch the logger on and if (PHASAR_ENABLE_DYNAMIC_LOG) message(STATUS "Dynamic log enabled") - add_compile_definitions(DYNAMIC_LOG) + add_cxx_compile_definitions(DYNAMIC_LOG) else() message(STATUS "Dynamic log disabled") endif() @@ -215,8 +214,8 @@ else() set(PHASAR_CONFIG_INSTALL_DIR "${PHASAR_CUSTOM_CONFIG_INSTALL_DIR}") endif() -add_compile_definitions(PHASAR_CONFIG_DIR="${PHASAR_CONFIG_INSTALL_DIR}") -add_compile_definitions(PHASAR_DIR="${PHASAR_SRC_DIR}") +add_cxx_compile_definitions(PHASAR_CONFIG_DIR="${PHASAR_CONFIG_INSTALL_DIR}") +add_cxx_compile_definitions(PHASAR_DIR="${PHASAR_SRC_DIR}") ### Adding external libraries @@ -280,6 +279,10 @@ if (NOT PHASAR_IN_TREE) link_directories(${LLVM_LIB_PATH} ${LLVM_LIBRARY_DIRS}) find_library(LLVM_LIBRARY NAMES LLVM PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) + if(BUILD_SHARED_LIBS AND NOT ${LLVM_LIBRARY} STREQUAL "LLVM_LIBRARY-NOTFOUND") + message(STATUS "Found consolidated shared LLVM lib ${LLVM_LIBRARY} that will be linked against.") + set(USE_LLVM_FAT_LIB ON) + endif() endif() separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS}) diff --git a/cmake/phasar_macros.cmake b/cmake/phasar_macros.cmake index 0e8c60e04..27b7d0134 100644 --- a/cmake/phasar_macros.cmake +++ b/cmake/phasar_macros.cmake @@ -1,3 +1,21 @@ + +macro(phasar_link_llvm executable) + # llvm_config links LLVM as LINK_PRIVATE. We want to LINK_PUBLIC + if (USE_LLVM_FAT_LIB) + target_link_libraries(${executable} LINK_PUBLIC LLVM) + else() + llvm_map_components_to_libnames(LLVM_LIBRARIES ${LLVM_LINK_COMPONENTS}) + target_link_libraries(${executable} LINK_PUBLIC ${LLVM_LIBRARIES}) + endif() +endmacro() + +macro(add_cxx_compile_options opts) + add_compile_options("$<$:${opts}>") +endmacro() +macro(add_cxx_compile_definitions defs) + add_compile_definitions("$<$:${defs}>") +endmacro() + function(add_phasar_unittest test_name) message("Set-up unittest: ${test_name}") get_filename_component(test ${test_name} NAME_WE) @@ -6,11 +24,7 @@ function(add_phasar_unittest test_name) ) add_dependencies(PhasarUnitTests ${test}) - if(USE_LLVM_FAT_LIB) - llvm_config(${test} USE_SHARED ${LLVM_LINK_COMPONENTS}) - else() - llvm_config(${test} ${LLVM_LINK_COMPONENTS}) - endif() + phasar_link_llvm(${test}) target_link_libraries(${test} LINK_PUBLIC @@ -195,13 +209,7 @@ macro(add_phasar_library name) endforeach(lib) endif(PHASAR_LINK_LIBS) - if(LLVM_LINK_COMPONENTS) - if(USE_LLVM_FAT_LIB) - llvm_config(${name} USE_SHARED ${LLVM_LINK_COMPONENTS}) - else() - llvm_config(${name} ${LLVM_LINK_COMPONENTS}) - endif() - endif(LLVM_LINK_COMPONENTS) + phasar_link_llvm(${name}) if(MSVC) get_target_property(cflag ${name} COMPILE_FLAGS) From bc53ffbc0badf19286f75af2a3832791334257ba Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Tue, 3 Oct 2023 12:12:32 +0200 Subject: [PATCH 13/35] Only add asan for CXX builds --- CMakeLists.txt | 2 +- cmake/phasar_macros.cmake | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dd0a04070..b8e6a52c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,7 +75,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "DebugSan") -fsanitize=address,undefined -O1 ) - add_link_options( + add_cxx_link_options( -fsanitize=address,undefined ) elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") diff --git a/cmake/phasar_macros.cmake b/cmake/phasar_macros.cmake index 27b7d0134..8b8f4db41 100644 --- a/cmake/phasar_macros.cmake +++ b/cmake/phasar_macros.cmake @@ -15,6 +15,9 @@ endmacro() macro(add_cxx_compile_definitions defs) add_compile_definitions("$<$:${defs}>") endmacro() +macro(add_cxx_link_options opts) + add_link_options("$<$:${opts}>") +endmacro() function(add_phasar_unittest test_name) message("Set-up unittest: ${test_name}") From 6127bc6357c6088642254733c8e3a61c211aecbf Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Tue, 3 Oct 2023 12:44:04 +0200 Subject: [PATCH 14/35] Move config defines to config.h.in --- CMakeLists.txt | 16 ++++++---------- config.h.in | 12 +++++++++--- include/phasar/Config/Configuration.h | 3 --- include/phasar/Utils/Logger.h | 2 ++ include/phasar/Utils/PAMMMacros.h | 2 ++ lib/Config/Configuration.cpp | 10 ++++++++-- unittests/TestUtils/TestConfig.h | 3 ++- 7 files changed, 29 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b8e6a52c9..f90eaa965 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -163,10 +163,10 @@ if (NOT PHASAR_ENABLE_PAMM) set_property(CACHE PHASAR_ENABLE_PAMM PROPERTY STRINGS "Off" "Core" "Full") endif() if(PHASAR_ENABLE_PAMM STREQUAL "Core" AND NOT PHASAR_BUILD_UNITTESTS) - add_cxx_compile_definitions(PAMM_CORE) + set(PAMM_CORE ON) message(STATUS "PAMM metric severity level: Core") elseif(PHASAR_ENABLE_PAMM STREQUAL "Full" AND NOT PHASAR_BUILD_UNITTESTS) - add_cxx_compile_definitions(PAMM_FULL) + set(PAMM_FULL ON) message(STATUS "PAMM metric severity level: Full") elseif(PHASAR_BUILD_UNITTESTS AND (PHASAR_ENABLE_PAMM STREQUAL "Core" OR PHASAR_ENABLE_PAMM STREQUAL "Full")) message(WARNING "PAMM metric severity level: Off (due to unittests)") @@ -178,14 +178,11 @@ option(PHASAR_ENABLE_DYNAMIC_LOG "Makes it possible to switch the logger on and if (PHASAR_ENABLE_DYNAMIC_LOG) message(STATUS "Dynamic log enabled") - add_cxx_compile_definitions(DYNAMIC_LOG) + set(DYNAMIC_LOG ON) else() message(STATUS "Dynamic log disabled") endif() -configure_file(config.h.in config.h @ONLY) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) - include_directories( ${PHASAR_SRC_DIR}/include ) @@ -214,10 +211,6 @@ else() set(PHASAR_CONFIG_INSTALL_DIR "${PHASAR_CUSTOM_CONFIG_INSTALL_DIR}") endif() -add_cxx_compile_definitions(PHASAR_CONFIG_DIR="${PHASAR_CONFIG_INSTALL_DIR}") -add_cxx_compile_definitions(PHASAR_DIR="${PHASAR_SRC_DIR}") - - ### Adding external libraries # Threads find_package(Threads) @@ -349,6 +342,9 @@ if (PHASAR_ENABLE_CLANG_TIDY_DURING_BUILD) ) endif () +configure_file(config.h.in include/phasar/Config/phasar-config.h @ONLY) +include_directories("${CMAKE_CURRENT_BINARY_DIR}/include/") + # Add PhASAR's subdirectories add_subdirectory(include) add_subdirectory(lib) diff --git a/config.h.in b/config.h.in index ac0e9c09a..8694a8a90 100644 --- a/config.h.in +++ b/config.h.in @@ -1,7 +1,13 @@ -#ifndef __CONFIG_H__ -#define __CONFIG_H__ +#ifndef PHASAR_CONFIG_CONFIG_H +#define PHASAR_CONFIG_CONFIG_H #define PHASAR_SRC_DIR "@CMAKE_SOURCE_DIR@" #define PHASAR_BUILD_DIR "@CMAKE_BINARY_DIR@" +#define PHASAR_CONFIG_DIR "@PHASAR_CONFIG_INSTALL_DIR@" -#endif /* __CONFIG_H__ */ +#cmakedefine PAMM_CORE +#cmakedefine PAMM_FULL + +#cmakedefine DYNAMIC_LOG + +#endif /* PHASAR_CONFIG_CONFIG_H */ diff --git a/include/phasar/Config/Configuration.h b/include/phasar/Config/Configuration.h index 24db00a2d..86528c338 100644 --- a/include/phasar/Config/Configuration.h +++ b/include/phasar/Config/Configuration.h @@ -28,9 +28,6 @@ #include #include -#define XSTR(S) STR(S) -#define STR(S) #S - namespace psr { class PhasarConfig { diff --git a/include/phasar/Utils/Logger.h b/include/phasar/Utils/Logger.h index 7ffdfdc2d..b35b3f806 100644 --- a/include/phasar/Utils/Logger.h +++ b/include/phasar/Utils/Logger.h @@ -10,6 +10,8 @@ #ifndef PHASAR_UTILS_LOGGER_H #define PHASAR_UTILS_LOGGER_H +#include "phasar/Config/phasar-config.h" + #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Compiler.h" // LLVM_UNLIKELY diff --git a/include/phasar/Utils/PAMMMacros.h b/include/phasar/Utils/PAMMMacros.h index f41ef4a0e..cc74e6631 100644 --- a/include/phasar/Utils/PAMMMacros.h +++ b/include/phasar/Utils/PAMMMacros.h @@ -17,6 +17,8 @@ #ifndef PHASAR_UTILS_PAMMMACROS_H_ #define PHASAR_UTILS_PAMMMACROS_H_ +#include "phasar/Config/phasar-config.h" + namespace psr { /// Defines the different level of severity of PAMM's performance evaluation enum class PAMM_SEVERITY_LEVEL { Off = 0, Core, Full }; // NOLINT diff --git a/lib/Config/Configuration.cpp b/lib/Config/Configuration.cpp index 5ad3665c1..8e9708f94 100644 --- a/lib/Config/Configuration.cpp +++ b/lib/Config/Configuration.cpp @@ -16,6 +16,7 @@ #include "phasar/Config/Configuration.h" +#include "phasar/Config/phasar-config.h" #include "phasar/Utils/ErrorHandling.h" #include "phasar/Utils/IO.h" #include "phasar/Utils/Logger.h" @@ -32,6 +33,9 @@ #include #include +#define XSTR(S) STR(S) +#define STR(S) #S + using namespace psr; namespace psr { @@ -43,10 +47,12 @@ llvm::StringRef PhasarConfig::GlobalConfigurationDirectory() noexcept { return PHASAR_CONFIG_DIR; } -llvm::StringRef PhasarConfig::PhasarDirectory() noexcept { return PHASAR_DIR; } +llvm::StringRef PhasarConfig::PhasarDirectory() noexcept { + return PHASAR_SRC_DIR; +} llvm::StringRef PhasarConfig::DefaultSourceSinkFunctionsPath() noexcept { - return PHASAR_DIR "/config/phasar-source-sink-function.json"; + return PHASAR_SRC_DIR "/config/phasar-source-sink-function.json"; } PhasarConfig::PhasarConfig() { diff --git a/unittests/TestUtils/TestConfig.h b/unittests/TestUtils/TestConfig.h index efd0076c3..e162b619b 100644 --- a/unittests/TestUtils/TestConfig.h +++ b/unittests/TestUtils/TestConfig.h @@ -1,9 +1,10 @@ #ifndef UNITTEST_TESTUTILS_TESTCONFIG_H_ #define UNITTEST_TESTUTILS_TESTCONFIG_H_ +#include "phasar/Config/phasar-config.h" + #include "llvm/ADT/StringRef.h" -#include "config.h" #include "gtest/gtest.h" #include From 2080b2939958332e1334ddba673f27b092b7888e Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Tue, 3 Oct 2023 13:35:56 +0200 Subject: [PATCH 15/35] Fix add_cxx_* macros + link more privately --- CMakeLists.txt | 6 ++++++ cmake/phasar_macros.cmake | 30 ++++++++++++------------------ lib/Controller/CMakeLists.txt | 4 ++-- lib/PhasarClang/CMakeLists.txt | 4 ++-- lib/PhasarPass/CMakeLists.txt | 8 ++++---- lib/Utils/CMakeLists.txt | 4 ++-- tools/example-tool/CMakeLists.txt | 3 +-- tools/phasar-cli/CMakeLists.txt | 4 ++-- 8 files changed, 31 insertions(+), 32 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f90eaa965..cf6847983 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,11 @@ include(GNUInstallDirs) set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF) +set(CMAKE_CONFIGURATION_TYPES DebugSan Debug RelWithDebInfo Release CACHE STRING "Configuration types: DebugSan, Debug, RelWithDebInfo and Release" FORCE) + +set(DEBUG_CONFIGURATIONS DEBUG DEBUGSAN CACHE INTERNAL "" FORCE) +set(RELEASE_CONFIGURATIONS RELWITHDEBINFO RELEASE CACHE INTERNAL "" FORCE) + set(PHASAR_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PHASAR_SRC_DIR}/cmake") include("phasar_macros") @@ -73,6 +78,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "DebugSan") add_cxx_compile_options( -fno-omit-frame-pointer -fsanitize=address,undefined + -g -O1 ) add_cxx_link_options( diff --git a/cmake/phasar_macros.cmake b/cmake/phasar_macros.cmake index 8b8f4db41..903b9df2b 100644 --- a/cmake/phasar_macros.cmake +++ b/cmake/phasar_macros.cmake @@ -1,22 +1,22 @@ macro(phasar_link_llvm executable) - # llvm_config links LLVM as LINK_PRIVATE. We want to LINK_PUBLIC + # llvm_config links LLVM as PRIVATE. We need to link PUBLIC if (USE_LLVM_FAT_LIB) - target_link_libraries(${executable} LINK_PUBLIC LLVM) + target_link_libraries(${executable} PUBLIC LLVM) else() llvm_map_components_to_libnames(LLVM_LIBRARIES ${LLVM_LINK_COMPONENTS}) - target_link_libraries(${executable} LINK_PUBLIC ${LLVM_LIBRARIES}) + target_link_libraries(${executable} PUBLIC ${LLVM_LIBRARIES}) endif() endmacro() -macro(add_cxx_compile_options opts) - add_compile_options("$<$:${opts}>") +macro(add_cxx_compile_options) + add_compile_options("$<$:${ARGN}>") endmacro() -macro(add_cxx_compile_definitions defs) - add_compile_definitions("$<$:${defs}>") +macro(add_cxx_compile_definitions) + add_compile_definitions("$<$:${ARGN}>") endmacro() -macro(add_cxx_link_options opts) - add_link_options("$<$:${opts}>") +macro(add_cxx_link_options) + add_link_options("$<$:${ARGN}>") endmacro() function(add_phasar_unittest test_name) @@ -30,14 +30,8 @@ function(add_phasar_unittest test_name) phasar_link_llvm(${test}) target_link_libraries(${test} - LINK_PUBLIC + LINK_PRIVATE phasar - nlohmann_json_schema_validator - ${SQLITE3_LIBRARY} - ${Boost_LIBRARIES} - ${CMAKE_DL_LIBS} - ${CMAKE_THREAD_LIBS_INIT} - curl gtest ) @@ -205,9 +199,9 @@ macro(add_phasar_library name) if(PHASAR_LINK_LIBS) foreach(lib ${PHASAR_LINK_LIBS}) if(PHASAR_DEBUG_LIBDEPS) - target_link_libraries(${name} LINK_PRIVATE ${lib}) + target_link_libraries(${name} PRIVATE ${lib}) else() - target_link_libraries(${name} LINK_PUBLIC ${lib}) + target_link_libraries(${name} PUBLIC ${lib}) endif(PHASAR_DEBUG_LIBDEPS) endforeach(lib) endif(PHASAR_LINK_LIBS) diff --git a/lib/Controller/CMakeLists.txt b/lib/Controller/CMakeLists.txt index 801165960..1d7a898dd 100644 --- a/lib/Controller/CMakeLists.txt +++ b/lib/Controller/CMakeLists.txt @@ -24,8 +24,8 @@ add_phasar_library(phasar_controller ) target_link_libraries(phasar_controller - LINK_PUBLIC - ${PHASAR_STD_FILESYSTEM} + PRIVATE + ${PHASAR_STD_FILESYSTEM} ) set_target_properties(phasar_controller diff --git a/lib/PhasarClang/CMakeLists.txt b/lib/PhasarClang/CMakeLists.txt index 5d74c5972..306f06449 100644 --- a/lib/PhasarClang/CMakeLists.txt +++ b/lib/PhasarClang/CMakeLists.txt @@ -18,8 +18,8 @@ add_phasar_library(phasar_clang ) target_link_libraries(phasar_clang - LINK_PUBLIC - ${CLANG_LIBRARY} + PUBLIC + ${CLANG_LIBRARY} ) set_target_properties(phasar_clang diff --git a/lib/PhasarPass/CMakeLists.txt b/lib/PhasarPass/CMakeLists.txt index 29ee4c850..9afa367f0 100644 --- a/lib/PhasarPass/CMakeLists.txt +++ b/lib/PhasarPass/CMakeLists.txt @@ -26,10 +26,10 @@ add_phasar_library(phasar_pass # llvm user side only has to specify one library. target_link_libraries(phasar_pass - LINK_PUBLIC - ${CMAKE_THREAD_LIBS_INIT} - ${PHASAR_LINK_LIBS} - ${Boost_LIBRARIES} + PUBLIC + ${CMAKE_THREAD_LIBS_INIT} + ${PHASAR_LINK_LIBS} + ${Boost_LIBRARIES} ) set_target_properties(phasar_pass diff --git a/lib/Utils/CMakeLists.txt b/lib/Utils/CMakeLists.txt index a19d5a1a4..6d4f11a92 100644 --- a/lib/Utils/CMakeLists.txt +++ b/lib/Utils/CMakeLists.txt @@ -23,8 +23,8 @@ add_phasar_library(phasar_utils target_include_directories(phasar_utils PUBLIC ${LLVM_INCLUDE_DIRS}) target_link_libraries(phasar_utils - LINK_PUBLIC - ${PHASAR_STD_FILESYSTEM} + PRIVATE + ${PHASAR_STD_FILESYSTEM} ) set_target_properties(phasar_utils diff --git a/tools/example-tool/CMakeLists.txt b/tools/example-tool/CMakeLists.txt index 4b440878d..c55b36766 100644 --- a/tools/example-tool/CMakeLists.txt +++ b/tools/example-tool/CMakeLists.txt @@ -12,9 +12,8 @@ else() endif() target_link_libraries(myphasartool - LINK_PUBLIC + PRIVATE phasar - LINK_PRIVATE ${PHASAR_STD_FILESYSTEM} ) diff --git a/tools/phasar-cli/CMakeLists.txt b/tools/phasar-cli/CMakeLists.txt index ff5b64fc9..a20a7d6a8 100644 --- a/tools/phasar-cli/CMakeLists.txt +++ b/tools/phasar-cli/CMakeLists.txt @@ -23,7 +23,7 @@ endif() # Warning! There is a another listing of libraries inside cmake/phasar_macros.cmake. # If this list is altered the other one should be altered accordingly. target_link_libraries(phasar-cli - LINK_PUBLIC + PRIVATE phasar_config phasar_controller phasar_llvm_controlflow @@ -37,7 +37,7 @@ target_link_libraries(phasar-cli phasar_llvm_pointer phasar_llvm phasar_llvm_typehierarchy - LINK_PRIVATE + ${PHASAR_STD_FILESYSTEM} ) From 740a60bfa53f8b1ff3897988258cee1b37e74e59 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Tue, 3 Oct 2023 14:54:08 +0200 Subject: [PATCH 16/35] Make PhasarClang optional --- .github/workflows/ci.yml | 6 +-- CMakeLists.txt | 91 +++++++++++++++++++++------------------- lib/CMakeLists.txt | 4 +- unittests/CMakeLists.txt | 4 +- 4 files changed, 56 insertions(+), 49 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 94f19503c..c41945f9c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,7 +64,6 @@ jobs: swift-version: "5.8.1" - name: Building Phasar in ${{ matrix.build }} with ${{ matrix.compiler[0] }} env: - BUILD_TYPE: ${{ matrix.build }} CXX: ${{ matrix.compiler[0] }} CC: ${{ matrix.compiler[1] }} shell: bash @@ -72,9 +71,8 @@ jobs: mkdir build cd build cmake .. \ - -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ - -DCMAKE_CXX_COMPILER=$CXX \ - -DBUILD_SWIFT_TESTS=1 \ + -DCMAKE_BUILD_TYPE=${{ matrix.build }} \ + -DBUILD_SWIFT_TESTS=ON \ -DPHASAR_DEBUG_LIBDEPS=ON \ ${{ matrix.flags }} \ -G Ninja diff --git a/CMakeLists.txt b/CMakeLists.txt index cf6847983..32999d844 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -292,51 +292,56 @@ if(NOT LLVM_ENABLE_RTTI) endif() # Clang -# The clang-cpp shared library is now the preferred way to link dynamically against libclang if we build out of tree. -if(NOT PHASAR_IN_TREE) - find_library(CLANG_LIBRARY NAMES clang-cpp libclang-cpp HINTS ${LLVM_LIBRARY_DIRS}) - if(${CLANG_LIBRARY} STREQUAL "CLANG_LIBRARY-NOTFOUND") - set(NEED_LIBCLANG_COMPONENT_LIBS on) + +option(BUILD_PHASAR_CLANG "Build the phasar-clang library (default is ON)" ON) + +if(BUILD_PHASAR_CLANG) + # The clang-cpp shared library is now the preferred way to link dynamically against libclang if we build out of tree. + if(NOT PHASAR_IN_TREE) + find_library(CLANG_LIBRARY NAMES clang-cpp libclang-cpp HINTS ${LLVM_LIBRARY_DIRS}) + if(${CLANG_LIBRARY} STREQUAL "CLANG_LIBRARY-NOTFOUND") + set(NEED_LIBCLANG_COMPONENT_LIBS on) + endif() + endif() + # As fallback, look for the small clang libraries + if(PHASAR_IN_TREE OR NEED_LIBCLANG_COMPONENT_LIBS) + set(CLANG_LIBRARY + clangTooling + clangFrontendTool + clangFrontend + clangDriver + clangSerialization + clangCodeGen + clangParse + clangSema + clangStaticAnalyzerFrontend + clangStaticAnalyzerCheckers + clangStaticAnalyzerCore + clangAnalysis + clangARCMigrate + clangRewrite + clangRewriteFrontend + clangEdit + clangAST + clangASTMatchers + clangLex + clangBasic + LLVMFrontendOpenMP) + endif() + if (NOT PHASAR_IN_TREE) + # Only search for clang if we build out of tree + link_directories(${CLANG_LIB_PATH}) endif() -endif() -# As fallback, look for the small clang libraries -if(PHASAR_IN_TREE OR NEED_LIBCLANG_COMPONENT_LIBS) - set(CLANG_LIBRARY - clangTooling - clangFrontendTool - clangFrontend - clangDriver - clangSerialization - clangCodeGen - clangParse - clangSema - clangStaticAnalyzerFrontend - clangStaticAnalyzerCheckers - clangStaticAnalyzerCore - clangAnalysis - clangARCMigrate - clangRewrite - clangRewriteFrontend - clangEdit - clangAST - clangASTMatchers - clangLex - clangBasic - LLVMFrontendOpenMP) -endif() -if (NOT PHASAR_IN_TREE) - # Only search for clang if we build out of tree - link_directories(${CLANG_LIB_PATH}) -endif() -if (PHASAR_IN_TREE) - # Phasar needs clang headers, specificaly some that are generated by clangs table-gen - include_directories(SYSTEM - ${CLANG_INCLUDE_DIR} - ${PHASAR_SRC_DIR}/../clang/include - ${PROJECT_BINARY_DIR}/tools/clang/include - ) -endif() + if (PHASAR_IN_TREE) + # Phasar needs clang headers, specificaly some that are generated by clangs table-gen + include_directories(SYSTEM + ${CLANG_INCLUDE_DIR} + ${PHASAR_SRC_DIR}/../clang/include + ${PROJECT_BINARY_DIR}/tools/clang/include + ) + endif() +endif(BUILD_PHASAR_CLANG) # Set up clang-tidy to run during PhASAR's compilation to indicate code smells if (PHASAR_ENABLE_CLANG_TIDY_DURING_BUILD) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 2045abbfe..96a0e5396 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,13 +1,15 @@ add_subdirectory(AnalysisStrategy) add_subdirectory(PhasarLLVM) add_subdirectory(PhasarPass) -add_subdirectory(PhasarClang) add_subdirectory(DB) add_subdirectory(Config) add_subdirectory(Utils) add_subdirectory(Controller) add_subdirectory(Pointer) add_subdirectory(ControlFlow) +if(BUILD_PHASAR_CLANG) + add_subdirectory(PhasarClang) +endif() set(PHASAR_LINK_LIBS phasar_utils diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index b30f77c73..931faf8a9 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -23,6 +23,8 @@ endfunction() include_directories(TestUtils) add_subdirectory(DB) -add_subdirectory(PhasarClang) add_subdirectory(PhasarLLVM) add_subdirectory(Utils) +if(BUILD_PHASAR_CLANG) + add_subdirectory(PhasarClang) +endif() From 4052d1e55568604177fc7eef708b7597210cb728 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Tue, 3 Oct 2023 16:00:20 +0200 Subject: [PATCH 17/35] Install phasar-config.h --- .github/ISSUE_TEMPLATE/bug_report.md | 11 ++++++----- CMakeLists.txt | 12 ++++++++++++ config.h.in | 2 -- tools/example-tool/CMakeLists.txt | 2 -- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a571a74a2..24e0ca0b9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -11,7 +11,7 @@ assignees: '' Replace the empty checkboxes [ ] below with checked ones [x] accordingly. --> - [ ] I have searched open and closed issues for duplicates - - [ ] I made sure that I am not using an old project version (DO: pull Phasar, update git submodules, rebuild the project and check if the bug is still there) + - [ ] I made sure that I am not using an old project version (DO: pull PhASAR, update git submodules, rebuild the project and check if the bug is still there) ---------------------------------------- @@ -24,9 +24,9 @@ Describe here the issue that you are experiencing. - that reproduce the bug - e.g. cli arguments and flags -**Actual result:** Describe here what happens after you run the steps above (i.e. the buggy behaviour) +**Actual result:** Describe here what happens after you run the steps above (i.e. the buggy behavior) -**Expected result:** Describe here what should happen after you run the steps above (i.e. what would be the correct behaviour) +**Expected result:** Describe here what should happen after you run the steps above (i.e. what would be the correct behavior) ### Context (Environment) @@ -35,7 +35,7 @@ Describe here the issue that you are experiencing. - **phasar:** \[commit-id] - **googletest:** \[commit-id] - **json:** \[commit-id] - - **WALi-OpenNWA:** \[commit-id] + - **json-schema-validator** \[commit-id] @@ -48,11 +48,12 @@ Describe here the issue that you are experiencing. **Build Type:** - [ ] cmake + - [ ] bootstrap.sh - [ ] custom build ### Possible solution -We are happy to discuss possible solutions to this problem, especially if it origniates from a design flaw. +We are happy to discuss possible solutions to this problem, especially if it originates from a design flaw. ### Example files diff --git a/CMakeLists.txt b/CMakeLists.txt index 32999d844..12fa6f3aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,6 +110,10 @@ else() endif() +# Some preprocessor symbols that need to be available in phasar sources, but should not be installed +add_cxx_compile_definitions(PHASAR_SRC_DIR="${CMAKE_SOURCE_DIR}") +add_cxx_compile_definitions(PHASAR_BUILD_DIR="${CMAKE_BINARY_DIR}") + # Enable testing enable_testing() @@ -389,6 +393,14 @@ install(DIRECTORY include/ PATTERN "*.h" ) +# Install the config file +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/phasar/Config/ + DESTINATION include/phasar/Config + FILES_MATCHING + PATTERN "*.def" + PATTERN "*.h" +) + # Install the header only json container install(DIRECTORY external/json/single_include/ DESTINATION include diff --git a/config.h.in b/config.h.in index 8694a8a90..d5df1dd0f 100644 --- a/config.h.in +++ b/config.h.in @@ -1,8 +1,6 @@ #ifndef PHASAR_CONFIG_CONFIG_H #define PHASAR_CONFIG_CONFIG_H -#define PHASAR_SRC_DIR "@CMAKE_SOURCE_DIR@" -#define PHASAR_BUILD_DIR "@CMAKE_BINARY_DIR@" #define PHASAR_CONFIG_DIR "@PHASAR_CONFIG_INSTALL_DIR@" #cmakedefine PAMM_CORE diff --git a/tools/example-tool/CMakeLists.txt b/tools/example-tool/CMakeLists.txt index c55b36766..e4d397e70 100644 --- a/tools/example-tool/CMakeLists.txt +++ b/tools/example-tool/CMakeLists.txt @@ -19,6 +19,4 @@ target_link_libraries(myphasartool install(TARGETS myphasartool RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib ) From 319d22bd71f3f5e389e43e660dcac1b918d0e18f Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Wed, 4 Oct 2023 19:12:26 +0200 Subject: [PATCH 18/35] Out-factor DebugSan in PHASAR_ENABLE_SANITIZERS --- .github/workflows/ci.yml | 5 +++-- BreakingChanges.md | 1 + CMakeLists.txt | 28 +++++++++++++--------------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c41945f9c..ad77d9d32 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,9 +13,9 @@ jobs: fail-fast: true matrix: compiler: [ [clang++-14, clang-14] ] - build: [ DebugSan, Release ] + build: [ Debug, Release ] include: - - build: DebugSan + - build: Debug flags: -DPHASAR_BUILD_DYNLIB=ON - build: Release flags: -DPHASAR_ENABLE_DYNAMIC_LOG=OFF @@ -74,6 +74,7 @@ jobs: -DCMAKE_BUILD_TYPE=${{ matrix.build }} \ -DBUILD_SWIFT_TESTS=ON \ -DPHASAR_DEBUG_LIBDEPS=ON \ + -DPHASAR_ENABLE_SANITIZERS=ON \ ${{ matrix.flags }} \ -G Ninja cmake --build . diff --git a/BreakingChanges.md b/BreakingChanges.md index 477de93b7..ad40d45f6 100644 --- a/BreakingChanges.md +++ b/BreakingChanges.md @@ -3,6 +3,7 @@ ## Development HEAD - Default build mode is no longer `SHARED` but `STATIC`. To build in shared mode, use the cmake option `BUILD_SHARED_LIBS` which we don't recommend anymore. Consider using `PHASAR_BUILD_DYNLIB` instead to build one big libphasar.so. +- Build type `DebugSan` has been removed in favor of a new CMake option `PHASAR_ENABLE_SANITIZERS` that not only works in `Debug` mode. ## v0323 diff --git a/CMakeLists.txt b/CMakeLists.txt index 12fa6f3aa..a0ffe8e33 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,9 +38,11 @@ include(GNUInstallDirs) set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF) -set(CMAKE_CONFIGURATION_TYPES DebugSan Debug RelWithDebInfo Release CACHE STRING "Configuration types: DebugSan, Debug, RelWithDebInfo and Release" FORCE) +set(CMAKE_CONFIGURATION_TYPES Debug RelWithDebInfo Release CACHE STRING "Configuration types: Debug, RelWithDebInfo and Release" FORCE) -set(DEBUG_CONFIGURATIONS DEBUG DEBUGSAN CACHE INTERNAL "" FORCE) +option(PHASAR_ENABLE_SANITIZERS "Build PhASAR with AddressSanitizer and UBSanitizer (default is OFF)" OFF) + +set(DEBUG_CONFIGURATIONS DEBUG CACHE INTERNAL "" FORCE) set(RELEASE_CONFIGURATIONS RELWITHDEBINFO RELEASE CACHE INTERNAL "" FORCE) set(PHASAR_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) @@ -48,7 +50,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PHASAR_SRC_DIR}/cmake") include("phasar_macros") if (NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build mode ('DebugSan' or 'Debug' or 'Release', default is 'Debug')" FORCE) + set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build mode ('Debug' or 'Release', default is 'Debug')" FORCE) endif () option(CMAKE_VISIBILITY_INLINES_HIDDEN "Hide inlined functions from the DSO table (default ON)" ON) @@ -70,21 +72,22 @@ if (NOT PHASAR_TARGET_ARCH STREQUAL "") endif() endif() -# TODO: Once available, we may want to use -fextend-lifetimes on Debug- and RelWithDebInfo builds to improve debugging experience -# https://reviews.llvm.org/D157613 -if(CMAKE_BUILD_TYPE STREQUAL "DebugSan") - message(STATUS "Selected Debug Build with Sanitizers") +if (PHASAR_ENABLE_SANITIZERS) + message(STATUS "Selected ${CMAKE_BUILD_TYPE} Build with Sanitizers") add_cxx_compile_options( -fno-omit-frame-pointer -fsanitize=address,undefined - -g - -O1 ) add_cxx_link_options( -fsanitize=address,undefined ) -elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") +endif() + +# TODO: Once available, we may want to use -fextend-lifetimes on Debug- and RelWithDebInfo builds to improve debugging experience +# https://reviews.llvm.org/D157613 + +if(CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Selected Debug Build") add_cxx_compile_options( -Og @@ -117,11 +120,6 @@ add_cxx_compile_definitions(PHASAR_BUILD_DIR="${CMAKE_BINARY_DIR}") # Enable testing enable_testing() -# TODO: allow Phasar to be build as a llvm drop-in as well -# if (NOT DEFINED LLVM_MAIN_SRC_DIR) -# message(FATAL_ERROR "Phasar is not a llvm drop-in, abort!") -# endif() - file(STRINGS ${PHASAR_SRC_DIR}/include/phasar/Config/Version.h VERSION_NUMBER_FILE) string(REPLACE " " ";" VERSION_NUMBER_FILE ${VERSION_NUMBER_FILE}) list(GET VERSION_NUMBER_FILE 2 VERSION_NUMBER_PHASAR) From 7674e70e4582096177ded73c8437294dba7e648e Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Wed, 4 Oct 2023 19:53:29 +0200 Subject: [PATCH 19/35] Allow for multi-config (not tested) --- .github/workflows/ci.yml | 3 +-- CMakeLists.txt | 32 ++++++++++++-------------------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad77d9d32..aa5052c51 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: build: [ Debug, Release ] include: - build: Debug - flags: -DPHASAR_BUILD_DYNLIB=ON + flags: -DPHASAR_BUILD_DYNLIB=ON -DPHASAR_ENABLE_SANITIZERS=ON - build: Release flags: -DPHASAR_ENABLE_DYNAMIC_LOG=OFF @@ -74,7 +74,6 @@ jobs: -DCMAKE_BUILD_TYPE=${{ matrix.build }} \ -DBUILD_SWIFT_TESTS=ON \ -DPHASAR_DEBUG_LIBDEPS=ON \ - -DPHASAR_ENABLE_SANITIZERS=ON \ ${{ matrix.flags }} \ -G Ninja cmake --build . diff --git a/CMakeLists.txt b/CMakeLists.txt index a0ffe8e33..816b3c6d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,14 +49,13 @@ set(PHASAR_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PHASAR_SRC_DIR}/cmake") include("phasar_macros") -if (NOT CMAKE_BUILD_TYPE) +if (NOT CMAKE_BUILD_TYPE AND NOT GENERATOR_IS_MULTI_CONFIG) + message(STATUS "No CMAKE_BUILD_TYPE specified, setting it to Debug") set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build mode ('Debug' or 'Release', default is 'Debug')" FORCE) endif () option(CMAKE_VISIBILITY_INLINES_HIDDEN "Hide inlined functions from the DSO table (default ON)" ON) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -MP -fstack-protector-strong -ffunction-sections -fdata-sections -pipe") - # NOTE: Use gcc -march=native -Q --help=target | grep -- '-march=' | cut -f3 # to check the architecture detected by match=native set(PHASAR_TARGET_ARCH "" CACHE STRING "Optimize the build for the given target architecture, e.g. -march=native. Most useful in Release builds. Disabled by default") @@ -87,32 +86,25 @@ endif() # TODO: Once available, we may want to use -fextend-lifetimes on Debug- and RelWithDebInfo builds to improve debugging experience # https://reviews.llvm.org/D157613 -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - message(STATUS "Selected Debug Build") - add_cxx_compile_options( - -Og - -fno-omit-frame-pointer - ) -elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") - message(STATUS "Selected Optimized Debug Build (RelWithDebInfo") - add_cxx_compile_options( - -fno-omit-frame-pointer - ) -else() - message(STATUS "Selected Release Build") +string(APPEND CMAKE_CXX_FLAGS " -MP -fstack-protector-strong -ffunction-sections -fdata-sections -pipe") +string(APPEND CMAKE_CXX_FLAGS_DEBUG " -Og -fno-omit-frame-pointer") +string(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " -fno-omit-frame-pointer") +string(APPEND CMAKE_CXX_FLAGS_RELEASE "") + +message(STATUS "Selected ${CMAKE_BUILD_TYPE} Build") +# LTO +if (GENERATOR_IS_MULTI_CONFIG OR CMAKE_BUILD_TYPE STREQUAL "Release") include(CheckIPOSupported) check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT LTO_SUPPORT_ERROR) if(LTO_SUPPORTED) - message(STATUS "IPO/LTO enabled") - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) # LTO + message(STATUS "IPO/LTO enabled in Release mode") + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE ON) # LTO else() message(STATUS "IPO/LTO not supported: ${LTO_SUPPORT_ERROR}") endif() - endif() - # Some preprocessor symbols that need to be available in phasar sources, but should not be installed add_cxx_compile_definitions(PHASAR_SRC_DIR="${CMAKE_SOURCE_DIR}") add_cxx_compile_definitions(PHASAR_BUILD_DIR="${CMAKE_BINARY_DIR}") From 85440f5f38567a2400f61aa65cd470614647658c Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Wed, 4 Oct 2023 20:34:17 +0200 Subject: [PATCH 20/35] Make dependencies independent from phasar build flags + enable more warnings --- .clang-tidy | 1 + CMakeLists.txt | 93 ++++++++++--------- .../DataFlow/Mono/Solver/InterMonoSolver.h | 4 +- include/phasar/Utils/Utilities.h | 10 +- .../ControlFlow/Resolver/OTFResolver.cpp | 2 +- .../BranchSwitchInstFlowFunction.cpp | 2 +- .../AbstractMemoryLocationFactory.cpp | 3 +- .../Problems/IDEExtendedTaintAnalysis.cpp | 2 +- lib/PhasarPass/PhasarPass.cpp | 2 +- lib/Pointer/PointsToInfo.cpp | 8 +- tools/phasar-cli/phasar-cli.cpp | 2 +- .../PhasarLLVM/Pointer/LLVMAliasSetTest.cpp | 8 +- unittests/Utils/EquivalenceClassMapTest.cpp | 2 +- 13 files changed, 77 insertions(+), 62 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 063d1090a..5d40d294d 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -25,6 +25,7 @@ Checks: '-*, -cppcoreguidelines-non-private-member-variables-in-classes, -cppcoreguidelines-init-variables, -cppcoreguidelines-macro-usage, + -cppcoreguidelines-avoid-do-while, bugprone-*, -bugprone-easily-swappable-parameters, modernize-*, diff --git a/CMakeLists.txt b/CMakeLists.txt index 816b3c6d7..83e8fdfad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -105,9 +105,6 @@ if (GENERATOR_IS_MULTI_CONFIG OR CMAKE_BUILD_TYPE STREQUAL "Release") message(STATUS "IPO/LTO not supported: ${LTO_SUPPORT_ERROR}") endif() endif() -# Some preprocessor symbols that need to be available in phasar sources, but should not be installed -add_cxx_compile_definitions(PHASAR_SRC_DIR="${CMAKE_SOURCE_DIR}") -add_cxx_compile_definitions(PHASAR_BUILD_DIR="${CMAKE_BINARY_DIR}") # Enable testing enable_testing() @@ -118,13 +115,6 @@ list(GET VERSION_NUMBER_FILE 2 VERSION_NUMBER_PHASAR) option(PHASAR_BUILD_UNITTESTS "Build all tests (default is ON)" ON) -option(BUILD_SWIFT_TESTS "Builds the Swift tests (Swift compiler has to be installed manually beforehand!)" OFF) -if (BUILD_SWIFT_TESTS) - set(CMAKE_Swift_FLAGS_RELEASE "-g") - set(CMAKE_Swift_FLAGS_RELWITHDEBINFO "-g") - enable_language(Swift) -endif(BUILD_SWIFT_TESTS) - option(PHASAR_BUILD_OPENSSL_TS_UNITTESTS "Build OPENSSL typestate tests (require OpenSSL, default is OFF)" OFF) option(PHASAR_BUILD_IR "Build IR test code (default is ON)" ON) @@ -142,17 +132,6 @@ if(PHASAR_BUILD_DYNLIB AND BUILD_SHARED_LIBS) message(FATAL_ERROR "PHASAR_BUILD_DYNLIB is incompatible with BUILD_SHARED_LIBS") endif() -option(PHASAR_ENABLE_WARNINGS "Enable warnings" ON) -if (PHASAR_ENABLE_WARNINGS) - add_cxx_compile_options( - -Wall - -Wextra - -Wno-unused-variable - -Wno-unused-parameter - -Wno-return-type-c-linkage - ) -endif (PHASAR_ENABLE_WARNINGS) - option(PHASAR_ENABLE_PIC "Build Position-Independed Code" ON) if (PHASAR_ENABLE_PIC) set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -183,10 +162,6 @@ else() message(STATUS "Dynamic log disabled") endif() -include_directories( - ${PHASAR_SRC_DIR}/include -) - if (NOT PHASAR_IN_TREE) set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) @@ -217,17 +192,14 @@ find_package(Threads) # Boost find_package(Boost 1.65.1 COMPONENTS graph REQUIRED) -include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) # Disable clang-tidy for the external projects set(CMAKE_CXX_CLANG_TIDY "") # Nlohmann JSON - set(JSON_BuildTests OFF) set(JSON_Install ON) add_subdirectory(external/json) -include_directories(SYSTEM external/json/include/) # We need to work around the behavior of nlohmann_json_schema_validator and nlohmann_json here # The validator needs the json part, but if you include it, the library of nlohmann_json_schema_validator @@ -247,29 +219,25 @@ endif() # Json Schema Validator set(JSON_VALIDATOR_INSTALL ON) add_subdirectory(external/json-schema-validator) -include_directories(SYSTEM external/json-schema-validator/src/) # Googletest if (NOT PHASAR_IN_TREE) set(BUILD_GMOCK OFF) add_subdirectory(external/googletest EXCLUDE_FROM_ALL) - include_directories(SYSTEM external/googletest/googletest/include) + set(GTEST_INCLUDE_DIR "external/googletest/googletest/include") else() # Set llvm distributed includes for gtest header - include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include) + set(GTEST_INCLUDE_DIR "${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include") endif() # SQL find_path(SQLITE3_INCLUDE_DIR NAMES sqlite3.h) find_library(SQLITE3_LIBRARY NAMES sqlite3) -include_directories(SYSTEM ${SQLITE3_INCLUDE_DIR}) # LLVM if (NOT PHASAR_IN_TREE) # Only search for LLVM if we build out of tree find_package(LLVM 14 REQUIRED CONFIG) - include_directories(SYSTEM ${LLVM_INCLUDE_DIRS}) - link_directories(${LLVM_LIB_PATH} ${LLVM_LIBRARY_DIRS}) find_library(LLVM_LIBRARY NAMES LLVM PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) if(BUILD_SHARED_LIBS AND NOT ${LLVM_LIBRARY} STREQUAL "LLVM_LIBRARY-NOTFOUND") @@ -278,15 +246,11 @@ if (NOT PHASAR_IN_TREE) endif() endif() -separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS}) -add_definitions(${LLVM_DEFINITIONS_LIST}) - if(NOT LLVM_ENABLE_RTTI) message(FATAL_ERROR "PhASAR requires a LLVM version that is built with RTTI") endif() # Clang - option(BUILD_PHASAR_CLANG "Build the phasar-clang library (default is ON)" ON) if(BUILD_PHASAR_CLANG) @@ -322,10 +286,6 @@ if(BUILD_PHASAR_CLANG) clangBasic LLVMFrontendOpenMP) endif() - if (NOT PHASAR_IN_TREE) - # Only search for clang if we build out of tree - link_directories(${CLANG_LIB_PATH}) - endif() if (PHASAR_IN_TREE) # Phasar needs clang headers, specificaly some that are generated by clangs table-gen @@ -347,9 +307,50 @@ if (PHASAR_ENABLE_CLANG_TIDY_DURING_BUILD) ) endif () +# Library Dependency Headers +include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) +include_directories(SYSTEM external/json/include/) +include_directories(SYSTEM external/json-schema-validator/src/) +include_directories(SYSTEM ${GTEST_INCLUDE_DIR}) +include_directories(SYSTEM ${SQLITE3_INCLUDE_DIR}) +if(NOT PHASAR_IN_TREE) + include_directories(SYSTEM ${LLVM_INCLUDE_DIRS}) +endif() + +# Library Dependency Dirs +if(NOT PHASAR_IN_TREE) + link_directories(${LLVM_LIB_PATH} ${LLVM_LIBRARY_DIRS}) + separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS}) + add_definitions(${LLVM_DEFINITIONS_LIST}) + if (BUILD_PHASAR_CLANG) + link_directories(${CLANG_LIB_PATH}) + endif() +endif() + + + +# Installed config configure_file(config.h.in include/phasar/Config/phasar-config.h @ONLY) include_directories("${CMAKE_CURRENT_BINARY_DIR}/include/") +include_directories( + ${PHASAR_SRC_DIR}/include +) + +# Warnings +option(PHASAR_ENABLE_WARNINGS "Enable warnings" ON) +if (PHASAR_ENABLE_WARNINGS) + add_cxx_compile_options( + -Wall + -Wextra + -Wno-unused-parameter + ) +endif (PHASAR_ENABLE_WARNINGS) + +# Some preprocessor symbols that need to be available in phasar sources, but should not be installed +add_cxx_compile_definitions(PHASAR_SRC_DIR="${CMAKE_SOURCE_DIR}") +add_cxx_compile_definitions(PHASAR_BUILD_DIR="${CMAKE_BINARY_DIR}") + # Add PhASAR's subdirectories add_subdirectory(include) add_subdirectory(lib) @@ -357,6 +358,14 @@ add_subdirectory(lib) # phasar-based binaries add_subdirectory(tools) +# Swift tests +option(BUILD_SWIFT_TESTS "Builds the Swift tests (Swift compiler has to be installed manually beforehand!)" OFF) +if (BUILD_SWIFT_TESTS) + set(CMAKE_Swift_FLAGS_RELEASE "-g") + set(CMAKE_Swift_FLAGS_RELWITHDEBINFO "-g") + enable_language(Swift) +endif(BUILD_SWIFT_TESTS) + # Add Phasar unittests and build all IR test code if (PHASAR_BUILD_UNITTESTS) message("Phasar unittests") diff --git a/include/phasar/DataFlow/Mono/Solver/InterMonoSolver.h b/include/phasar/DataFlow/Mono/Solver/InterMonoSolver.h index 518d80c7d..4e05c9279 100644 --- a/include/phasar/DataFlow/Mono/Solver/InterMonoSolver.h +++ b/include/phasar/DataFlow/Mono/Solver/InterMonoSolver.h @@ -92,7 +92,7 @@ template class InterMonoSolver { void addCalleesToWorklist(std::pair Edge) { auto Src = Edge.first; - auto Dst = Edge.second; + // auto Dst = Edge.second; // Add inter- and intra-edges of callee(s) for (auto Callee : ICF->getCalleesOfCallAt(Src)) { if (AddedFunctions.find(Callee) != AddedFunctions.end()) { @@ -362,7 +362,7 @@ template class InterMonoSolver { std::pair Edge = Worklist.front(); Worklist.pop_front(); auto Src = Edge.first; - auto Dst = Edge.second; + // auto Dst = Edge.second; if (ICF->isCallSite(Src)) { addCalleesToWorklist(Edge); } diff --git a/include/phasar/Utils/Utilities.h b/include/phasar/Utils/Utilities.h index 762735bfe..5bc01ecd2 100644 --- a/include/phasar/Utils/Utilities.h +++ b/include/phasar/Utils/Utilities.h @@ -270,19 +270,21 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, } template -LLVM_ATTRIBUTE_ALWAYS_INLINE void assertNotNull(const T &Value) {} +LLVM_ATTRIBUTE_ALWAYS_INLINE void assertNotNull(const T & /*Value*/) {} template -LLVM_ATTRIBUTE_ALWAYS_INLINE void assertNotNull(const std::optional &Value) { +LLVM_ATTRIBUTE_ALWAYS_INLINE void +assertNotNull([[maybe_unused]] const std::optional &Value) { assert(Value.has_value()); } template -LLVM_ATTRIBUTE_ALWAYS_INLINE void assertNotNull(const T *Value) { +LLVM_ATTRIBUTE_ALWAYS_INLINE void +assertNotNull([[maybe_unused]] const T *Value) { assert(Value != nullptr); } -template void assertAllNotNull(const T &Range) { +template void assertAllNotNull([[maybe_unused]] const T &Range) { assertNotNull(Range); for (const auto &Elem : Range) { assertNotNull(Elem); diff --git a/lib/PhasarLLVM/ControlFlow/Resolver/OTFResolver.cpp b/lib/PhasarLLVM/ControlFlow/Resolver/OTFResolver.cpp index b1e99e85d..8fd7621bf 100644 --- a/lib/PhasarLLVM/ControlFlow/Resolver/OTFResolver.cpp +++ b/lib/PhasarLLVM/ControlFlow/Resolver/OTFResolver.cpp @@ -94,7 +94,7 @@ auto OTFResolver::resolveVirtualCall(const llvm::CallBase *CallSite) PHASAR_LOG_LEVEL(DEBUG, "Virtual function table entry is: " << VtableIndex); - const llvm::Value *Receiver = CallSite->getArgOperand(0); + // const llvm::Value *Receiver = CallSite->getArgOperand(0); if (CallSite->getCalledOperand() && CallSite->getCalledOperand()->getType()->isPointerTy()) { diff --git a/lib/PhasarLLVM/DataFlow/IfdsIde/IFDSFieldSensTaintAnalysis/FlowFunctions/BranchSwitchInstFlowFunction.cpp b/lib/PhasarLLVM/DataFlow/IfdsIde/IFDSFieldSensTaintAnalysis/FlowFunctions/BranchSwitchInstFlowFunction.cpp index fa57a4022..0a2f03623 100644 --- a/lib/PhasarLLVM/DataFlow/IfdsIde/IFDSFieldSensTaintAnalysis/FlowFunctions/BranchSwitchInstFlowFunction.cpp +++ b/lib/PhasarLLVM/DataFlow/IfdsIde/IFDSFieldSensTaintAnalysis/FlowFunctions/BranchSwitchInstFlowFunction.cpp @@ -36,7 +36,7 @@ BranchSwitchInstFlowFunction::computeTargetsExt(ExtendedValue &Fact) { if (IsConditionTainted) { const auto *const StartBasicBlock = CurrentInst->getParent(); - const auto StartBasicBlockLabel = StartBasicBlock->getName(); + // const auto StartBasicBlockLabel = StartBasicBlock->getName(); LOG_DEBUG("Searching end of block label for: " << StartBasicBlockLabel); diff --git a/lib/PhasarLLVM/DataFlow/IfdsIde/Problems/ExtendedTaintAnalysis/AbstractMemoryLocationFactory.cpp b/lib/PhasarLLVM/DataFlow/IfdsIde/Problems/ExtendedTaintAnalysis/AbstractMemoryLocationFactory.cpp index d3a11d09c..ef6999038 100644 --- a/lib/PhasarLLVM/DataFlow/IfdsIde/Problems/ExtendedTaintAnalysis/AbstractMemoryLocationFactory.cpp +++ b/lib/PhasarLLVM/DataFlow/IfdsIde/Problems/ExtendedTaintAnalysis/AbstractMemoryLocationFactory.cpp @@ -354,8 +354,9 @@ AbstractMemoryLocationFactoryBase::withOffsetsImpl( AML->offsets().end()); OffsCpy.back() += Offs.front(); +#ifdef XTAINT_DIAGNOSTICS bool IsOverApproximating = false; - +#endif if (NwLifetime < Offs.size() - 1) { Offs = Offs.slice(0, NwLifetime + 1); } diff --git a/lib/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEExtendedTaintAnalysis.cpp b/lib/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEExtendedTaintAnalysis.cpp index 02c08a309..d3dd8fd76 100644 --- a/lib/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEExtendedTaintAnalysis.cpp +++ b/lib/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEExtendedTaintAnalysis.cpp @@ -695,7 +695,7 @@ auto IDEExtendedTaintAnalysis::getSummaryEdgeFunction(n_t Curr, d_t CurrNode, d_t SuccNode) -> EdgeFunctionType { - const auto *Call = llvm::cast(Curr); + // const auto *Call = llvm::cast(Curr); if (isZeroValue(CurrNode) && !isZeroValue(SuccNode)) { return GenEdgeFunction{nullptr}; diff --git a/lib/PhasarPass/PhasarPass.cpp b/lib/PhasarPass/PhasarPass.cpp index dc90da2f9..d16a1fb78 100644 --- a/lib/PhasarPass/PhasarPass.cpp +++ b/lib/PhasarPass/PhasarPass.cpp @@ -64,7 +64,7 @@ bool PhasarPass::runOnModule(llvm::Module &M) { CallGraphAnalysisType CGTy = toCallGraphAnalysisType(CallGraphAnalysis); LLVMTypeHierarchy H(DB); LLVMAliasSet PT(&DB); - LLVMBasedCFG CFG; + // LLVMBasedCFG CFG; LLVMBasedICFG I(&DB, CGTy, EntryPoints, &H, &PT); if (DataFlowAnalysis == "ifds-solvertest") { IFDSSolverTest IFDSTest(&DB, EntryPoints); diff --git a/lib/Pointer/PointsToInfo.cpp b/lib/Pointer/PointsToInfo.cpp index 3f7678e0b..b690be3c0 100644 --- a/lib/Pointer/PointsToInfo.cpp +++ b/lib/Pointer/PointsToInfo.cpp @@ -137,12 +137,14 @@ class DummyFieldSensitivePointsToAnalysis [[maybe_unused]] void testTypeErasure() { DummyFieldInsensitivePointsToAnalysis PTA1; - PointsToInfoRef> + [[maybe_unused]] PointsToInfoRef< + PointsToTraits> TEPTA1 = &PTA1; DummyFieldSensitivePointsToAnalysis PTA2; - PointsToInfoRef> TEPTA2 = - &PTA2; + [[maybe_unused]] PointsToInfoRef< + PointsToTraits> + TEPTA2 = &PTA2; PointsToInfo> TEPTA3( std::in_place_type); diff --git a/tools/phasar-cli/phasar-cli.cpp b/tools/phasar-cli/phasar-cli.cpp index ef221b8cd..c9c20f629 100644 --- a/tools/phasar-cli/phasar-cli.cpp +++ b/tools/phasar-cli/phasar-cli.cpp @@ -366,7 +366,7 @@ int main(int Argc, const char **Argv) { validateParamAnalysisConfig(); validatePTAJsonFile(); - auto &PConfig = PhasarConfig::getPhasarConfig(); + [[maybe_unused]] auto &PConfig = PhasarConfig::getPhasarConfig(); // setup the emitter options to display the computed analysis results auto EmitterOptions = AnalysisControllerEmitterOptions::None; diff --git a/unittests/PhasarLLVM/Pointer/LLVMAliasSetTest.cpp b/unittests/PhasarLLVM/Pointer/LLVMAliasSetTest.cpp index 3cac284a2..b6144d68b 100644 --- a/unittests/PhasarLLVM/Pointer/LLVMAliasSetTest.cpp +++ b/unittests/PhasarLLVM/Pointer/LLVMAliasSetTest.cpp @@ -21,7 +21,7 @@ TEST(LLVMAliasSet, Intra_01) { const auto *Main = IRDB.getFunctionDefinition("main"); for (const auto &BB : *Main) { for (const auto &I : BB) { - auto S = PTS.getAliasSet(&I); // NOLINT + std::ignore = PTS.getAliasSet(&I); // NOLINT } } PTS.print(llvm::outs()); @@ -37,7 +37,7 @@ TEST(LLVMAliasSet, Inter_01) { const auto *Main = IRDB.getFunctionDefinition("main"); for (const auto &BB : *Main) { for (const auto &I : BB) { - auto S = PTS.getAliasSet(&I); // NOLINT + std::ignore = PTS.getAliasSet(&I); // NOLINT } } PTS.print(llvm::outs()); @@ -53,11 +53,11 @@ TEST(LLVMAliasSet, Global_01) { LLVMBasedICFG ICF(&IRDB, CallGraphAnalysisType::OTF, {"main"}, &TH, &PTS); const auto *Main = IRDB.getFunctionDefinition("main"); for (const auto &G : Main->getParent()->globals()) { - auto S = PTS.getAliasSet(&G); // NOLINT + std::ignore = PTS.getAliasSet(&G); // NOLINT } for (const auto &BB : *Main) { for (const auto &I : BB) { - auto S = PTS.getAliasSet(&I); // NOLINT + std::ignore = PTS.getAliasSet(&I); // NOLINT } } PTS.print(llvm::outs()); diff --git a/unittests/Utils/EquivalenceClassMapTest.cpp b/unittests/Utils/EquivalenceClassMapTest.cpp index c712615ad..04c641324 100644 --- a/unittests/Utils/EquivalenceClassMapTest.cpp +++ b/unittests/Utils/EquivalenceClassMapTest.cpp @@ -59,7 +59,7 @@ TEST(EquivalenceClassMap, insertKeyRef) { int Key = 42; const MapTy::key_type &KeyRef = Key; - M.insert(42, "foo"); + M.insert(KeyRef, "foo"); EXPECT_EQ(M.findValue(42), "foo"); } From 275333041833a73704b9e4d8a4f00d98070b1861 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 9 Oct 2023 16:57:52 +0200 Subject: [PATCH 21/35] Support for manually setting USE_LLVM_FAT_LIB + remove some obsolete system dependencies --- CMakeLists.txt | 15 +++++++++------ bootstrap.sh | 3 +-- utils/InstallAptDependencies.sh | 2 +- utils/install-llvm.sh | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 83e8fdfad..47b457722 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,6 @@ if (NOT PHASAR_TARGET_ARCH STREQUAL "") endif() endif() - if (PHASAR_ENABLE_SANITIZERS) message(STATUS "Selected ${CMAKE_BUILD_TYPE} Build with Sanitizers") add_cxx_compile_options( @@ -187,6 +186,7 @@ else() endif() ### Adding external libraries + # Threads find_package(Threads) @@ -223,6 +223,7 @@ add_subdirectory(external/json-schema-validator) # Googletest if (NOT PHASAR_IN_TREE) set(BUILD_GMOCK OFF) + set(INSTALL_GTEST OFF) add_subdirectory(external/googletest EXCLUDE_FROM_ALL) set(GTEST_INCLUDE_DIR "external/googletest/googletest/include") else() @@ -240,7 +241,11 @@ if (NOT PHASAR_IN_TREE) find_package(LLVM 14 REQUIRED CONFIG) find_library(LLVM_LIBRARY NAMES LLVM PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH) - if(BUILD_SHARED_LIBS AND NOT ${LLVM_LIBRARY} STREQUAL "LLVM_LIBRARY-NOTFOUND") + + if(USE_LLVM_FAT_LIB AND ${LLVM_LIBRARY} STREQUAL "LLVM_LIBRARY-NOTFOUND") + message(WARNING "Did not find requested libLLVM.so. Link against individual modules instead") + set(USE_LLVM_FAT_LIB OFF) + elseif(BUILD_SHARED_LIBS AND NOT ${LLVM_LIBRARY} STREQUAL "LLVM_LIBRARY-NOTFOUND") message(STATUS "Found consolidated shared LLVM lib ${LLVM_LIBRARY} that will be linked against.") set(USE_LLVM_FAT_LIB ON) endif() @@ -251,7 +256,7 @@ if(NOT LLVM_ENABLE_RTTI) endif() # Clang -option(BUILD_PHASAR_CLANG "Build the phasar-clang library (default is ON)" ON) +option(BUILD_PHASAR_CLANG "Build the phasar_clang library (default is ON)" ON) if(BUILD_PHASAR_CLANG) # The clang-cpp shared library is now the preferred way to link dynamically against libclang if we build out of tree. @@ -314,7 +319,7 @@ include_directories(SYSTEM external/json-schema-validator/src/) include_directories(SYSTEM ${GTEST_INCLUDE_DIR}) include_directories(SYSTEM ${SQLITE3_INCLUDE_DIR}) if(NOT PHASAR_IN_TREE) - include_directories(SYSTEM ${LLVM_INCLUDE_DIRS}) + include_directories(${LLVM_INCLUDE_DIRS}) endif() # Library Dependency Dirs @@ -327,8 +332,6 @@ if(NOT PHASAR_IN_TREE) endif() endif() - - # Installed config configure_file(config.h.in include/phasar/Config/phasar-config.h @ONLY) include_directories("${CMAKE_CURRENT_BINARY_DIR}/include/") diff --git a/bootstrap.sh b/bootstrap.sh index 2b5bfe397..3735451f0 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -71,8 +71,7 @@ set -- "${POSITIONAL[@]}" # restore positional parameters echo "installing phasar dependencies..." if [ -x "$(command -v pacman)" ]; then - yes | sudo pacman -Syu --needed which zlib sqlite3 ncurses make python3 doxygen libxml2 swig gcc z3 libedit graphviz python-sphinx openmp curl python-pip ninja - ./utils/installBuildEAR.sh + yes | sudo pacman -Syu --needed which zlib sqlite3 ncurses make python3 doxygen libxml2 swig gcc libedit graphviz python-sphinx openmp python-pip ninja else ./utils/InstallAptDependencies.sh fi diff --git a/utils/InstallAptDependencies.sh b/utils/InstallAptDependencies.sh index 496c879f4..79112a51f 100755 --- a/utils/InstallAptDependencies.sh +++ b/utils/InstallAptDependencies.sh @@ -3,4 +3,4 @@ set -e sudo apt update sudo apt install git -y -sudo apt install zlib1g-dev sqlite3 libsqlite3-dev bear python3 doxygen graphviz python3-pip libxml2 libxml2-dev libncurses5-dev libncursesw5-dev swig build-essential g++ libz3-dev libedit-dev python3-sphinx libomp-dev libcurl4-openssl-dev ninja-build -y +sudo apt install zlib1g-dev sqlite3 libsqlite3-dev python3 doxygen graphviz python3-pip libxml2 libxml2-dev libncurses5-dev libncursesw5-dev swig build-essential g++ libedit-dev python3-sphinx libomp-dev ninja-build -y diff --git a/utils/install-llvm.sh b/utils/install-llvm.sh index 943b3c211..658449879 100755 --- a/utils/install-llvm.sh +++ b/utils/install-llvm.sh @@ -50,7 +50,7 @@ safe_cd "${build_dir}"/llvm-project/ git checkout "${llvm_release}" mkdir -p build safe_cd build -cmake -G "Ninja" -DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra;libcxx;libcxxabi;libunwind;lld;compiler-rt' -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_EH=ON -DLLVM_ENABLE_RTTI=ON -DLLVM_LINK_LLVM_DYLIB=ON -DLLVM_ENABLE_DUMP=ON -DLLVM_BUILD_EXAMPLES=Off -DLLVM_INCLUDE_EXAMPLES=Off -DLLVM_BUILD_TESTS=Off -DLLVM_INCLUDE_TESTS=Off -DPYTHON_EXECUTABLE="$(which python3)" ../llvm +cmake -G "Ninja" -DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra;libcxx;libcxxabi;libunwind;lld;compiler-rt' -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_EH=ON -DLLVM_ENABLE_RTTI=ON -DLLVM_LINK_LLVM_DYLIB=ON -DLLVM_ENABLE_DUMP=ON -DLLVM_BUILD_EXAMPLES=Off -DLLVM_INCLUDE_EXAMPLES=Off -DLLVM_BUILD_TESTS=Off -DLLVM_INCLUDE_TESTS=Off ../llvm cmake --build . echo "Installing LLVM to ${dest_dir}" From cd17dd4cca12a10092605ec82b233849339cd355 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 9 Oct 2023 19:32:12 +0200 Subject: [PATCH 22/35] Cleanup system deps --- .github/workflows/ci.yml | 18 +++++++++--------- bootstrap.sh | 33 +++++++++++++++++++++++---------- utils/InstallAptDependencies.sh | 6 +++--- utils/install-llvm.sh | 2 +- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa5052c51..6e0fe4e31 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,15 +28,15 @@ jobs: fetch-depth: 0 submodules: recursive - - name: Install Basic Dependencies - shell: bash - run: | - sudo apt-get update - sudo apt-get -y install --no-install-recommends \ - cmake \ - ninja-build \ - libstdc++6 \ - libboost-all-dev + # - name: Install Basic Dependencies + # shell: bash + # run: | + # sudo apt-get update + # sudo apt-get -y install --no-install-recommends \ + # cmake \ + # ninja-build \ + # libstdc++6 \ + # libboost-all-dev - name: Install Phasar Dependencies shell: bash diff --git a/bootstrap.sh b/bootstrap.sh index 3735451f0..6bef0144e 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -9,12 +9,25 @@ readonly PHASAR_INSTALL_DIR="/usr/local/phasar" readonly LLVM_INSTALL_DIR="/usr/local/llvm-14" NUM_THREADS=$(nproc) -LLVM_RELEASE=llvmorg-14.0.0 +LLVM_RELEASE=llvmorg-14.0.6 DO_UNIT_TEST=true DO_INSTALL=false BUILD_TYPE=Release +function usage { + echo "USAGE: ./bootstrap.sh [options]" + echo "" + echo "OPTIONS:" + echo -e "\t-j --jobs\t\t\t- Number of parallel jobs used for compilation (default is nproc -- $(nproc))" + echo -e "\t-u --unittest\t\t\t- Build and run PhASARs unit-tests (default is true)" + echo -e "\t-DBOOST_DIR=\t\t- The directory where boost should be installed (optional)" + echo -e "\t-DBOOST_VERSION=\t- The desired boost version to install (optional)" + echo -e "\t-DCMAKE_BUILD_TYPE=\t- The build mode for building PhASAR. One of {Debug, RelWithDebInfo, Release} (default is Release)" + echo -e "\t--install\t\t\t- Install PhASAR system-wide after building (default is false)" + echo -e "\t-h --help\t\t\t- Display this help message" +} + # Parsing command-line-parameters # See "https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash" as a reference @@ -59,6 +72,10 @@ case $key in DO_INSTALL=true shift # past argument ;; + -h|--help) + usage + exit 0 + ;; *) # unknown option POSITIONAL+=("$1") # save it in an array for later shift # past argument @@ -71,13 +88,11 @@ set -- "${POSITIONAL[@]}" # restore positional parameters echo "installing phasar dependencies..." if [ -x "$(command -v pacman)" ]; then - yes | sudo pacman -Syu --needed which zlib sqlite3 ncurses make python3 doxygen libxml2 swig gcc libedit graphviz python-sphinx openmp python-pip ninja + yes | sudo pacman -Syu --needed which zlib sqlite3 python3 doxygen gcc python-pip ninja cmake else ./utils/InstallAptDependencies.sh fi -pip3 install cmake - if [ ! -z "${DESIRED_BOOST_DIR}" ]; then BOOST_PARAMS="-DBOOST_ROOT=${DESIRED_BOOST_DIR}" else @@ -90,10 +105,10 @@ else yes | sudo pacman -Syu --needed boost-libs boost else if [ -z "$DESIRED_BOOST_VERSION" ] ;then - sudo apt install libboost-all-dev -y + sudo apt-get install libboost-graph-dev -y else # DESIRED_BOOST_VERSION in form d.d, i.e. 1.65 (this is the latest version I found in the apt repo) - sudo apt install "libboost${DESIRED_BOOST_VERSION}-all-dev" -y + sudo apt-get install "libboost${DESIRED_BOOST_VERSION}-graph-dev" -y fi #verify installation BOOST_VERSION=$(echo -e '#include \nBOOST_LIB_VERSION' | gcc -s -x c++ -E - 2>/dev/null| grep "^[^#;]" | tr -d '\"') @@ -109,9 +124,7 @@ else if [ -x "$(command -v apt)" ]; then DESIRED_BOOST_VERSION=${BOOST_VERSION//_/.} # install missing packages if necessary - boostlibnames=("libboost-system" "libboost-filesystem" - "libboost-graph" "libboost-program-options" - "libboost-thread") + boostlibnames=("libboost-graph") additional_boost_libs=() for boost_lib in ${boostlibnames[@]}; do dpkg -s "$boost_lib${DESIRED_BOOST_VERSION}" >/dev/null 2>&1 || @@ -122,7 +135,7 @@ else done if [ ${#additional_boost_libs[@]} -gt 0 ] ;then echo "Installing additional ${#additional_boost_libs[@]} boost packages: ${additional_boost_libs[*]}" - sudo apt install "${additional_boost_libs[@]}" -y || true + sudo apt-get install "${additional_boost_libs[@]}" -y || true fi fi fi diff --git a/utils/InstallAptDependencies.sh b/utils/InstallAptDependencies.sh index 79112a51f..37bc530c6 100755 --- a/utils/InstallAptDependencies.sh +++ b/utils/InstallAptDependencies.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -sudo apt update -sudo apt install git -y -sudo apt install zlib1g-dev sqlite3 libsqlite3-dev python3 doxygen graphviz python3-pip libxml2 libxml2-dev libncurses5-dev libncursesw5-dev swig build-essential g++ libedit-dev python3-sphinx libomp-dev ninja-build -y +sudo apt-get update +sudo apt-get install git -y +sudo apt-get install zlib1g-dev sqlite3 libsqlite3-dev python3 doxygen python3-pip g++ ninja-build cmake -y diff --git a/utils/install-llvm.sh b/utils/install-llvm.sh index 658449879..93055fb33 100755 --- a/utils/install-llvm.sh +++ b/utils/install-llvm.sh @@ -15,7 +15,7 @@ readonly dest_dir="${3}" readonly llvm_release="${4}" if [ "$#" -ne 4 ] || ! [[ "$num_cores" =~ ${re_number} ]] || ! [ -d "${build_dir}" ] || ! [[ "${llvm_release}" =~ ${re_llvm_release} ]]; then - echo "usage: <# cores> " >&2 + echo "usage: <# cores> " >&2 exit 1 fi From 40fbb3bb380f0c37a0218b8f0132c2f12eb6d4a5 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 9 Oct 2023 19:35:44 +0200 Subject: [PATCH 23/35] Fix install boost in CI --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6e0fe4e31..a807903f4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,6 +42,7 @@ jobs: shell: bash run: | ./utils/InstallAptDependencies.sh + sudo apt-get -y install --no-install-recommends libboost-graph-dev - name: Install Strategy Dependencies shell: bash From 49430d3ebb64e050a2559a8c0d003a6d91f1297f Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 9 Oct 2023 19:59:33 +0200 Subject: [PATCH 24/35] Modernize LLVM build + minor improvements in bootstrap.sh --- .github/workflows/ci.yml | 10 ---------- bootstrap.sh | 18 ++++++++++++++---- utils/install-llvm.sh | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a807903f4..d109a180f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,16 +28,6 @@ jobs: fetch-depth: 0 submodules: recursive - # - name: Install Basic Dependencies - # shell: bash - # run: | - # sudo apt-get update - # sudo apt-get -y install --no-install-recommends \ - # cmake \ - # ninja-build \ - # libstdc++6 \ - # libboost-all-dev - - name: Install Phasar Dependencies shell: bash run: | diff --git a/bootstrap.sh b/bootstrap.sh index 6bef0144e..9e615a1b3 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -19,13 +19,14 @@ function usage { echo "USAGE: ./bootstrap.sh [options]" echo "" echo "OPTIONS:" - echo -e "\t-j --jobs\t\t\t- Number of parallel jobs used for compilation (default is nproc -- $(nproc))" - echo -e "\t-u --unittest\t\t\t- Build and run PhASARs unit-tests (default is true)" + echo -e "\t--jobs\t\t-j\t\t- Number of parallel jobs used for compilation (default is nproc -- $(nproc))" + echo -e "\t--unittest\t-u\t\t- Build and run PhASARs unit-tests (default is true)" + echo -e "\t--install\t\t\t- Install PhASAR system-wide after building (default is false)" + echo -e "\t--help\t\t-h\t\t- Display this help message" echo -e "\t-DBOOST_DIR=\t\t- The directory where boost should be installed (optional)" echo -e "\t-DBOOST_VERSION=\t- The desired boost version to install (optional)" echo -e "\t-DCMAKE_BUILD_TYPE=\t- The build mode for building PhASAR. One of {Debug, RelWithDebInfo, Release} (default is Release)" - echo -e "\t--install\t\t\t- Install PhASAR system-wide after building (default is false)" - echo -e "\t-h --help\t\t\t- Display this help message" + echo -e "\t-DPHASAR_INSTALL_DIR=\t- The folder where to install PhASAR if --install is specified (default is /usr/local/phasar)" } # Parsing command-line-parameters @@ -72,6 +73,15 @@ case $key in DO_INSTALL=true shift # past argument ;; + -DPHASAR_INSTALL_DIR) + PHASAR_INSTALL_DIR="$2" + shift # past argument + shift # past value + ;; + -DPHASAR_INSTALL_DIR=*) + PHASAR_INSTALL_DIR="${key#*=}" + shift # past argument=value + ;; -h|--help) usage exit 0 diff --git a/utils/install-llvm.sh b/utils/install-llvm.sh index 93055fb33..aff717a8b 100755 --- a/utils/install-llvm.sh +++ b/utils/install-llvm.sh @@ -50,7 +50,7 @@ safe_cd "${build_dir}"/llvm-project/ git checkout "${llvm_release}" mkdir -p build safe_cd build -cmake -G "Ninja" -DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra;libcxx;libcxxabi;libunwind;lld;compiler-rt' -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_EH=ON -DLLVM_ENABLE_RTTI=ON -DLLVM_LINK_LLVM_DYLIB=ON -DLLVM_ENABLE_DUMP=ON -DLLVM_BUILD_EXAMPLES=Off -DLLVM_INCLUDE_EXAMPLES=Off -DLLVM_BUILD_TESTS=Off -DLLVM_INCLUDE_TESTS=Off ../llvm +cmake -G "Ninja" -DLLVM_ENABLE_RUNTIMES='libcxx;libcxxabi;libunwind' -DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra;lld;compiler-rt' -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_EH=ON -DLLVM_ENABLE_RTTI=ON -DLLVM_LINK_LLVM_DYLIB=ON -DLLVM_ENABLE_DUMP=ON -DLLVM_BUILD_EXAMPLES=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_BUILD_TESTS=OFF -DLLVM_INCLUDE_TESTS=OFF ../llvm cmake --build . echo "Installing LLVM to ${dest_dir}" From 2ddeb5569ee8b8c89a4fc7051d34d955c434c320 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Thu, 12 Oct 2023 15:48:19 +0200 Subject: [PATCH 25/35] Improve add_phasar_library --- CMakeLists.txt | 96 +++++++++++-------- cmake/phasar_macros.cmake | 89 ++++++----------- include/CMakeLists.txt | 1 - include/phasar/CMakeLists.txt | 0 lib/AnalysisStrategy/CMakeLists.txt | 11 +-- lib/CMakeLists.txt | 76 +++++++-------- lib/Config/CMakeLists.txt | 16 +--- lib/ControlFlow/CMakeLists.txt | 8 +- lib/Controller/CMakeLists.txt | 41 ++++---- lib/DB/CMakeLists.txt | 25 ++--- lib/PhasarClang/CMakeLists.txt | 27 +++--- lib/PhasarLLVM/ControlFlow/CMakeLists.txt | 26 +++-- lib/PhasarLLVM/DB/CMakeLists.txt | 22 ++--- .../DataFlow/IfdsIde/CMakeLists.txt | 38 ++++---- lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt | 26 +++-- lib/PhasarLLVM/Passes/CMakeLists.txt | 20 ++-- lib/PhasarLLVM/Pointer/CMakeLists.txt | 35 +++---- lib/PhasarLLVM/TaintConfig/CMakeLists.txt | 30 +++--- lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt | 24 ++--- lib/PhasarLLVM/Utils/CMakeLists.txt | 23 ++--- lib/PhasarPass/CMakeLists.txt | 40 ++++---- lib/Pointer/CMakeLists.txt | 16 ++-- lib/Utils/CMakeLists.txt | 20 ++-- 23 files changed, 307 insertions(+), 403 deletions(-) delete mode 100644 include/CMakeLists.txt delete mode 100644 include/phasar/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 47b457722..cf942bb97 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,43 +54,62 @@ if (NOT CMAKE_BUILD_TYPE AND NOT GENERATOR_IS_MULTI_CONFIG) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build mode ('Debug' or 'Release', default is 'Debug')" FORCE) endif () +if(GENERATOR_IS_MULTI_CONFIG) + message(STATUS "Selected multi-config Build") +else() + message(STATUS "Selected ${CMAKE_BUILD_TYPE} Build") +endif() + +# TODO: Once available, we may want to use -fextend-lifetimes on Debug- and RelWithDebInfo builds to improve debugging experience +# https://reviews.llvm.org/D157613 + +string(APPEND CMAKE_CXX_FLAGS " -MP -fstack-protector-strong -ffunction-sections -fdata-sections -pipe") +string(APPEND CMAKE_CXX_FLAGS_DEBUG " -Og -fno-omit-frame-pointer") +string(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " -fno-omit-frame-pointer") +string(APPEND CMAKE_CXX_FLAGS_RELEASE "") + + option(CMAKE_VISIBILITY_INLINES_HIDDEN "Hide inlined functions from the DSO table (default ON)" ON) +# march=native + # NOTE: Use gcc -march=native -Q --help=target | grep -- '-march=' | cut -f3 # to check the architecture detected by match=native -set(PHASAR_TARGET_ARCH "" CACHE STRING "Optimize the build for the given target architecture, e.g. -march=native. Most useful in Release builds. Disabled by default") +# set(PHASAR_TARGET_ARCH "" CACHE STRING "Optimize the build for the given target architecture, e.g. -march=native. Most useful in Release builds. Disabled by default") + +if (DEFINED PHASAR_TARGET_ARCH) + if (NOT CMAKE_BUILD_TYPE STREQUAL "Release" AND NOT GENERATOR_IS_MULTI_CONFIG) + message(WARNING "The PHASAR_TARGET_ARCH flag will be ignored in non-Release build type ${CMAKE_BUILD_TYPE}") + else() + set(PHASAR_TARGET_ARCH_INTERNAL "${PHASAR_TARGET_ARCH}") + endif() +elseif("${CMAKE_BUILD_TYPE}" STREQUAL "Release") + set(PHASAR_TARGET_ARCH_INTERNAL "native") +endif() -if (NOT PHASAR_TARGET_ARCH STREQUAL "") +if (NOT "${PHASAR_TARGET_ARCH_INTERNAL}" STREQUAL "") include(CheckCXXCompilerFlag) - check_cxx_compiler_flag("-march=${PHASAR_TARGET_ARCH}" MARCH_SUPPORTED) - if(MARCH_SUPPORTED) - message(STATUS "Target architecture ${PHASAR_TARGET_ARCH} enabled") - add_cxx_compile_options(-march=${PHASAR_TARGET_ARCH}) + check_cxx_compiler_flag("-march=${PHASAR_TARGET_ARCH_INTERNAL}" MARCH_SUPPORTED) + if (MARCH_SUPPORTED) + message(STATUS "Target architecture '${PHASAR_TARGET_ARCH_INTERNAL}' enabled") + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -march=${PHASAR_TARGET_ARCH_INTERNAL}") else() - message(STATUS "Target architecture ${PHASAR_TARGET_ARCH} not supported") + message(WARNING "Target architecture '${PHASAR_TARGET_ARCH_INTERNAL}' not supported. Fallback to generic build") endif() endif() +# Sanitizers if (PHASAR_ENABLE_SANITIZERS) message(STATUS "Selected ${CMAKE_BUILD_TYPE} Build with Sanitizers") - add_cxx_compile_options( - -fno-omit-frame-pointer - -fsanitize=address,undefined - ) - add_cxx_link_options( - -fsanitize=address,undefined - ) -endif() -# TODO: Once available, we may want to use -fextend-lifetimes on Debug- and RelWithDebInfo builds to improve debugging experience -# https://reviews.llvm.org/D157613 - -string(APPEND CMAKE_CXX_FLAGS " -MP -fstack-protector-strong -ffunction-sections -fdata-sections -pipe") -string(APPEND CMAKE_CXX_FLAGS_DEBUG " -Og -fno-omit-frame-pointer") -string(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " -fno-omit-frame-pointer") -string(APPEND CMAKE_CXX_FLAGS_RELEASE "") + if(MSVC) + set(ASAN_FLAG "/fsanitize=address") + else() + set(ASAN_FLAG "-fsanitize=address,undefined") + endif() -message(STATUS "Selected ${CMAKE_BUILD_TYPE} Build") + string(APPEND CMAKE_CXX_FLAGS " ${ASAN_FLAG}") +endif() # LTO if (GENERATOR_IS_MULTI_CONFIG OR CMAKE_BUILD_TYPE STREQUAL "Release") @@ -108,10 +127,6 @@ endif() # Enable testing enable_testing() -file(STRINGS ${PHASAR_SRC_DIR}/include/phasar/Config/Version.h VERSION_NUMBER_FILE) -string(REPLACE " " ";" VERSION_NUMBER_FILE ${VERSION_NUMBER_FILE}) -list(GET VERSION_NUMBER_FILE 2 VERSION_NUMBER_PHASAR) - option(PHASAR_BUILD_UNITTESTS "Build all tests (default is ON)" ON) option(PHASAR_BUILD_OPENSSL_TS_UNITTESTS "Build OPENSSL typestate tests (require OpenSSL, default is OFF)" OFF) @@ -136,6 +151,7 @@ if (PHASAR_ENABLE_PIC) set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif (PHASAR_ENABLE_PIC) +# PAMM if (NOT PHASAR_ENABLE_PAMM) set(PHASAR_ENABLE_PAMM "Off" CACHE STRING "Enable the performance measurement mechanism ('Off', 'Core' or 'Full', default is 'Off')" FORCE) set_property(CACHE PHASAR_ENABLE_PAMM PROPERTY STRINGS "Off" "Core" "Full") @@ -152,6 +168,7 @@ else() message(STATUS "PAMM metric severity level: Off") endif() +# Logger option(PHASAR_ENABLE_DYNAMIC_LOG "Makes it possible to switch the logger on and off at runtime (default is ON)" ON) if (PHASAR_ENABLE_DYNAMIC_LOG) @@ -161,6 +178,7 @@ else() message(STATUS "Dynamic log disabled") endif() +# RPATH if (NOT PHASAR_IN_TREE) set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) @@ -172,12 +190,14 @@ if (NOT PHASAR_IN_TREE) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) endif() +# Filesystem if (LLVM_ENABLE_LIBCXX) set(PHASAR_STD_FILESYSTEM c++fs) else() set(PHASAR_STD_FILESYSTEM stdc++fs) endif() +# Config set(PHASAR_CUSTOM_CONFIG_INSTALL_DIR "" CACHE STRING "If set, customizes the directory, where configuration files for PhASAR are installed (default is /usr/local/.phasar-config)") if ("${PHASAR_CUSTOM_CONFIG_INSTALL_DIR}" STREQUAL "") set(PHASAR_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/.phasar-config/") @@ -317,7 +337,6 @@ include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) include_directories(SYSTEM external/json/include/) include_directories(SYSTEM external/json-schema-validator/src/) include_directories(SYSTEM ${GTEST_INCLUDE_DIR}) -include_directories(SYSTEM ${SQLITE3_INCLUDE_DIR}) if(NOT PHASAR_IN_TREE) include_directories(${LLVM_INCLUDE_DIRS}) endif() @@ -336,18 +355,16 @@ endif() configure_file(config.h.in include/phasar/Config/phasar-config.h @ONLY) include_directories("${CMAKE_CURRENT_BINARY_DIR}/include/") -include_directories( - ${PHASAR_SRC_DIR}/include -) +include_directories(${PHASAR_SRC_DIR}/include) # Warnings option(PHASAR_ENABLE_WARNINGS "Enable warnings" ON) if (PHASAR_ENABLE_WARNINGS) - add_cxx_compile_options( - -Wall - -Wextra - -Wno-unused-parameter - ) + if (MSVC) + string(APPEND CMAKE_CXX_FLAGS " /W4") + else() + string(APPEND CMAKE_CXX_FLAGS " -Wall -Wextra -Wno-unused-parameter") + endif() endif (PHASAR_ENABLE_WARNINGS) # Some preprocessor symbols that need to be available in phasar sources, but should not be installed @@ -355,7 +372,6 @@ add_cxx_compile_definitions(PHASAR_SRC_DIR="${CMAKE_SOURCE_DIR}") add_cxx_compile_definitions(PHASAR_BUILD_DIR="${CMAKE_BINARY_DIR}") # Add PhASAR's subdirectories -add_subdirectory(include) add_subdirectory(lib) # phasar-based binaries @@ -440,20 +456,20 @@ configure_package_config_file( phasarConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/phasar PATH_VARS INCLUDE_INSTALL_DIR - ) +) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/phasarConfigVersion.cmake VERSION 1.0.0 COMPATIBILITY SameMajorVersion - ) +) ### Install Config and ConfigVersion files install( FILES "${CMAKE_CURRENT_BINARY_DIR}/phasarConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/phasarConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/phasar" - ) +) # If the Phasar shared object libraries are not installed into a system folder # the so libs must be added manually to the linker search path and the linker diff --git a/cmake/phasar_macros.cmake b/cmake/phasar_macros.cmake index 903b9df2b..58b32f6ce 100644 --- a/cmake/phasar_macros.cmake +++ b/cmake/phasar_macros.cmake @@ -1,23 +1,17 @@ -macro(phasar_link_llvm executable) +function(phasar_link_llvm executable) # llvm_config links LLVM as PRIVATE. We need to link PUBLIC if (USE_LLVM_FAT_LIB) target_link_libraries(${executable} PUBLIC LLVM) else() - llvm_map_components_to_libnames(LLVM_LIBRARIES ${LLVM_LINK_COMPONENTS}) + llvm_map_components_to_libnames(LLVM_LIBRARIES ${ARGN}) target_link_libraries(${executable} PUBLIC ${LLVM_LIBRARIES}) endif() -endmacro() +endfunction() -macro(add_cxx_compile_options) - add_compile_options("$<$:${ARGN}>") -endmacro() macro(add_cxx_compile_definitions) add_compile_definitions("$<$:${ARGN}>") endmacro() -macro(add_cxx_link_options) - add_link_options("$<$:${ARGN}>") -endmacro() function(add_phasar_unittest test_name) message("Set-up unittest: ${test_name}") @@ -27,12 +21,12 @@ function(add_phasar_unittest test_name) ) add_dependencies(PhasarUnitTests ${test}) - phasar_link_llvm(${test}) + phasar_link_llvm(${test} ${LLVM_LINK_COMPONENTS}) target_link_libraries(${test} - LINK_PRIVATE - phasar - gtest + PRIVATE + phasar + gtest ) add_test(NAME "${test}" @@ -158,19 +152,21 @@ macro(add_phasar_executable name) ) endmacro(add_phasar_executable) -macro(add_phasar_library name) +function(add_phasar_library name) set(PHASAR_LIB_OPTIONS SHARED STATIC MODULE INTERFACE) - cmake_parse_arguments(PHASAR_LIB "${PHASAR_LIB_OPTIONS}" "" "" ${ARGN}) + set(PHASAR_LIB_MULTIVAL LLVM_LINK_COMPONENTS LINKS LINK_PUBLIC LINK_PRIVATE FILES) + cmake_parse_arguments(PHASAR_LIB "${PHASAR_LIB_OPTIONS}" "" "${PHASAR_LIB_MULTIVAL}" ${ARGN}) set(srcs ${PHASAR_LIB_UNPARSED_ARGUMENTS}) + list(APPEND srcs ${PHASAR_LIB_FILES}) if(MSVC_IDE OR XCODE) file(GLOB_RECURSE headers *.h *.td *.def) - set(srcs ${srcs} ${headers}) + list(APPEND srcs ${headers}) string(REGEX MATCHALL "/[^/]" split_path ${CMAKE_CURRENT_SOURCE_DIR}) list(GET split_path -1 dir) file(GLOB_RECURSE headers ../../include/phasar${dir}/*.h) - set(srcs ${srcs} ${headers}) + list(APPEND srcs ${headers}) endif(MSVC_IDE OR XCODE) if(PHASAR_LIB_MODULE) @@ -190,23 +186,21 @@ macro(add_phasar_library name) add_dependencies(${name} ${LLVM_COMMON_DEPENDS}) endif(LLVM_COMMON_DEPENDS) - if(LLVM_USED_LIBS) - foreach(lib ${LLVM_USED_LIBS}) - target_link_libraries(${name} ${lib}) - endforeach(lib) - endif(LLVM_USED_LIBS) - - if(PHASAR_LINK_LIBS) - foreach(lib ${PHASAR_LINK_LIBS}) - if(PHASAR_DEBUG_LIBDEPS) - target_link_libraries(${name} PRIVATE ${lib}) - else() - target_link_libraries(${name} PUBLIC ${lib}) - endif(PHASAR_DEBUG_LIBDEPS) - endforeach(lib) - endif(PHASAR_LINK_LIBS) + foreach(lib ${PHASAR_LIB_LINKS}) + if(PHASAR_DEBUG_LIBDEPS) + target_link_libraries(${name} PRIVATE ${lib}) + else() + target_link_libraries(${name} PUBLIC ${lib}) + endif() + endforeach() + foreach(lib ${PHASAR_LIB_LINK_PUBLIC}) + target_link_libraries(${name} PUBLIC ${lib}) + endforeach() + foreach(lib ${PHASAR_LIB_LINK_PRIVATE}) + target_link_libraries(${name} PRIVATE ${lib}) + endforeach() - phasar_link_llvm(${name}) + phasar_link_llvm(${name} ${PHASAR_LIB_LLVM_LINK_COMPONENTS}) if(MSVC) get_target_property(cflag ${name} COMPILE_FLAGS) @@ -220,7 +214,7 @@ macro(add_phasar_library name) endif(MSVC) # cut off prefix phasar_ for convenient component names - string(REGEX REPLACE phasar_ "" name component_name) + string(REGEX REPLACE phasar_ "" component_name ${name}) if(PHASAR_IN_TREE) install(TARGETS ${name} @@ -247,32 +241,7 @@ macro(add_phasar_library name) endif() set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) -endmacro(add_phasar_library) - -macro(add_phasar_loadable_module name) - set(srcs ${ARGN}) - - # klduge: pass different values for MODULE with multiple targets in same dir - # this allows building shared-lib and module in same dir - # there must be a cleaner way to achieve this.... - if(MODULE) - else() - set(GLOBAL_NOT_MODULE TRUE) - endif() - - set(MODULE TRUE) - add_phasar_library(${name} ${srcs}) - - if(GLOBAL_NOT_MODULE) - unset(MODULE) - endif() - - if(APPLE) - # Darwin-specific linker flags for loadable modules. - set_target_properties(${name} PROPERTIES - LINK_FLAGS "-Wl,-flat_namespace -Wl,-undefined -Wl,suppress") - endif() -endmacro(add_phasar_loadable_module) +endfunction(add_phasar_library) macro(subdirlist result curdir) file(GLOB children RELATIVE ${curdir} ${curdir}/*) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt deleted file mode 100644 index 0e8996497..000000000 --- a/include/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(phasar) diff --git a/include/phasar/CMakeLists.txt b/include/phasar/CMakeLists.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/AnalysisStrategy/CMakeLists.txt b/lib/AnalysisStrategy/CMakeLists.txt index dbb3a1831..583400389 100644 --- a/lib/AnalysisStrategy/CMakeLists.txt +++ b/lib/AnalysisStrategy/CMakeLists.txt @@ -1,16 +1,9 @@ file(GLOB_RECURSE ANALYSIS_STRATEGY_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_db - phasar_controlflow -) - -set(LLVM_LINK_COMPONENTS - Support -) - add_phasar_library(phasar_analysis_strategy ${ANALYSIS_STRATEGY_SRC} + LINKS phasar_db phasar_controlflow + LLVM_LINK_COMPONENTS Support ) set_target_properties(phasar_analysis_strategy diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 96a0e5396..cbcfbaa01 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -11,50 +11,46 @@ if(BUILD_PHASAR_CLANG) add_subdirectory(PhasarClang) endif() -set(PHASAR_LINK_LIBS - phasar_utils - phasar_passes - phasar_config - phasar_db - phasar_pointer - phasar_controlflow - - phasar_llvm_utils - phasar_llvm_db - phasar_llvm_pointer - phasar_llvm_typehierarchy - phasar_llvm_controlflow - - phasar_taintconfig - phasar_mono - phasar_llvm - phasar_llvm_ifdside - phasar_analysis_strategy - phasar_controller - ${Boost_LIBRARIES} -) - -set(LLVM_LINK_COMPONENTS - Core - Support - BitWriter - Analysis - Passes - Demangle -) - # The fat lib relies on transitive dependencies... set(PHASAR_DEBUG_LIBDEPS_SAVE ${PHASAR_DEBUG_LIBDEPS}) set(PHASAR_DEBUG_LIBDEPS OFF) -if(BUILD_SHARED_LIBS OR PHASAR_BUILD_DYNLIB) - add_phasar_library(phasar SHARED - LibPhasar.cpp - ) -else() - add_phasar_library(phasar STATIC - LibPhasar.cpp - ) +if(PHASAR_BUILD_DYNLIB) + set(PHASAR_DYNLIB_KIND SHARED) endif() +add_phasar_library(phasar ${PHASAR_DYNLIB_KIND} + FILES + LibPhasar.cpp + LINKS + phasar_utils + phasar_passes + phasar_config + phasar_db + phasar_pointer + phasar_controlflow + + phasar_llvm_utils + phasar_llvm_db + phasar_llvm_pointer + phasar_llvm_typehierarchy + phasar_llvm_controlflow + + phasar_taintconfig + phasar_mono + phasar_llvm + phasar_llvm_ifdside + phasar_analysis_strategy + phasar_controller + LINK_PRIVATE + ${Boost_LIBRARIES} + LLVM_LINK_COMPONENTS + Core + Support + BitWriter + Analysis + Passes + Demangle +) + set(PHASAR_DEBUG_LIBDEPS ${PHASAR_DEBUG_LIBDEPS_SAVE}) diff --git a/lib/Config/CMakeLists.txt b/lib/Config/CMakeLists.txt index 397500e13..7eeba57fb 100644 --- a/lib/Config/CMakeLists.txt +++ b/lib/Config/CMakeLists.txt @@ -1,20 +1,10 @@ file(GLOB_RECURSE CONFIG_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_utils -) - -set(LLVM_LINK_COMPONENTS - Support -) - add_phasar_library(phasar_config ${CONFIG_SRC} -) - -target_link_libraries(phasar_config - LINK_PRIVATE - ${Boost_LIBRARIES} + LINKS phasar_utils + LINK_PRIVATE ${Boost_LIBRARIES} + LLVM_LINK_COMPONENTS Support ) set_target_properties(phasar_config diff --git a/lib/ControlFlow/CMakeLists.txt b/lib/ControlFlow/CMakeLists.txt index 153e8c13c..ad05cf29e 100644 --- a/lib/ControlFlow/CMakeLists.txt +++ b/lib/ControlFlow/CMakeLists.txt @@ -1,14 +1,8 @@ file(GLOB_RECURSE CONTROLFLOW_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS -) - -set(LLVM_LINK_COMPONENTS - Support -) - add_phasar_library(phasar_controlflow ${CONTROLFLOW_SRC} + LLVM_LINK_COMPONENTS Support ) set_target_properties(phasar_controlflow diff --git a/lib/Controller/CMakeLists.txt b/lib/Controller/CMakeLists.txt index 1d7a898dd..1e5fca721 100644 --- a/lib/Controller/CMakeLists.txt +++ b/lib/Controller/CMakeLists.txt @@ -1,30 +1,27 @@ file(GLOB_RECURSE CONTROLLER_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_llvm_ifdside - phasar_mono - phasar_llvm_db - phasar_llvm_pointer - phasar_llvm_typehierarchy - phasar_llvm_controlflow - phasar_llvm_utils - phasar_utils - phasar_analysis_strategy - phasar_taintconfig -) +add_phasar_library(phasar_controller + FILES + ${CONTROLLER_SRC} -set(LLVM_LINK_COMPONENTS - Core - Support - Demangle -) + LINKS + phasar_llvm_ifdside + phasar_mono + phasar_llvm_db + phasar_llvm_pointer + phasar_llvm_typehierarchy + phasar_llvm_controlflow + phasar_llvm_utils + phasar_utils + phasar_analysis_strategy + phasar_taintconfig -add_phasar_library(phasar_controller - ${CONTROLLER_SRC} -) + LLVM_LINK_COMPONENTS + Core + Support + Demangle -target_link_libraries(phasar_controller - PRIVATE + LINK_PRIVATE ${PHASAR_STD_FILESYSTEM} ) diff --git a/lib/DB/CMakeLists.txt b/lib/DB/CMakeLists.txt index 161f3acaa..d1ee3ec5b 100644 --- a/lib/DB/CMakeLists.txt +++ b/lib/DB/CMakeLists.txt @@ -1,25 +1,14 @@ file(GLOB_RECURSE DB_SRC *.h *.cpp) -include_directories( - ${SQLITE3_INCLUDE_DIR} +add_phasar_library(phasar_db + ${DB_SRC} + LINKS phasar_passes phasar_utils + LLVM_LINK_COMPONENTS Support + LINK_PRIVATE ${SQLITE3_LIBRARY} ) -set(PHASAR_LINK_LIBS - phasar_passes - phasar_utils -) - -set(LLVM_LINK_COMPONENTS - Support -) - - add_phasar_library(phasar_db - ${DB_SRC} - ) - -target_link_libraries(phasar_db - LINK_PRIVATE - ${SQLITE3_LIBRARY} +target_include_directories(phasar_db + PRIVATE ${SQLITE3_INCLUDE_DIR} ) set_target_properties(phasar_db diff --git a/lib/PhasarClang/CMakeLists.txt b/lib/PhasarClang/CMakeLists.txt index 306f06449..6628b573f 100644 --- a/lib/PhasarClang/CMakeLists.txt +++ b/lib/PhasarClang/CMakeLists.txt @@ -1,27 +1,26 @@ file(GLOB_RECURSE PHASARCLANG_SRC *.h *.cpp) -include_directories(${CLANG_INCLUDE_DIRS}) -set(PHASAR_LINK_LIBS - phasar_utils - phasar_taintconfig -) - -set(LLVM_LINK_COMPONENTS - Support - Core - Option -) add_phasar_library(phasar_clang ${PHASARCLANG_SRC} -) + LINKS + phasar_utils + phasar_taintconfig -target_link_libraries(phasar_clang - PUBLIC + LLVM_LINK_COMPONENTS + Support + Core + Option + + LINK_PUBLIC ${CLANG_LIBRARY} ) +target_include_directories(phasar_clang + PUBLIC ${CLANG_INCLUDE_DIRS} +) + set_target_properties(phasar_clang PROPERTIES LINKER_LANGUAGE CXX diff --git a/lib/PhasarLLVM/ControlFlow/CMakeLists.txt b/lib/PhasarLLVM/ControlFlow/CMakeLists.txt index 69f15c960..d62b57a80 100644 --- a/lib/PhasarLLVM/ControlFlow/CMakeLists.txt +++ b/lib/PhasarLLVM/ControlFlow/CMakeLists.txt @@ -1,21 +1,19 @@ file(GLOB_RECURSE CONTROLFLOW_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_llvm_pointer - phasar_llvm_typehierarchy - phasar_db - phasar_utils - phasar_controlflow -) - -set(LLVM_LINK_COMPONENTS - Core - Support - Demangle -) - add_phasar_library(phasar_llvm_controlflow ${CONTROLFLOW_SRC} + + LINKS + phasar_llvm_pointer + phasar_llvm_typehierarchy + phasar_db + phasar_utils + phasar_controlflow + + LLVM_LINK_COMPONENTS + Core + Support + Demangle ) set_target_properties(phasar_llvm_controlflow diff --git a/lib/PhasarLLVM/DB/CMakeLists.txt b/lib/PhasarLLVM/DB/CMakeLists.txt index 78c1a2f67..b3c3bcc7e 100644 --- a/lib/PhasarLLVM/DB/CMakeLists.txt +++ b/lib/PhasarLLVM/DB/CMakeLists.txt @@ -1,19 +1,17 @@ file(GLOB_RECURSE PSR_LLVM_DB_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_db - phasar_utils - phasar_llvm_utils -) - -set(LLVM_LINK_COMPONENTS - Core - Support - IRReader -) - add_phasar_library(phasar_llvm_db ${PSR_LLVM_DB_SRC} + + LINKS + phasar_db + phasar_utils + phasar_llvm_utils + + LLVM_LINK_COMPONENTS + Core + Support + IRReader ) set_target_properties(phasar_llvm_db diff --git a/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt b/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt index fee602022..55ea26420 100644 --- a/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt +++ b/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt @@ -1,26 +1,26 @@ file(GLOB_RECURSE IFDSIDE_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_config - phasar_utils - phasar_llvm_pointer - phasar_llvm - phasar_llvm_typehierarchy - phasar_llvm_controlflow - phasar_llvm_utils - phasar_db - phasar_taintconfig - ${Boost_LIBRARIES} -) - -set(LLVM_LINK_COMPONENTS - Core - Support - Demangle -) - add_phasar_library(phasar_llvm_ifdside ${IFDSIDE_SRC} + + LINKS + phasar_config + phasar_utils + phasar_llvm_pointer + phasar_llvm + phasar_llvm_typehierarchy + phasar_llvm_controlflow + phasar_llvm_utils + phasar_db + phasar_taintconfig + + LLVM_LINK_COMPONENTS + Core + Support + Demangle + + LINK_PRIVATE + ${Boost_LIBRARIES} ) set_target_properties(phasar_llvm_ifdside diff --git a/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt b/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt index 0c509620d..2f46ad474 100644 --- a/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt +++ b/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt @@ -1,21 +1,19 @@ file(GLOB_RECURSE MONO_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_config - phasar_utils - phasar_llvm_utils - phasar_llvm_controlflow - phasar_db - phasar_taintconfig -) - -set(LLVM_LINK_COMPONENTS - Core - Support -) - add_phasar_library(phasar_mono ${MONO_SRC} + + LINKS + phasar_config + phasar_utils + phasar_llvm_utils + phasar_llvm_controlflow + phasar_db + phasar_taintconfig + + LLVM_LINK_COMPONENTS + Core + Support ) set_target_properties(phasar_mono diff --git a/lib/PhasarLLVM/Passes/CMakeLists.txt b/lib/PhasarLLVM/Passes/CMakeLists.txt index 3419073bf..526678b93 100644 --- a/lib/PhasarLLVM/Passes/CMakeLists.txt +++ b/lib/PhasarLLVM/Passes/CMakeLists.txt @@ -1,18 +1,16 @@ file(GLOB_RECURSE PASSES_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_utils -) - -set(LLVM_LINK_COMPONENTS - Core - Support - Analysis - Demangle -) - add_phasar_library(phasar_passes ${PASSES_SRC} + + LINKS + phasar_utils + + LLVM_LINK_COMPONENTS + Core + Support + Analysis + Demangle ) set_target_properties(phasar_passes diff --git a/lib/PhasarLLVM/Pointer/CMakeLists.txt b/lib/PhasarLLVM/Pointer/CMakeLists.txt index d164dcfa7..001e97f00 100644 --- a/lib/PhasarLLVM/Pointer/CMakeLists.txt +++ b/lib/PhasarLLVM/Pointer/CMakeLists.txt @@ -1,29 +1,24 @@ file(GLOB_RECURSE POINTER_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_utils - phasar_db - phasar_pointer - phasar_llvm_utils - phasar_llvm_db -) - -set(LLVM_LINK_COMPONENTS - Core - Support - Analysis - Passes - Demangle -) - -# Handle the library files add_phasar_library(phasar_llvm_pointer ${POINTER_SRC} -) -target_link_libraries(phasar_llvm_pointer + LINKS + phasar_utils + phasar_db + phasar_pointer + phasar_llvm_utils + phasar_llvm_db + + LLVM_LINK_COMPONENTS + Core + Support + Analysis + Passes + Demangle + LINK_PRIVATE - ${Boost_LIBRARIES} + ${Boost_LIBRARIES} ) set_target_properties(phasar_llvm_pointer diff --git a/lib/PhasarLLVM/TaintConfig/CMakeLists.txt b/lib/PhasarLLVM/TaintConfig/CMakeLists.txt index cbacfef00..b3c4036d6 100644 --- a/lib/PhasarLLVM/TaintConfig/CMakeLists.txt +++ b/lib/PhasarLLVM/TaintConfig/CMakeLists.txt @@ -1,26 +1,22 @@ file(GLOB_RECURSE TAINTCONFIG_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_utils - phasar_db - phasar_llvm_db - phasar_llvm_utils - phasar_controlflow - phasar_llvm_controlflow -) - -set(LLVM_LINK_COMPONENTS - Core - Support -) - add_phasar_library(phasar_taintconfig ${TAINTCONFIG_SRC} -) -target_link_libraries(phasar_taintconfig + LINKS + phasar_utils + phasar_db + phasar_llvm_db + phasar_llvm_utils + phasar_controlflow + phasar_llvm_controlflow + + LLVM_LINK_COMPONENTS + Core + Support + LINK_PRIVATE - nlohmann_json_schema_validator + nlohmann_json_schema_validator ) set_target_properties(phasar_taintconfig diff --git a/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt b/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt index 2d02a47fc..e1c5f3c3b 100644 --- a/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt +++ b/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt @@ -1,24 +1,20 @@ file(GLOB_RECURSE TYPEHIERARCHY_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_utils -) - -set(LLVM_LINK_COMPONENTS - Core - Demangle - Support - Analysis -) - # Handle the library files add_phasar_library(phasar_llvm_typehierarchy ${TYPEHIERARCHY_SRC} -) -target_link_libraries(phasar_llvm_typehierarchy + LINKS + phasar_utils + + LLVM_LINK_COMPONENTS + Core + Demangle + Support + Analysis + LINK_PRIVATE - ${Boost_LIBRARIES} + ${Boost_LIBRARIES} ) set_target_properties(phasar_llvm_typehierarchy diff --git a/lib/PhasarLLVM/Utils/CMakeLists.txt b/lib/PhasarLLVM/Utils/CMakeLists.txt index fd072a0f0..6dde21f7a 100644 --- a/lib/PhasarLLVM/Utils/CMakeLists.txt +++ b/lib/PhasarLLVM/Utils/CMakeLists.txt @@ -1,20 +1,17 @@ file(GLOB_RECURSE UTILS_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_config - phasar_utils -) - -set(LLVM_LINK_COMPONENTS - Core - Support - BitWriter - Demangle -) - -# Handle the library files add_phasar_library(phasar_llvm_utils ${UTILS_SRC} + + LINKS + phasar_config + phasar_utils + + LLVM_LINK_COMPONENTS + Core + Support + BitWriter + Demangle ) set_target_properties(phasar_llvm_utils diff --git a/lib/PhasarPass/CMakeLists.txt b/lib/PhasarPass/CMakeLists.txt index 9afa367f0..2f7d6debb 100644 --- a/lib/PhasarPass/CMakeLists.txt +++ b/lib/PhasarPass/CMakeLists.txt @@ -1,32 +1,28 @@ file(GLOB_RECURSE PHASARPASS_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_config - phasar_llvm_controlflow - phasar_llvm_db - phasar_llvm_ifdside - phasar_mono - phasar_passes - phasar_llvm_utils - phasar_llvm_pointer - phasar_llvm_typehierarchy - phasar_utils -) - -set(LLVM_LINK_COMPONENTS - Core - Support -) +# We specifically link internal phasar libs into phasar_pass so on that the +# llvm user side only has to specify one library. add_phasar_library(phasar_pass ${PHASARPASS_SRC} -) -# We specifically link internal phasar libs into phasar_pass so on that the -# llvm user side only has to specify one library. + LINKS + phasar_config + phasar_llvm_controlflow + phasar_llvm_db + phasar_llvm_ifdside + phasar_mono + phasar_passes + phasar_llvm_utils + phasar_llvm_pointer + phasar_llvm_typehierarchy + phasar_utils + + LLVM_LINK_COMPONENTS + Core + Support -target_link_libraries(phasar_pass - PUBLIC + LINK_PUBLIC ${CMAKE_THREAD_LIBS_INIT} ${PHASAR_LINK_LIBS} ${Boost_LIBRARIES} diff --git a/lib/Pointer/CMakeLists.txt b/lib/Pointer/CMakeLists.txt index e6f7b8a3b..8fc0ccd50 100644 --- a/lib/Pointer/CMakeLists.txt +++ b/lib/Pointer/CMakeLists.txt @@ -1,17 +1,15 @@ file(GLOB_RECURSE POINTER_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS - phasar_utils - phasar_db -) - -set(LLVM_LINK_COMPONENTS - Support -) - # Handle the library files add_phasar_library(phasar_pointer ${POINTER_SRC} + + LINKS + phasar_utils + phasar_db + + LLVM_LINK_COMPONENTS + Support ) set_target_properties(phasar_pointer diff --git a/lib/Utils/CMakeLists.txt b/lib/Utils/CMakeLists.txt index 6d4f11a92..2e074329e 100644 --- a/lib/Utils/CMakeLists.txt +++ b/lib/Utils/CMakeLists.txt @@ -6,24 +6,16 @@ if(PHASAR_ENABLE_PAMM STREQUAL "Off" AND NOT PHASAR_BUILD_UNITTESTS) list(REMOVE_ITEM UTILS_SRC ${pamm_src}) endif() -set(PHASAR_LINK_LIBS -) - -set(LLVM_LINK_COMPONENTS - Core - Support - BitWriter - Demangle -) - add_phasar_library(phasar_utils ${UTILS_SRC} -) -target_include_directories(phasar_utils PUBLIC ${LLVM_INCLUDE_DIRS}) + LLVM_LINK_COMPONENTS + Core + Support + BitWriter + Demangle -target_link_libraries(phasar_utils - PRIVATE + LINK_PRIVATE ${PHASAR_STD_FILESYSTEM} ) From d5a40dda28efd6ace21e92527db4dfbd7b1c39e5 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Thu, 12 Oct 2023 17:35:13 +0200 Subject: [PATCH 26/35] Fix phasar_llvm lib build --- Dockerfile | 3 ++- lib/PhasarLLVM/CMakeLists.txt | 16 +++++++--------- lib/PhasarPass/CMakeLists.txt | 1 - 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index f91375c66..f5893f5a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ RUN apt-get -y install --no-install-recommends \ cmake \ ninja-build \ libstdc++6 \ - libboost-all-dev + libboost-graph-dev COPY ./utils/InstallAptDependencies.sh /usr/src/phasar/utils/ RUN ./utils/InstallAptDependencies.sh @@ -53,6 +53,7 @@ RUN git submodule update RUN mkdir -p build && cd build && \ cmake .. \ -DCMAKE_BUILD_TYPE=Release \ + -DPHASAR_TARGET_ARCH="" \ -DCMAKE_CXX_COMPILER=$CXX \ -G Ninja && \ cmake --build . diff --git a/lib/PhasarLLVM/CMakeLists.txt b/lib/PhasarLLVM/CMakeLists.txt index 5959655cb..2129a280f 100644 --- a/lib/PhasarLLVM/CMakeLists.txt +++ b/lib/PhasarLLVM/CMakeLists.txt @@ -9,18 +9,16 @@ add_subdirectory(Utils) file(GLOB PHASAR_LLVM_SRC *.h *.cpp) -set(PHASAR_LINK_LIBS +add_phasar_library(phasar_llvm + ${PHASAR_LLVM_SRC} + + LINKS phasar_llvm_pointer phasar_llvm_db phasar_llvm_controlflow phasar_llvm_typehierarchy -) -set(LLVM_LINK_COMPONENTS - Core - Support -) - -add_phasar_library(phasar_llvm - ${PHASAR_LLVM_SRC} + LLVM_LINK_COMPONENTS + Core + Support ) diff --git a/lib/PhasarPass/CMakeLists.txt b/lib/PhasarPass/CMakeLists.txt index 2f7d6debb..0ff0b31c2 100644 --- a/lib/PhasarPass/CMakeLists.txt +++ b/lib/PhasarPass/CMakeLists.txt @@ -24,7 +24,6 @@ add_phasar_library(phasar_pass LINK_PUBLIC ${CMAKE_THREAD_LIBS_INIT} - ${PHASAR_LINK_LIBS} ${Boost_LIBRARIES} ) From 37aace4d5dfccf775e67a6c405c3034a3c3479ac Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Fri, 13 Oct 2023 15:18:59 +0200 Subject: [PATCH 27/35] Cleanup inclusion of OpenSSL- and Swift tests --- .../DataFlow/IfdsIde/Problems/CMakeLists.txt | 48 +++++++------------ 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/CMakeLists.txt b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/CMakeLists.txt index 23d61519b..708ce3bcb 100644 --- a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/CMakeLists.txt +++ b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/CMakeLists.txt @@ -1,33 +1,4 @@ -if(PHASAR_BUILD_OPENSSL_TS_UNITTESTS) - set(IfdsIdeProblemSources - IFDSConstAnalysisTest.cpp - IFDSTaintAnalysisTest.cpp - IDEInstInteractionAnalysisTest.cpp - IDELinearConstantAnalysisTest.cpp - IDELinearConstantAnalysis_DotTest.cpp - IDETSAnalysisFileIOTest.cpp - IDETSAnalysisOpenSSLEVPKDFTest.cpp - IDETSAnalysisOpenSSLSecureHeapTest.cpp - IDETSAnalysisOpenSSLSecureMemoryTest.cpp - IFDSUninitializedVariablesTest.cpp - IDEExtendedTaintAnalysisTest.cpp - IDEGeneralizedLCATest.cpp - ) -elseif(BUILD_SWIFT_TESTS) - set(IfdsIdeProblemSources - IFDSConstAnalysisTest.cpp - IFDSTaintAnalysisTest.cpp - IDEInstInteractionAnalysisTest.cpp - IDELinearConstantAnalysisTest.cpp - IDELinearConstantAnalysis_DotTest.cpp - IFDSUninitializedVariablesTest.cpp - IDEGeneralizedLCATest.cpp - IDEExtendedTaintAnalysisTest.cpp - IDETSAnalysisFileIOTest.cpp - IDELinearConstantAnalysisSwiftTest.cpp - ) - else() - set(IfdsIdeProblemSources +set(IfdsIdeProblemSources IFDSConstAnalysisTest.cpp IFDSTaintAnalysisTest.cpp IDEInstInteractionAnalysisTest.cpp @@ -37,8 +8,21 @@ elseif(BUILD_SWIFT_TESTS) IDEGeneralizedLCATest.cpp IDEExtendedTaintAnalysisTest.cpp IDETSAnalysisFileIOTest.cpp - ) -endif(PHASAR_BUILD_OPENSSL_TS_UNITTESTS) +) + +if(PHASAR_BUILD_OPENSSL_TS_UNITTESTS) + list(APPEND IfdsIdeProblemSources + IDETSAnalysisOpenSSLEVPKDFTest.cpp + IDETSAnalysisOpenSSLSecureHeapTest.cpp + IDETSAnalysisOpenSSLSecureMemoryTest.cpp + ) +endif() + +if(BUILD_SWIFT_TESTS) + list(APPEND IfdsIdeProblemSources + IDELinearConstantAnalysisSwiftTest.cpp + ) +endif() test_require_config_file("DOTGraphConfig.json") From 2acb9ed1107deb20ca9e83de4d6da097347d022b Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 16 Oct 2023 09:22:08 +0200 Subject: [PATCH 28/35] minor --- CMakeLists.txt | 9 +++++++-- unittests/PhasarLLVM/ControlFlow/CMakeLists.txt | 4 ---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cf942bb97..f644978f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -255,6 +255,8 @@ endif() find_path(SQLITE3_INCLUDE_DIR NAMES sqlite3.h) find_library(SQLITE3_LIBRARY NAMES sqlite3) +option(USE_LLVM_FAT_LIB "Link against libLLVM.so instead of the individual LLVM libraries if possible (default is OFF; always on if BUILD_SHARED_LIBS is ON)" OFF) + # LLVM if (NOT PHASAR_IN_TREE) # Only search for LLVM if we build out of tree @@ -345,7 +347,7 @@ endif() if(NOT PHASAR_IN_TREE) link_directories(${LLVM_LIB_PATH} ${LLVM_LIBRARY_DIRS}) separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS}) - add_definitions(${LLVM_DEFINITIONS_LIST}) + add_cxx_compile_definitions(${LLVM_DEFINITIONS_LIST}) if (BUILD_PHASAR_CLANG) link_directories(${CLANG_LIB_PATH}) endif() @@ -389,7 +391,10 @@ endif(BUILD_SWIFT_TESTS) if (PHASAR_BUILD_UNITTESTS) message("Phasar unittests") add_subdirectory(unittests) - set(PHASAR_BUILD_IR ON) + if(NOT PHASAR_BUILD_IR) + message(WARNING "Set PHASAR_BUILD_IR=ON, because PHASAR_BUILD_UNITTESTS is ON") + set(PHASAR_BUILD_IR ON) + endif() endif() # Build all IR test code diff --git a/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt b/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt index 2cb3c3a29..04cb11d94 100644 --- a/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt +++ b/unittests/PhasarLLVM/ControlFlow/CMakeLists.txt @@ -12,10 +12,6 @@ set(ControlFlowSources LLVMBasedICFGSerializationTest.cpp ) -set(LLVM_LINK_COMPONENTS - Linker -) - foreach(TEST_SRC ${ControlFlowSources}) add_phasar_unittest(${TEST_SRC}) endforeach(TEST_SRC) From fdcb57d999be395bf6cefc7bae846777b337fd8a Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 16 Oct 2023 13:17:27 +0200 Subject: [PATCH 29/35] Remove explicit definition of linker language and lib prefix --- CMakeLists.txt | 2 +- include/phasar/ControlFlow/CallGraphBase.h | 2 -- lib/AnalysisStrategy/CMakeLists.txt | 6 ------ lib/Config/CMakeLists.txt | 6 ------ lib/ControlFlow/CMakeLists.txt | 6 ------ lib/Controller/CMakeLists.txt | 6 ------ lib/DB/CMakeLists.txt | 6 ------ lib/PhasarClang/CMakeLists.txt | 6 ------ lib/PhasarLLVM/ControlFlow/CMakeLists.txt | 6 ------ lib/PhasarLLVM/DB/CMakeLists.txt | 6 ------ lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt | 6 ------ lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt | 6 ------ lib/PhasarLLVM/Passes/CMakeLists.txt | 6 ------ lib/PhasarLLVM/Pointer/CMakeLists.txt | 6 ------ lib/PhasarLLVM/TaintConfig/CMakeLists.txt | 6 ------ lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt | 6 ------ lib/PhasarLLVM/Utils/CMakeLists.txt | 6 ------ lib/PhasarPass/CMakeLists.txt | 6 ------ lib/Pointer/CMakeLists.txt | 6 ------ 19 files changed, 1 insertion(+), 105 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f644978f3..0a89d5d17 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -347,7 +347,7 @@ endif() if(NOT PHASAR_IN_TREE) link_directories(${LLVM_LIB_PATH} ${LLVM_LIBRARY_DIRS}) separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS}) - add_cxx_compile_definitions(${LLVM_DEFINITIONS_LIST}) + add_definitions(${LLVM_DEFINITIONS_LIST}) if (BUILD_PHASAR_CLANG) link_directories(${CLANG_LIB_PATH}) endif() diff --git a/include/phasar/ControlFlow/CallGraphBase.h b/include/phasar/ControlFlow/CallGraphBase.h index e2b1e01e5..2f2371618 100644 --- a/include/phasar/ControlFlow/CallGraphBase.h +++ b/include/phasar/ControlFlow/CallGraphBase.h @@ -13,8 +13,6 @@ #include "phasar/Utils/ByRef.h" #include "phasar/Utils/TypeTraits.h" -#include "nlohmann/json.hpp" - namespace psr { template struct CGTraits { // using n_t diff --git a/lib/AnalysisStrategy/CMakeLists.txt b/lib/AnalysisStrategy/CMakeLists.txt index 583400389..5bb3d4446 100644 --- a/lib/AnalysisStrategy/CMakeLists.txt +++ b/lib/AnalysisStrategy/CMakeLists.txt @@ -5,9 +5,3 @@ add_phasar_library(phasar_analysis_strategy LINKS phasar_db phasar_controlflow LLVM_LINK_COMPONENTS Support ) - -set_target_properties(phasar_analysis_strategy - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/Config/CMakeLists.txt b/lib/Config/CMakeLists.txt index 7eeba57fb..455fa8fbf 100644 --- a/lib/Config/CMakeLists.txt +++ b/lib/Config/CMakeLists.txt @@ -6,9 +6,3 @@ add_phasar_library(phasar_config LINK_PRIVATE ${Boost_LIBRARIES} LLVM_LINK_COMPONENTS Support ) - -set_target_properties(phasar_config - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/ControlFlow/CMakeLists.txt b/lib/ControlFlow/CMakeLists.txt index ad05cf29e..54e7f92ec 100644 --- a/lib/ControlFlow/CMakeLists.txt +++ b/lib/ControlFlow/CMakeLists.txt @@ -4,9 +4,3 @@ add_phasar_library(phasar_controlflow ${CONTROLFLOW_SRC} LLVM_LINK_COMPONENTS Support ) - -set_target_properties(phasar_controlflow - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/Controller/CMakeLists.txt b/lib/Controller/CMakeLists.txt index 1e5fca721..dba171b58 100644 --- a/lib/Controller/CMakeLists.txt +++ b/lib/Controller/CMakeLists.txt @@ -24,9 +24,3 @@ add_phasar_library(phasar_controller LINK_PRIVATE ${PHASAR_STD_FILESYSTEM} ) - -set_target_properties(phasar_controller - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/DB/CMakeLists.txt b/lib/DB/CMakeLists.txt index d1ee3ec5b..d5dbf67e1 100644 --- a/lib/DB/CMakeLists.txt +++ b/lib/DB/CMakeLists.txt @@ -10,9 +10,3 @@ add_phasar_library(phasar_db target_include_directories(phasar_db PRIVATE ${SQLITE3_INCLUDE_DIR} ) - -set_target_properties(phasar_db - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/PhasarClang/CMakeLists.txt b/lib/PhasarClang/CMakeLists.txt index 6628b573f..312695034 100644 --- a/lib/PhasarClang/CMakeLists.txt +++ b/lib/PhasarClang/CMakeLists.txt @@ -20,9 +20,3 @@ add_phasar_library(phasar_clang target_include_directories(phasar_clang PUBLIC ${CLANG_INCLUDE_DIRS} ) - -set_target_properties(phasar_clang - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/PhasarLLVM/ControlFlow/CMakeLists.txt b/lib/PhasarLLVM/ControlFlow/CMakeLists.txt index d62b57a80..162f9a6cf 100644 --- a/lib/PhasarLLVM/ControlFlow/CMakeLists.txt +++ b/lib/PhasarLLVM/ControlFlow/CMakeLists.txt @@ -15,9 +15,3 @@ add_phasar_library(phasar_llvm_controlflow Support Demangle ) - -set_target_properties(phasar_llvm_controlflow - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/PhasarLLVM/DB/CMakeLists.txt b/lib/PhasarLLVM/DB/CMakeLists.txt index b3c3bcc7e..5c89b3aa6 100644 --- a/lib/PhasarLLVM/DB/CMakeLists.txt +++ b/lib/PhasarLLVM/DB/CMakeLists.txt @@ -13,9 +13,3 @@ add_phasar_library(phasar_llvm_db Support IRReader ) - -set_target_properties(phasar_llvm_db - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt b/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt index 55ea26420..9411bc739 100644 --- a/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt +++ b/lib/PhasarLLVM/DataFlow/IfdsIde/CMakeLists.txt @@ -22,9 +22,3 @@ add_phasar_library(phasar_llvm_ifdside LINK_PRIVATE ${Boost_LIBRARIES} ) - -set_target_properties(phasar_llvm_ifdside - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt b/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt index 2f46ad474..7c7d00bf9 100644 --- a/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt +++ b/lib/PhasarLLVM/DataFlow/Mono/CMakeLists.txt @@ -15,9 +15,3 @@ add_phasar_library(phasar_mono Core Support ) - -set_target_properties(phasar_mono - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/PhasarLLVM/Passes/CMakeLists.txt b/lib/PhasarLLVM/Passes/CMakeLists.txt index 526678b93..10c71117e 100644 --- a/lib/PhasarLLVM/Passes/CMakeLists.txt +++ b/lib/PhasarLLVM/Passes/CMakeLists.txt @@ -12,9 +12,3 @@ add_phasar_library(phasar_passes Analysis Demangle ) - -set_target_properties(phasar_passes - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/PhasarLLVM/Pointer/CMakeLists.txt b/lib/PhasarLLVM/Pointer/CMakeLists.txt index 001e97f00..c189f6153 100644 --- a/lib/PhasarLLVM/Pointer/CMakeLists.txt +++ b/lib/PhasarLLVM/Pointer/CMakeLists.txt @@ -20,9 +20,3 @@ add_phasar_library(phasar_llvm_pointer LINK_PRIVATE ${Boost_LIBRARIES} ) - -set_target_properties(phasar_llvm_pointer - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/PhasarLLVM/TaintConfig/CMakeLists.txt b/lib/PhasarLLVM/TaintConfig/CMakeLists.txt index b3c4036d6..cfe4a7045 100644 --- a/lib/PhasarLLVM/TaintConfig/CMakeLists.txt +++ b/lib/PhasarLLVM/TaintConfig/CMakeLists.txt @@ -18,9 +18,3 @@ add_phasar_library(phasar_taintconfig LINK_PRIVATE nlohmann_json_schema_validator ) - -set_target_properties(phasar_taintconfig - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt b/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt index e1c5f3c3b..3c3d86078 100644 --- a/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt +++ b/lib/PhasarLLVM/TypeHierarchy/CMakeLists.txt @@ -16,9 +16,3 @@ add_phasar_library(phasar_llvm_typehierarchy LINK_PRIVATE ${Boost_LIBRARIES} ) - -set_target_properties(phasar_llvm_typehierarchy - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/PhasarLLVM/Utils/CMakeLists.txt b/lib/PhasarLLVM/Utils/CMakeLists.txt index 6dde21f7a..b88ee9d75 100644 --- a/lib/PhasarLLVM/Utils/CMakeLists.txt +++ b/lib/PhasarLLVM/Utils/CMakeLists.txt @@ -13,9 +13,3 @@ add_phasar_library(phasar_llvm_utils BitWriter Demangle ) - -set_target_properties(phasar_llvm_utils - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/PhasarPass/CMakeLists.txt b/lib/PhasarPass/CMakeLists.txt index 0ff0b31c2..dd4dff3cb 100644 --- a/lib/PhasarPass/CMakeLists.txt +++ b/lib/PhasarPass/CMakeLists.txt @@ -26,9 +26,3 @@ add_phasar_library(phasar_pass ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} ) - -set_target_properties(phasar_pass - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) diff --git a/lib/Pointer/CMakeLists.txt b/lib/Pointer/CMakeLists.txt index 8fc0ccd50..5c2f8d43e 100644 --- a/lib/Pointer/CMakeLists.txt +++ b/lib/Pointer/CMakeLists.txt @@ -11,9 +11,3 @@ add_phasar_library(phasar_pointer LLVM_LINK_COMPONENTS Support ) - -set_target_properties(phasar_pointer - PROPERTIES - LINKER_LANGUAGE CXX - PREFIX "lib" -) From aac4aa2846ed6ae50c98d47cc8eaa6aefe8c8af0 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Mon, 16 Oct 2023 17:21:53 +0200 Subject: [PATCH 30/35] Update install --- CMakeLists.txt | 5 ++- Config.cmake.in | 43 ++++++++++++------- examples/use-phasar-as-library/CMakeLists.txt | 5 +-- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a89d5d17..55bdf143c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -403,7 +403,8 @@ if (PHASAR_BUILD_IR) add_subdirectory(test) endif() -set(INCLUDE_INSTALL_DIR include/ CACHE PATH "Install dir of headers") +set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}" CACHE PATH "Install dir of headers") +set(LIBRARY_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}" CACHE PATH "Install dir of libraries") # Install targets of phasar-cli, other executables, and libraries are to be # found in the individual subdirectories of tools/ @@ -460,7 +461,7 @@ configure_package_config_file( Config.cmake.in phasarConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/phasar - PATH_VARS INCLUDE_INSTALL_DIR + PATH_VARS INCLUDE_INSTALL_DIR LIBRARY_INSTALL_DIR ) write_basic_package_version_file( diff --git a/Config.cmake.in b/Config.cmake.in index 78e7bb723..0bd2ea7c8 100644 --- a/Config.cmake.in +++ b/Config.cmake.in @@ -2,13 +2,19 @@ set(PHASAR_VERSION 1.0.0) @PACKAGE_INIT@ set_and_check(PHASAR_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") +set_and_check(PHASAR_LIBRARY_DIR "@PACKAGE_LIBRARY_INSTALL_DIR@") include (CMakeFindDependencyMacro) find_dependency(nlohmann_json) find_dependency(nlohmann_json_schema_validator) -find_package(Boost 1.65.1 COMPONENTS program_options graph REQUIRED) -# TODO: The order seems to be important. Fix this! +find_package(Boost 1.65.1 COMPONENTS graph REQUIRED) +find_package(LLVM 14 REQUIRED CONFIG) + +set(PHASAR_USE_LLVM_FAT_LIB @USE_LLVM_FAT_LIB@) +set(PHASAR_BUILD_DYNLIB @PHASAR_BUILD_DYNLIB@) + +# TODO: The order seems to be important in the include'ing loop below. Fix this! set(PHASAR_COMPONENTS utils @@ -32,27 +38,32 @@ set(PHASAR_COMPONENTS controller ) +list(REMOVE_DUPLICATES phasar_FIND_COMPONENTS) + +foreach(component ${phasar_FIND_COMPONENTS}) + if(NOT ${component} IN_LIST PHASAR_COMPONENTS) + message(FATAL_ERROR "Requested component ${component} is no valid PHASAR component. Valid components are: ${PHASAR_COMPONENTS}") + break() + endif() +endforeach() + foreach(component ${PHASAR_COMPONENTS}) include("${CMAKE_CURRENT_LIST_DIR}/phasar_${component}-targets.cmake") - list(APPEND PHASAR_NEEDED_LIBS phasar::phasar_${component}) endforeach() -list(REMOVE_DUPLICATES PHASAR_NEEDED_LIBS) - -find_package(LLVM 14 REQUIRED CONFIG) -include_directories(${LLVM_INCLUDE_DIRS}) -link_directories(${LLVM_LIB_PATH} ${LLVM_LIBRARY_DIRS}) -find_library(LLVM_LIBRARY NAMES LLVM HINTS ${LLVM_LIBRARY_DIRS}) +foreach(component ${phasar_FIND_COMPONENTS}) + list(APPEND PHASAR_NEEDED_LIBS phasar::phasar_${component}) +endforeach() function(phasar_config executable) - if(NOT ${LLVM_LIBRARY} STREQUAL "LLVM_LIBRARY-NOTFOUND") - llvm_config(${executable} USE_SHARED ${PHASAR_LLVM_DEPS}) - else() - llvm_config(${executable} ${PHASAR_LLVM_DEPS}) - endif() - target_link_libraries(${executable} PUBLIC - ${PHASAR_NEEDED_LIBS} + ${PHASAR_NEEDED_LIBS} + ) + + # TODO: Use target_include_directories from withing phasar already, such that phasar_config is no longer necessary in the future + target_include_directories(${executable} + PUBLIC + ${PHASAR_INCLUDE_DIR} ) endfunction() diff --git a/examples/use-phasar-as-library/CMakeLists.txt b/examples/use-phasar-as-library/CMakeLists.txt index bba4e8e6d..3c06c550f 100644 --- a/examples/use-phasar-as-library/CMakeLists.txt +++ b/examples/use-phasar-as-library/CMakeLists.txt @@ -7,16 +7,13 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) +find_package(phasar COMPONENTS llvm_ifdside REQUIRED) # Build a small test tool to show how phasar may be used add_executable(myphasartool myphasartool.cpp ) -find_package(phasar COMPONENTS ifdside REQUIRED) -include_directories(${PHASAR_INCLUDE_DIR}) -link_directories(${PHASAR_LIBRARY_DIR}) - phasar_config(myphasartool) install(TARGETS myphasartool From 0d8104f3e1fe6cf3ff4b66e4da9dff4a79df21d0 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Tue, 17 Oct 2023 14:44:01 +0200 Subject: [PATCH 31/35] Improve install by adding phasar include directories to the targets interfaces --- CMakeLists.txt | 13 +------- Config.cmake.in | 16 ++++----- cmake/phasar_macros.cmake | 33 +++++++++++-------- examples/use-phasar-as-library/CMakeLists.txt | 12 ++++++- lib/ControlFlow/CMakeLists.txt | 1 + lib/Utils/CMakeLists.txt | 2 ++ 6 files changed, 43 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 55bdf143c..44b93dff8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -334,17 +334,9 @@ if (PHASAR_ENABLE_CLANG_TIDY_DURING_BUILD) ) endif () -# Library Dependency Headers -include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) -include_directories(SYSTEM external/json/include/) -include_directories(SYSTEM external/json-schema-validator/src/) -include_directories(SYSTEM ${GTEST_INCLUDE_DIR}) -if(NOT PHASAR_IN_TREE) - include_directories(${LLVM_INCLUDE_DIRS}) -endif() - # Library Dependency Dirs if(NOT PHASAR_IN_TREE) + include_directories(${LLVM_INCLUDE_DIRS}) link_directories(${LLVM_LIB_PATH} ${LLVM_LIBRARY_DIRS}) separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS}) add_definitions(${LLVM_DEFINITIONS_LIST}) @@ -355,9 +347,6 @@ endif() # Installed config configure_file(config.h.in include/phasar/Config/phasar-config.h @ONLY) -include_directories("${CMAKE_CURRENT_BINARY_DIR}/include/") - -include_directories(${PHASAR_SRC_DIR}/include) # Warnings option(PHASAR_ENABLE_WARNINGS "Enable warnings" ON) diff --git a/Config.cmake.in b/Config.cmake.in index 0bd2ea7c8..98d5c07c7 100644 --- a/Config.cmake.in +++ b/Config.cmake.in @@ -42,14 +42,20 @@ list(REMOVE_DUPLICATES phasar_FIND_COMPONENTS) foreach(component ${phasar_FIND_COMPONENTS}) if(NOT ${component} IN_LIST PHASAR_COMPONENTS) - message(FATAL_ERROR "Requested component ${component} is no valid PHASAR component. Valid components are: ${PHASAR_COMPONENTS}") - break() + set(phasar_FOUND false) + set(phasar_NOT_FOUND_MESSAGE "Unsupported component: ${component}. valid components are: ${PHASAR_COMPONENTS}") endif() endforeach() foreach(component ${PHASAR_COMPONENTS}) include("${CMAKE_CURRENT_LIST_DIR}/phasar_${component}-targets.cmake") endforeach() +include("${CMAKE_CURRENT_LIST_DIR}/phasar-targets.cmake") + +if (NOT phasar_FIND_COMPONENTS) + list(APPEND PHASAR_NEEDED_LIBS phasar::phasar) + set(phasar_FIND_COMPONENTS ${PHASAR_NEEDED_LIBS}) +endif() foreach(component ${phasar_FIND_COMPONENTS}) list(APPEND PHASAR_NEEDED_LIBS phasar::phasar_${component}) @@ -60,10 +66,4 @@ function(phasar_config executable) PUBLIC ${PHASAR_NEEDED_LIBS} ) - - # TODO: Use target_include_directories from withing phasar already, such that phasar_config is no longer necessary in the future - target_include_directories(${executable} - PUBLIC - ${PHASAR_INCLUDE_DIR} - ) endfunction() diff --git a/cmake/phasar_macros.cmake b/cmake/phasar_macros.cmake index 58b32f6ce..b0b48c083 100644 --- a/cmake/phasar_macros.cmake +++ b/cmake/phasar_macros.cmake @@ -186,22 +186,29 @@ function(add_phasar_library name) add_dependencies(${name} ${LLVM_COMMON_DEPENDS}) endif(LLVM_COMMON_DEPENDS) - foreach(lib ${PHASAR_LIB_LINKS}) - if(PHASAR_DEBUG_LIBDEPS) - target_link_libraries(${name} PRIVATE ${lib}) - else() - target_link_libraries(${name} PUBLIC ${lib}) - endif() - endforeach() - foreach(lib ${PHASAR_LIB_LINK_PUBLIC}) - target_link_libraries(${name} PUBLIC ${lib}) - endforeach() - foreach(lib ${PHASAR_LIB_LINK_PRIVATE}) - target_link_libraries(${name} PRIVATE ${lib}) - endforeach() + if(PHASAR_DEBUG_LIBDEPS) + target_link_libraries(${name} PRIVATE ${PHASAR_LIB_LINKS}) + else() + target_link_libraries(${name} PUBLIC ${PHASAR_LIB_LINKS}) + endif() + + target_link_libraries(${name} PUBLIC ${PHASAR_LIB_LINK_PUBLIC}) + target_link_libraries(${name} PRIVATE ${PHASAR_LIB_LINK_PRIVATE}) phasar_link_llvm(${name} ${PHASAR_LIB_LLVM_LINK_COMPONENTS}) + target_include_directories(${name} + PUBLIC + $ # The regular include folder + $ # The location of phasar-config.h + ) + + # Set the target property such that installed PhASAR knows where to find its includes (must be relative paths in this case in contrast to non-installed PhASAR!) + set_property(TARGET ${name} APPEND + PROPERTY INTERFACE_INCLUDE_DIRECTORIES + $ + ) + if(MSVC) get_target_property(cflag ${name} COMPILE_FLAGS) diff --git a/examples/use-phasar-as-library/CMakeLists.txt b/examples/use-phasar-as-library/CMakeLists.txt index 3c06c550f..de0f50fd1 100644 --- a/examples/use-phasar-as-library/CMakeLists.txt +++ b/examples/use-phasar-as-library/CMakeLists.txt @@ -9,12 +9,22 @@ set(CMAKE_CXX_EXTENSIONS OFF) find_package(phasar COMPONENTS llvm_ifdside REQUIRED) +# Or without specifying components +# find_package(phasar REQUIRED) + # Build a small test tool to show how phasar may be used add_executable(myphasartool myphasartool.cpp ) -phasar_config(myphasartool) +# Old way using phasar_config: +# phasar_config(myphasartool) + +# New way using target_link_libraries: +target_link_libraries(myphasartool phasar::phasar_llvm_ifdside) + +# If find_package did not specify components: +# target_link_libraries(myphasartool phasar::phasar) install(TARGETS myphasartool RUNTIME DESTINATION bin diff --git a/lib/ControlFlow/CMakeLists.txt b/lib/ControlFlow/CMakeLists.txt index 54e7f92ec..39084cd11 100644 --- a/lib/ControlFlow/CMakeLists.txt +++ b/lib/ControlFlow/CMakeLists.txt @@ -3,4 +3,5 @@ file(GLOB_RECURSE CONTROLFLOW_SRC *.h *.cpp) add_phasar_library(phasar_controlflow ${CONTROLFLOW_SRC} LLVM_LINK_COMPONENTS Support + LINK_PRIVATE nlohmann_json::nlohmann_json ) diff --git a/lib/Utils/CMakeLists.txt b/lib/Utils/CMakeLists.txt index 2e074329e..c10569663 100644 --- a/lib/Utils/CMakeLists.txt +++ b/lib/Utils/CMakeLists.txt @@ -17,6 +17,8 @@ add_phasar_library(phasar_utils LINK_PRIVATE ${PHASAR_STD_FILESYSTEM} + LINK_PUBLIC + nlohmann_json::nlohmann_json ) set_target_properties(phasar_utils From 61fb7687b7943046875e55fde4651bfba3ce4a50 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Tue, 17 Oct 2023 17:52:55 +0200 Subject: [PATCH 32/35] minor --- lib/PhasarLLVM/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/PhasarLLVM/CMakeLists.txt b/lib/PhasarLLVM/CMakeLists.txt index 2129a280f..be4adc5e0 100644 --- a/lib/PhasarLLVM/CMakeLists.txt +++ b/lib/PhasarLLVM/CMakeLists.txt @@ -13,6 +13,7 @@ add_phasar_library(phasar_llvm ${PHASAR_LLVM_SRC} LINKS + phasar_utils phasar_llvm_pointer phasar_llvm_db phasar_llvm_controlflow From 99d4288b1593a0058d7251d9f8970fb5ead89979 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Wed, 18 Oct 2023 20:23:24 +0200 Subject: [PATCH 33/35] Small fixes for the in-tree build --- CMakeLists.txt | 13 ++++++------- cmake/phasar_macros.cmake | 2 +- lib/PhasarLLVM/TaintConfig/CMakeLists.txt | 5 ++--- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 44b93dff8..74cbf8ff3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,14 +38,10 @@ include(GNUInstallDirs) set_property(GLOBAL PROPERTY TARGET_MESSAGES OFF) -set(CMAKE_CONFIGURATION_TYPES Debug RelWithDebInfo Release CACHE STRING "Configuration types: Debug, RelWithDebInfo and Release" FORCE) - option(PHASAR_ENABLE_SANITIZERS "Build PhASAR with AddressSanitizer and UBSanitizer (default is OFF)" OFF) -set(DEBUG_CONFIGURATIONS DEBUG CACHE INTERNAL "" FORCE) -set(RELEASE_CONFIGURATIONS RELWITHDEBINFO RELEASE CACHE INTERNAL "" FORCE) - set(PHASAR_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(PHASAR_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PHASAR_SRC_DIR}/cmake") include("phasar_macros") @@ -56,10 +52,14 @@ endif () if(GENERATOR_IS_MULTI_CONFIG) message(STATUS "Selected multi-config Build") + set(CMAKE_CONFIGURATION_TYPES Debug RelWithDebInfo Release CACHE STRING "Configuration types: Debug, RelWithDebInfo and Release" FORCE) else() message(STATUS "Selected ${CMAKE_BUILD_TYPE} Build") endif() +set(DEBUG_CONFIGURATIONS DEBUG CACHE INTERNAL "" FORCE) +set(RELEASE_CONFIGURATIONS RELWITHDEBINFO RELEASE CACHE INTERNAL "" FORCE) + # TODO: Once available, we may want to use -fextend-lifetimes on Debug- and RelWithDebInfo builds to improve debugging experience # https://reviews.llvm.org/D157613 @@ -68,7 +68,6 @@ string(APPEND CMAKE_CXX_FLAGS_DEBUG " -Og -fno-omit-frame-pointer") string(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " -fno-omit-frame-pointer") string(APPEND CMAKE_CXX_FLAGS_RELEASE "") - option(CMAKE_VISIBILITY_INLINES_HIDDEN "Hide inlined functions from the DSO table (default ON)" ON) # march=native @@ -273,7 +272,7 @@ if (NOT PHASAR_IN_TREE) endif() endif() -if(NOT LLVM_ENABLE_RTTI) +if(NOT LLVM_ENABLE_RTTI AND NOT PHASAR_IN_TREE) message(FATAL_ERROR "PhASAR requires a LLVM version that is built with RTTI") endif() diff --git a/cmake/phasar_macros.cmake b/cmake/phasar_macros.cmake index b0b48c083..4e7b2a901 100644 --- a/cmake/phasar_macros.cmake +++ b/cmake/phasar_macros.cmake @@ -200,7 +200,7 @@ function(add_phasar_library name) target_include_directories(${name} PUBLIC $ # The regular include folder - $ # The location of phasar-config.h + $ # The location of phasar-config.h ) # Set the target property such that installed PhASAR knows where to find its includes (must be relative paths in this case in contrast to non-installed PhASAR!) diff --git a/lib/PhasarLLVM/TaintConfig/CMakeLists.txt b/lib/PhasarLLVM/TaintConfig/CMakeLists.txt index cfe4a7045..1a801938f 100644 --- a/lib/PhasarLLVM/TaintConfig/CMakeLists.txt +++ b/lib/PhasarLLVM/TaintConfig/CMakeLists.txt @@ -11,10 +11,9 @@ add_phasar_library(phasar_taintconfig phasar_controlflow phasar_llvm_controlflow + nlohmann_json_schema_validator + LLVM_LINK_COMPONENTS Core Support - - LINK_PRIVATE - nlohmann_json_schema_validator ) From 0fa2a0f714edc4b311123bd26dc52c9d56e35433 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Fri, 20 Oct 2023 16:25:43 +0200 Subject: [PATCH 34/35] minor style --- CMakeLists.txt | 76 ++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 74cbf8ff3..68c3607c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -485,48 +485,44 @@ set(MAJOR_VERSION 1) set(MINOR_VERSION 0) set(PATCH_VERSION 0) if (NOT PHASAR_IN_TREE) -IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") -INCLUDE(InstallRequiredSystemLibraries) -set(CPACK_SET_DESTDIR "on") -set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -#set(CPACK_GENERATOR "DEB") -set(CPACK_GENERATOR "RPM") -set(CPACK_PACKAGE_DESCRIPTION "Phasar") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Phasar a LLVM-based static analysis framework") -set(CPACK_PACKAGE_VENDOR "Phasar Team - Philipp Schubert and others") -set(CPACK_PACKAGE_CONTACT "philipp.schubert@upb.de") -set(CPACK_PACKAGE_VERSION_MAJOR "${MAJOR_VERSION}") -set(CPACK_PACKAGE_VERSION_MINOR "${MINOR_VERSION}") -set(CPACK_PACKAGE_VERSION_PATCH "${PATCH_VERSION}") -set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${MAJOR_VERSION}.${MINOR_VERSION}.${CPACK_PACKAGE_VERSION_PATCH}") -set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${MAJOR_VERSION}.${MINOR_VERSION}.${CPACK_PACKAGE_VERSION_PATCH}") -# package dependencies can be set-up here -# better use autogenerated dependency information -set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) -set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") -set(CPACK_DEBIAN_PACKAGE_SECTION "kde") -set(CPACK_DEBIAN_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) -set(CPACK_COMPONENTS_ALL Libraries ApplicationData) -INCLUDE(CPack) -ENDIF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") + if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") + include(InstallRequiredSystemLibraries) + set(CPACK_SET_DESTDIR "on") + set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + + set(CPACK_GENERATOR "DEB") + set(CPACK_PACKAGE_DESCRIPTION "Phasar") + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Phasar a LLVM-based static analysis framework") + set(CPACK_PACKAGE_VENDOR "Phasar Team - Philipp Schubert and others") + set(CPACK_PACKAGE_CONTACT "philipp.schubert@upb.de") + set(CPACK_PACKAGE_VERSION_MAJOR "${MAJOR_VERSION}") + set(CPACK_PACKAGE_VERSION_MINOR "${MINOR_VERSION}") + set(CPACK_PACKAGE_VERSION_PATCH "${PATCH_VERSION}") + set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${MAJOR_VERSION}.${MINOR_VERSION}.${CPACK_PACKAGE_VERSION_PATCH}") + set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${MAJOR_VERSION}.${MINOR_VERSION}.${CPACK_PACKAGE_VERSION_PATCH}") + # package dependencies can be set-up here + # better use autogenerated dependency information + set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) + set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") + set(CPACK_DEBIAN_PACKAGE_SECTION "kde") + set(CPACK_DEBIAN_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) + set(CPACK_COMPONENTS_ALL Libraries ApplicationData) + include(CPack) + endif(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") endif() # Setup the doxygen code documentation if(PHASAR_BUILD_DOC) - find_package(Doxygen) - if (DOXYGEN_FOUND) - set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/docs/Doxyfile.in) - set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) - configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY) - message("Doxygen build started") - add_custom_target(doc_doxygen ALL - COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Generating API documentation with Doxygen" - VERBATIM - ) - else(DOXYGEN_FOUND) - message(FATAL_ERROR "Doxygen need to be installed to generate the doxygen documentation.") - endif() + find_package(Doxygen REQUIRED) + + set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/docs/Doxyfile.in) + set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) + configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY) + + add_custom_target(doc_doxygen ALL + COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating API documentation with Doxygen" + VERBATIM + ) endif() From 652c6442b2c1724a0ba6f456be8ea8d5e0b1d629 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Fri, 20 Oct 2023 16:34:07 +0200 Subject: [PATCH 35/35] minor tweak for in-tree build --- lib/PhasarClang/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/PhasarClang/CMakeLists.txt b/lib/PhasarClang/CMakeLists.txt index 312695034..961953ae2 100644 --- a/lib/PhasarClang/CMakeLists.txt +++ b/lib/PhasarClang/CMakeLists.txt @@ -20,3 +20,9 @@ add_phasar_library(phasar_clang target_include_directories(phasar_clang PUBLIC ${CLANG_INCLUDE_DIRS} ) + +if(PHASAR_IN_TREE) + # Some phasar-clang headers depend on generated files e.g files included from clang/AST/ASTFwd.h + # Make sure, phasar-clang is built *after* these files have been generated + add_dependencies(phasar_clang intrinsics_gen) +endif()