55cmake_minimum_required (VERSION 3.4.3)
66project (smack)
77
8- if (NOT WIN32 OR MSYS OR CYGWIN )
8+ if (NOT WIN32 OR MSYS OR CYGWIN )
99
10- file (STRINGS "bin/versions" LLVM_VERSION_STR REGEX "LLVM_SHORT_VERSION=\" [0-9]+\" " )
10+ file (STRINGS "bin/versions" LLVM_VERSION_STR
11+ REGEX "LLVM_FULL_VERSION=\" [0-9]+\. [0-9]+\. [0-9]+" )
12+ string (REGEX MATCH "[0-9]+\. [0-9]+" LLVM_EXTENDED_VERSION "${LLVM_VERSION_STR} " )
13+
14+ file (STRINGS "bin/versions" LLVM_VERSION_STR
15+ REGEX "LLVM_SHORT_VERSION=\" [0-9]+" )
1116 string (REGEX MATCH "[0-9]+" LLVM_SHORT_VERSION "${LLVM_VERSION_STR} " )
1217
13- find_program (LLVM_CONFIG_EXECUTABLE NAMES llvm-config-${LLVM_SHORT_VERSION} llvm-config PATHS ${LLVM_CONFIG} DOC "llvm-config" )
18+ find_program (LLVM_CONFIG_EXECUTABLE NAMES llvm-config-${LLVM_SHORT_VERSION}
19+ llvm-config PATHS ${LLVM_CONFIG} DOC "llvm-config" )
1420
15- if (LLVM_CONFIG_EXECUTABLE STREQUAL "LLVM_CONFIG_EXECUTABLE-NOTFOUND" )
21+ if (LLVM_CONFIG_EXECUTABLE STREQUAL "LLVM_CONFIG_EXECUTABLE-NOTFOUND" )
1622 message (FATAL_ERROR "llvm-config could not be found!" )
1723 endif ()
1824
@@ -22,36 +28,12 @@ if (NOT WIN32 OR MSYS OR CYGWIN)
2228 OUTPUT_STRIP_TRAILING_WHITESPACE
2329 )
2430
25- # TODO: explain why these are required.
26- string (REPLACE "-DNDEBUG" "" LLVM_CXXFLAGS "${LLVM_CXXFLAGS} " )
27- string (REPLACE "-Wno-maybe-uninitialized" "" LLVM_CXXFLAGS "${LLVM_CXXFLAGS} " )
28- string (REPLACE "-fuse-ld=gold" "" LLVM_CXXFLAGS "${LLVM_CXXFLAGS} " )
29- string (REPLACE "--no-keep-files-mapped" "" LLVM_CXXFLAGS "${LLVM_CXXFLAGS} " )
30- string (REPLACE "--no-map-whole-files" "" LLVM_CXXFLAGS "${LLVM_CXXFLAGS} " )
31- string (REPLACE "-Wl," "" LLVM_CXXFLAGS "${LLVM_CXXFLAGS} " )
32- string (REPLACE "-gsplit-dwarf" "" LLVM_CXXFLAGS "${LLVM_CXXFLAGS} " )
33- string (REGEX REPLACE "-O[0-9]" "" CMAKE_CXX_FLAGS "${LLVM_CXXFLAGS} " )
34-
35- # TODO: append these one at a time; give rationale.
36- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti -Wno-undefined-var-template" )
37-
38- # Apparently avoids a problem with inconsistent visibility settings from LLVM:
39- #
40- # > ld: warning: direct access in function 'llvm::_'
41- # > from file '/usr/local/opt/llvm@8/lib/_'
42- # > to global weak symbol 'llvm::_'
43- # > from file 'libsmackTranslator.a(_.cpp.o)'
44- # > means the weak symbol cannot be overridden at runtime.
45- # > This was likely caused by different translation units being compiled
46- # > with different visibility settings.
47- #
48- # Solution found on Stack Overflow:
49- # https://stackoverflow.com/questions/8685045/xcode-with-boost-linkerid-warning-about-visibility-settings
50- string (APPEND CMAKE_CXX_FLAGS_DEBUG " -fvisibility=hidden" )
51-
52- # TODO: explain why these are required.
53- string (APPEND CMAKE_CXX_FLAGS_DEBUG " -O0" )
54- string (APPEND CMAKE_C_FLAGS_DEBUG " -O0" )
31+ # SMACK doesn't catch or throw exceptions, so -fno-exceptions is justified.
32+ # SMACK doesn't use C++ runtime type identification features, so -fno-rtti
33+ # is justified.
34+ # Shaobo: enable O3 so SMACK can save some time.
35+ set (CMAKE_CXX_FLAGS
36+ "${LLVM_CXXFLAGS} -fno-exceptions -fno-rtti -O3" )
5537
5638 execute_process (
5739 COMMAND ${LLVM_CONFIG_EXECUTABLE} --libs
@@ -76,12 +58,12 @@ else()
7658 set (LLVM_BUILD "" CACHE PATH "LLVM build directory" )
7759 set (LLVM_BUILD_TYPE "" CACHE STRING "LLVM build type" )
7860
79- if (NOT EXISTS "${LLVM_SRC} /include/llvm" )
61+ if (NOT EXISTS "${LLVM_SRC} /include/llvm" )
8062 message (FATAL_ERROR "Invalid LLVM source directory: ${LLVM_SRC} " )
8163 endif ()
8264
8365 set (LLVM_LIBDIR "${LLVM_BUILD} /lib/${LLVM_BUILD_TYPE} " )
84- if (NOT EXISTS "${LLVM_LIBDIR} " )
66+ if (NOT EXISTS "${LLVM_LIBDIR} " )
8567 message (FATAL_ERROR "Invalid LLVM build directory: ${LLVM_BUILD} " )
8668 endif ()
8769
@@ -92,7 +74,11 @@ else()
9274 set (CMAKE_CXX_FLAGS "\" /I${LLVM_SRC} /include\" \" /I${LLVM_BUILD} /include\" -D_SCL_SECURE_NO_WARNINGS -wd4146 -wd4244 -wd4355 -wd4482 -wd4800" )
9375
9476 set (LLVM_LDFLAGS "" )
95- set (LLVM_LIBS "${LLVM_LIBDIR} /LLVMTransformUtils.lib" "${LLVM_LIBDIR} /LLVMipa.lib" "${LLVM_LIBDIR} /LLVMAnalysis.lib" "${LLVM_LIBDIR} /LLVMTarget.lib" "${LLVM_LIBDIR} /LLVMMC.lib" "${LLVM_LIBDIR} /LLVMObject.lib" "${LLVM_LIBDIR} /LLVMBitReader.lib" "${LLVM_LIBDIR} /LLVMCore.lib" "${LLVM_LIBDIR} /LLVMSupport.lib" )
77+ set (LLVM_LIBS "${LLVM_LIBDIR} /LLVMTransformUtils.lib"
78+ "${LLVM_LIBDIR} /LLVMipa.lib" "${LLVM_LIBDIR} /LLVMAnalysis.lib"
79+ "${LLVM_LIBDIR} /LLVMTarget.lib" "${LLVM_LIBDIR} /LLVMMC.lib"
80+ "${LLVM_LIBDIR} /LLVMObject.lib" "${LLVM_LIBDIR} /LLVMBitReader.lib"
81+ "${LLVM_LIBDIR} /LLVMCore.lib" "${LLVM_LIBDIR} /LLVMSupport.lib" )
9682
9783endif ()
9884
@@ -170,13 +156,17 @@ add_executable(llvm2bpl
170156)
171157
172158# We need to include Boost header files at least for macOS
173- find_package (Boost 1.55)
174- if (Boost_FOUND)
175- include_directories (${Boost_INCLUDE_DIRS} )
176- endif ()
159+ find_package (Boost 1.55)
160+ if (Boost_FOUND)
161+ include_directories (${Boost_INCLUDE_DIRS} )
162+ endif ()
177163# We have to import LLVM's cmake definitions to build sea-dsa
178164# Borrowed from sea-dsa's CMakeLists.txt
179- find_package (LLVM ${LLVM_SHORT_VERSION} CONFIG)
165+ # Borrowed from https://github.com/banach-space/llvm-tutor/commit/72cb20d058b9b3f51717c7a17607f7a4c7398642
166+ find_package (LLVM ${LLVM_EXTENDED_VERSION} REQUIRED CONFIG)
167+ if (NOT ${LLVM_SHORT_VERSION} VERSION_EQUAL "${LLVM_VERSION_MAJOR} " )
168+ message (FATAL_ERROR "Found LLVM ${LLVM_VERSION_MAJOR} , but need ${LLVM_SHORT_VERSION} " )
169+ endif ()
180170list (APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR} " )
181171include (AddLLVM)
182172include (HandleLLVMOptions)
@@ -188,14 +178,15 @@ set(CMAKE_BUILD_TYPE "Release")
188178add_subdirectory (sea-dsa/lib/seadsa)
189179set (CMAKE_BUILD_TYPE ${SMACK_BUILD_TYPE} )
190180
191- target_link_libraries (smackTranslator ${LLVM_LIBS} ${LLVM_SYSTEM_LIBS} ${LLVM_LDFLAGS} )
181+ target_link_libraries (smackTranslator ${LLVM_LIBS} ${LLVM_SYSTEM_LIBS}
182+ ${LLVM_LDFLAGS} )
192183target_link_libraries (llvm2bpl smackTranslator utils SeaDsaAnalysis)
193184
194- INSTALL (TARGETS llvm2bpl
185+ install (TARGETS llvm2bpl
195186 RUNTIME DESTINATION bin
196187)
197188
198- INSTALL (FILES
189+ install (FILES
199190 ${CMAKE_CURRENT_SOURCE_DIR} /bin/smack
200191 ${CMAKE_CURRENT_SOURCE_DIR} /bin/smack-doctor
201192 ${CMAKE_CURRENT_SOURCE_DIR} /bin/smack-svcomp-wrapper.sh
@@ -204,30 +195,31 @@ INSTALL(FILES
204195 DESTINATION bin
205196)
206197
207- INSTALL (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} /share/smack
198+ install (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} /share/smack
208199 DESTINATION share
209200 USE_SOURCE_PERMISSIONS
210- FILES_MATCHING PATTERN "*.py" PATTERN "*.h" PATTERN "*.c" PATTERN "Makefile" PATTERN "*.rs" PATTERN "*.f90" PATTERN "*.di" PATTERN "*.toml"
201+ FILES_MATCHING PATTERN "*.py" PATTERN "*.h" PATTERN "*.c" PATTERN "Makefile"
202+ PATTERN "*.rs" PATTERN "*.f90" PATTERN "*.di" PATTERN "*.toml"
211203)
212204
213- INSTALL (FILES
205+ install (FILES
214206 ${CMAKE_CURRENT_SOURCE_DIR} /bin/versions
215207 DESTINATION share/smack
216208 RENAME versions.py
217209)
218210
219- INSTALL (FILES
211+ install (FILES
220212 ${CMAKE_CURRENT_SOURCE_DIR} /share/smack/lib/smack/Cargo.toml
221213 ${CMAKE_CURRENT_SOURCE_DIR} /share/smack/lib/smack/build .rs
222214 DESTINATION share/smack/lib
223215)
224216
225- INSTALL (FILES
217+ install (FILES
226218 ${CMAKE_CURRENT_SOURCE_DIR} /share/smack/lib/smack-rust.c
227219 DESTINATION share/smack/lib/src
228220)
229221
230- INSTALL (FILES
222+ install (FILES
231223 ${CMAKE_CURRENT_SOURCE_DIR} /share/smack/lib/smack.rs
232224 DESTINATION share/smack/lib/src
233225 RENAME lib.rs
0 commit comments