Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add -fno-rtti/fno-exceptions based on LLVM's configuration #1291

Merged
merged 22 commits into from
Dec 28, 2023
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
bdbae40
Modified CMakeLists.txt to take whether or not to disable RTTI & exce…
Johanmyst Dec 19, 2023
3959742
Fixed setting of C++ standard and removed requirement for LLVM to be …
Johanmyst Dec 20, 2023
2c574c6
Fix matching parameters and return values for "OVERWRITE" functions a…
shuangxiangkan Dec 18, 2023
c24615f
Remove getPointerElementType()
shuangxiangkan Dec 18, 2023
8f01b0e
SVF code formatter
yuleisui Dec 18, 2023
9ef3df0
Take LLVMContext object from module used to build SVFModule rather th…
Johanmyst Dec 19, 2023
6e83d12
Merge branch 'fix_ctx_src'
Johanmyst Dec 20, 2023
ca5632c
Replaced fatal error for LLVM versions greater than 15 with a warning…
Johanmyst Dec 20, 2023
58a4ffc
Switched adding LLVM definitions, link directories, and include direc…
Johanmyst Dec 20, 2023
af15d88
Switched to CMake-recommended way of linking libraries (through `targ…
Johanmyst Dec 20, 2023
3f51410
Add the tools through `add_llvm_executable`; modify build/setup scrip…
Johanmyst Dec 20, 2023
d0a1b83
Apparently this is not the case for older CMake versions; explicitly …
Johanmyst Dec 20, 2023
1fd01be
Tests require specific output directory for tools
Johanmyst Dec 20, 2023
6cc852b
Merge branch 'fix_rtti_eh_from_llvm'
Johanmyst Dec 20, 2023
6f1f351
Merge branch 'SVF-tools:master' into fix_rtti_eh_from_llvm
Johanmyst Dec 20, 2023
d4e6d6b
Merge branch 'SVF-tools:master' into master
Johanmyst Dec 20, 2023
97d624d
Updated CMake build system to install correctly; moved more LLVM-only…
Johanmyst Dec 22, 2023
d8670ae
Merge branch 'SVF-tools:master' into master
Johanmyst Dec 22, 2023
fabc7df
Merge remote-tracking branch 'origin/master' into fix_rtti_eh_from_ll…
Johanmyst Dec 22, 2023
d85eacb
Removed repetitive setting of C++ standard to top-level CMakeLists.tx…
Johanmyst Dec 28, 2023
1f54a14
FIX: Replaced setting `CXX_STANDARD` (and related) with `CMAKE_CXX_ST…
Johanmyst Dec 28, 2023
1063318
Merge branch 'SVF-tools:master' into fix_rtti_eh_from_llvm
Johanmyst Dec 28, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 10 additions & 11 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,11 @@ cmake_minimum_required(VERSION 3.13.4)

project("SVF")

message(STATUS "Using CMake with generator: ${CMAKE_GENERATOR}")

configure_file(${PROJECT_SOURCE_DIR}/.config.in
${PROJECT_BINARY_DIR}/include/Util/config.h)

# We need to match the build environment for LLVM: In particular, we need C++14
# and the -fno-rtti flag
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can adjust the language standard here, like:

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)

Those properties will be effective for all new targets by default.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Johanmyst could you add the options here and remove set_property in svf-llvm/CMakLiist.txt and svf/CMakeList.txt

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. 👍

# add -std=gnu++14
set(CMAKE_CXX_EXTENSIONS ON)

add_compile_options("-fno-rtti")
add_compile_options("-fno-exceptions")
Comment on lines -15 to -16
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we want to enable svfcore as -fno-rtti/fno-exceptions, these two options should also be in the root/CMakeList or svf/CMakeList?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, this was why I initially moved the LLVM finding into the top-level CMakeLists.txt since settings these options is based on whether the found LLVM instance supports them. I changed it now so that the CMakeLists.txt in svf-llvm sets a variable in its parent scope, which is then checked in the top-level CMakeLists.txt to conditionally set the flags for all targets.


# Treat compiler warnings as errors
add_compile_options("-Werror" "-Wall")

Expand Down Expand Up @@ -80,11 +72,18 @@ endif()
add_subdirectory(svf)
add_subdirectory(svf-llvm)

include(GNUInstallDirs)
install(
TARGETS SvfCore SvfLLVM
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(
DIRECTORY ${PROJECT_SOURCE_DIR}/svf/include/
${PROJECT_SOURCE_DIR}/svf-llvm/include/
COMPONENT devel
DESTINATION include/svf
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/include/svf
FILES_MATCHING
PATTERN "**/*.h")

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we also move the following to svf-llvm/CMakeList.txt?

Compile extapi.c to extapi.bc

find_path(LLVM_CLANG_DIR
NAMES clang llvm
HINTS ${LLVM_DIR} ENV LLVM_DIR
PATH_SUFFIXES bin)
add_custom_target(extapi_ir ALL
COMMAND ${LLVM_CLANG_DIR}/clang -w -S -c -Xclang -disable-O0-optnone -fno-discard-value-names -emit-llvm ${PROJECT_SOURCE_DIR}/svf-llvm/lib/extapi.c -o ${PROJECT_BINARY_DIR}/svf-llvm/extapi.bc
DEPENDS ${PROJECT_SOURCE_DIR}/svf-llvm/lib/extapi.c
)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also moved the installation commands to the subdirectory so the SvfLLVM target isn't referenced at all in the top-level CMakeLists.txt anymore.

While doing that I also fixed the remaining installation predicates:

  1. <svf_root>/svf/include (i.e. its contents) is installed to <install_prefix>/include/svf/
  2. <svf_root>/svf-llvm/include (i.e. the SVF-LLVM directory therein) is installed to <install_prefix>/include/svf/
  3. <svf_root/[Debug|Release]-Build/include/Util/config.h is installed to <install_prefix>/include/svf/Util/config.h
  4. <svf_root/[Debug|Release]-Build/svf/libSvfCore.[a|so] is installed to <install_prefix>/lib/libSvfCore.[a|so]
  5. <svf_root/[Debug|Release]-Build/svf-llvm/libSvfLLVM.[a|so] is installed to <install_prefix>/lib/libSvfLLVM[a|so]
  6. <svf_root>/[Debug|Release]-Build/svf-llvm/extapi.bc is installed to <install_prefix>/include/svf/SVF-LLVM/extapi.bc (I thought this was the best place as placing it by itself in <install_prefix>/lib/extapi.bc so that it's placed alongside libSVF.[a|so] seemed inconvenient)
  7. Tools from <svf_root>/svf-llvm/tools/... (built to <svf_root>/[Debug|Release]-Build/bin/...) are installed to <install_prefix>/bin/...

This should be unnecessary for the way SVF is currently designed to be used (i.e. through the build.sh and setup.sh scripts), but it allows users who want to install SVF to a specific location to not have to manually link/include the different directories/library files so explicitly.

Expand Down
5 changes: 4 additions & 1 deletion build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,10 @@ if [[ ! -d "$Z3_DIR" ]]; then
export Z3_DIR="$SVFHOME/$Z3Home"
fi

export PATH=$LLVM_DIR/bin:$PATH
# Add LLVM & Z3 to $PATH and $LD_LIBRARY_PATH (prepend so that selected instances will be used first)
export PATH=$LLVM_DIR/bin:$Z3_DIR/bin:$PATH
export LD_LIBRARY_PATH=$LLVM_DIR/lib:$Z3_BIN/lib:$LD_LIBRARY_PATH

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no need to export since the end of build.sh will call setup.sh to establish the environmental variables.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright, I'll remove those references.

echo "LLVM_DIR=$LLVM_DIR"
echo "Z3_DIR=$Z3_DIR"

Expand Down
12 changes: 9 additions & 3 deletions setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@ fi

Build="${PTAOBJTY}-build"

export PATH=$LLVM_DIR/bin:$PATH
PTABIN=$SVF_DIR/$Build/bin
export PATH=$PTABIN:$PATH
# Add LLVM & Z3 to $PATH and $LD_LIBRARY_PATH (prepend so that selected instances will be used first)
export PATH=$LLVM_DIR/bin:$Z3_DIR/bin:$PATH
export LD_LIBRARY_PATH=$LLVM_DIR/lib:$Z3_BIN/lib:$LD_LIBRARY_PATH

# Add compiled SVF binaries dir to $PATH
export PATH=$SVF_DIR/$Build/bin:$PATH

# Add compiled library directories to $LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$SVF_DIR/$Build/svf:$SVF_DIR/$Build/svf-llvm:$LD_LIBRARY_PATH
109 changes: 66 additions & 43 deletions svf-llvm/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,60 +1,83 @@
# To support both in- and out-of-source builds, we check for the presence of the
# add_llvm_loadable_module command. - if this command is not present, we are
# building out-of-source
if(NOT COMMAND add_llvm_library)
find_package(LLVM REQUIRED CONFIG HINTS "${LLVM_DIR}")
set(LLVM_DIR ${LLVM_BINARY_DIR} PARENT_SCOPE)

message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")

if(NOT LLVM_ENABLE_RTTI)
add_compile_options("-fno-rtti")
message(STATUS "Disable RTTI")
endif()
# SVF-LLVM contains LLVM Libs
file(GLOB SVFLLVM_SOURCES lib/*.cpp)

if(NOT LLVM_ENABLE_EH)
add_compile_options("-fno-exceptions")
message(STATUS "Disable exceptions")
endif()
find_package(LLVM REQUIRED CONFIG HINTS ${LLVM_DIR} $ENV{LLVM_DIR})
message(STATUS "LLVM STATUS:
Version ${LLVM_VERSION}
Definitions ${LLVM_DEFINITIONS}
Includes ${LLVM_INCLUDE_DIRS}
Libraries ${LLVM_LIBRARY_DIRS}
Targets ${LLVM_TARGETS_TO_BUILD}
Build type ${LLVM_BUILD_TYPE}
Exceptions ${LLVM_ENABLE_EH}
RTTI ${LLVM_ENABLE_RTTI}
Dynamic lib ${LLVM_LINK_LLVM_DYLIB}"
)

list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
include(AddLLVM)
if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT ${LLVM_BUILD_TYPE} STREQUAL "Debug")
message(NOTICE "Building SVF in debug-mode but LLVM was not built in debug-mode; "
"debug information could be incomplete when using SVF from LLVM")
endif()

include_directories(SYSTEM ${LLVM_INCLUDE_DIRS})
link_directories(${LLVM_LIBRARY_DIRS})
add_definitions(${LLVM_DEFINITIONS})

add_definitions(${LLVM_DEFINITIONS})
# include_directories(SYSTEM ${LLVM_INCLUDE_DIRS})
if(NOT LLVM_ENABLE_EH)
message(STATUS "Building SVF-llvm without exception handling")
add_compile_options("-fno-exceptions")
endif()

if(LLVM_LINK_LLVM_DYLIB)
set(llvm_libs LLVM)
if(NOT LLVM_ENABLE_RTTI)
message(STATUS "Building SVF-llvm without RTII")
add_compile_options("-fno-rtti")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RTTI is misspelled in the message.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed. Thanks. :)

endif()

if(LLVM_LINK_LLVM_DYLIB)
message(STATUS "Linking to LLVM dynamic shared library object")
set(llvm_libs LLVM)

# Set which components to include in the dynamic library to include the new SvfLLVM
if (LLVM_DYLIB_COMPONENTS)
message(STATUS "Appending SvfLLVM to LLVM dynamic library components")
list(APPEND LLVM_DYLIB_COMPONENTS SvfLLVM)
else()
llvm_map_components_to_libnames(
llvm_libs
analysis
bitwriter
core
instcombine
instrumentation
ipo
irreader
linker
scalaropts
support
target
transformutils)
message(STATUS "Adding all;SvfLLVM to LLVM dynamic library components (was unset)")
set(LLVM_DYLIB_COMPONENTS all;SvfLLVM)
endif()
else()
set(IN_SOURCE_BUILD 1)
message(STATUS "Linking to separate LLVM static libraries")
llvm_map_components_to_libnames(
llvm_libs
analysis
bitwriter
core
instcombine
instrumentation
ipo
irreader
linker
scalaropts
support
target
transformutils)
endif()

# SVF-LLVM contains LLVM Libs
file(GLOB SVFLLVM_SOURCES lib/*.cpp)
# Make the "add_llvm_library()" command available and configure LLVM/CMake
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
include(AddLLVM)

add_llvm_library(SvfLLVM ${SVFLLVM_SOURCES})
target_include_directories(SvfLLVM SYSTEM PUBLIC ${LLVM_INCLUDE_DIRS})
target_include_directories(SvfLLVM PUBLIC include)
target_link_libraries(SvfLLVM PUBLIC ${llvm_libs} ${Z3_LIBRARIES} SvfCore)

if(DEFINED IN_SOURCE_BUILD)
# Build SVF with C++ standard C++17
set_property(TARGET SvfLLVM PROPERTY CXX_STANDARD 17)
set_property(TARGET SvfLLVM PROPERTY CXX_EXTENSIONS ON)
set_property(TARGET SvfLLVM PROPERTY CXX_STANDARD_REQUIRED ON)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any better reason to set the C++ standard for SVFcore and SVF-LLVM separately? I think the original way is less repetitive.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think CMake generally recommends applying options/properties to specific targets rather than using global options (e.g. the documentation for link_libraries() states: "The target_link_libraries() command should be preferred whenever possible".

However, I think the set_property() command -- by default -- applies the properties to the current directory and any subdirectories included later. I applied the option to each target separately to avoid clobbering the build configuration of any projects that might include SVF through add_subdirectory(), but I think this is indeed unnecessary. I'll move this back to the top-level CMakeLists.txt.

# Add intrinsics_gen target if we're building as part of LLVM source build
if(TARGET intrinsics_gen)
add_dependencies(SvfLLVM intrinsics_gen)
endif()

Expand Down
12 changes: 2 additions & 10 deletions svf-llvm/tools/CFL/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,2 @@
if(DEFINED IN_SOURCE_BUILD)
add_llvm_tool(cfl cfl.cpp)
else()
add_executable(cfl cfl.cpp)

target_link_libraries(cfl SvfLLVM ${llvm_libs})

set_target_properties(cfl PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/bin)
endif()
add_llvm_executable(cfl cfl.cpp)
target_link_libraries(cfl PUBLIC ${llvm_libs} SvfLLVM)
23 changes: 7 additions & 16 deletions svf-llvm/tools/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,23 +1,14 @@
if(DEFINED IN_SOURCE_BUILD)
set(LLVM_LINK_COMPONENTS
BitWriter
Core
IPO
IrReader
InstCombine
Instrumentation
Target
Linker
Analysis
ScalarOpts
Support
SvfLLVM)
endif()

add_subdirectory(SABER)
add_subdirectory(WPA)
add_subdirectory(Example)
add_subdirectory(DDA)
add_subdirectory(MTA)
add_subdirectory(CFL)
add_subdirectory(LLVM2SVF)

# Build SvfLLVM tools with C++ standard C++17
set_target_properties(cfl dvf svf-ex llvm2svf mta saber wpa
PROPERTIES CXX_STANDARD 17
CXX_EXTENSIONS ON
CXX_STANDARD_REQUIRED ON
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
12 changes: 2 additions & 10 deletions svf-llvm/tools/DDA/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,2 @@
if(DEFINED IN_SOURCE_BUILD)
add_llvm_tool(dvf dda.cpp)
else()
add_executable(dvf dda.cpp)

target_link_libraries(dvf SvfLLVM ${llvm_libs})

set_target_properties(dvf PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/bin)
endif()
add_llvm_executable(dvf dda.cpp)
target_link_libraries(dvf PUBLIC ${llvm_libs} SvfLLVM)
12 changes: 2 additions & 10 deletions svf-llvm/tools/Example/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,2 @@
if(DEFINED IN_SOURCE_BUILD)
add_llvm_tool(svf-ex svf-ex.cpp)
else()
add_executable(svf-ex svf-ex.cpp)

target_link_libraries(svf-ex SvfLLVM ${llvm_libs})

set_target_properties(svf-ex PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/bin)
endif()
add_llvm_executable(svf-ex svf-ex.cpp)
target_link_libraries(svf-ex PUBLIC ${llvm_libs} SvfLLVM)
12 changes: 2 additions & 10 deletions svf-llvm/tools/LLVM2SVF/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,2 @@
if(DEFINED IN_SOURCE_BUILD)
add_llvm_tool(llvm2svf llvm2svf.cpp)
else()
add_executable(llvm2svf llvm2svf.cpp)

target_link_libraries(llvm2svf SvfLLVM ${llvm_libs})

set_target_properties(llvm2svf PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/bin)
endif()
add_llvm_executable(llvm2svf llvm2svf.cpp)
target_link_libraries(llvm2svf PUBLIC ${llvm_libs} SvfLLVM)
14 changes: 2 additions & 12 deletions svf-llvm/tools/MTA/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,2 @@
if(DEFINED IN_SOURCE_BUILD)
add_llvm_tool(mta mta.cpp LockResultValidator.cpp MTAResultValidator.cpp
MTAAnnotator.cpp)
else()
add_executable(mta mta.cpp LockResultValidator.cpp MTAResultValidator.cpp
MTAAnnotator.cpp)

target_link_libraries(mta SvfLLVM ${llvm_libs})

set_target_properties(mta PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/bin)
endif()
add_llvm_executable(mta mta.cpp LockResultValidator.cpp MTAResultValidator.cpp MTAAnnotator.cpp)
target_link_libraries(mta PUBLIC ${llvm_libs} SvfLLVM)
12 changes: 2 additions & 10 deletions svf-llvm/tools/SABER/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,2 @@
if(DEFINED IN_SOURCE_BUILD)
add_llvm_tool(saber saber.cpp)
else()
add_executable(saber saber.cpp)

target_link_libraries(saber SvfLLVM ${llvm_libs})

set_target_properties(saber PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/bin)
endif()
add_llvm_executable(saber saber.cpp)
target_link_libraries(saber PUBLIC ${llvm_libs} SvfLLVM)
12 changes: 2 additions & 10 deletions svf-llvm/tools/WPA/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

if(DEFINED IN_SOURCE_BUILD)
add_llvm_tool(wpa wpa.cpp)
else()
add_executable(wpa wpa.cpp)

target_link_libraries(wpa SvfLLVM ${llvm_libs} Threads::Threads)

set_target_properties(wpa PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/bin)
endif()
add_llvm_executable(wpa wpa.cpp)
target_link_libraries(wpa PUBLIC ${llvm_libs} SvfLLVM Threads::Threads)
10 changes: 8 additions & 2 deletions svf/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Due to a mutual dependencies, all the sub projects of the SVG are merged here
# Otherwise it is impossible to load the dependencies in opt.
# NOTE: if the SVF should be linked into opt, we should probably use the
# Otherwise it is impossible to load the dependencies in opt.
# NOTE: if the SVF should be linked into opt, we should probably use the
# individual sub projects here, rather than the combined project.

file(
Expand All @@ -20,4 +20,10 @@ file(
lib/WPA/*.cpp)

add_library(SvfCore ${SVF_CORE_SOURCES})

# Build SVF with C++ standard C++17
set_property(TARGET SvfCore PROPERTY CXX_STANDARD 17)
set_property(TARGET SvfCore PROPERTY CXX_EXTENSIONS ON)
set_property(TARGET SvfCore PROPERTY CXX_STANDARD_REQUIRED ON)

target_link_libraries(SvfCore PUBLIC ${Z3_LIBRARIES})
Loading