set(LLVM_LINK_COMPONENTS Core ExecutionEngine MC MCJIT Object OrcJit Option RuntimeDyld Support native ) add_clang_executable(clang-interpreter main.cpp ) add_dependencies(clang-interpreter clang-resource-headers ) target_link_libraries(clang-interpreter PRIVATE clangBasic clangCodeGen clangDriver clangFrontend clangSerialization ) export_executable_symbols(clang-interpreter) if (MSVC) # Is this a CMake bug that even with export_executable_symbols, Windows # needs to explictly export the type_info vtable set_property(TARGET clang-interpreter APPEND_STRING PROPERTY LINK_FLAGS " /EXPORT:??_7type_info@@6B@") endif() function(clang_enable_exceptions TARGET) # Really have to jump through hoops to enable exception handling independent # of how LLVM is being built. if (NOT LLVM_REQUIRES_EH AND NOT LLVM_REQUIRES_RTTI) if (MSVC) # /EHs to allow throwing from extern "C" set(excptnExceptions_ON "/D _HAS_EXCEPTIONS=1 /EHs /wd4714") set(excptnExceptions_OFF "/D _HAS_EXCEPTIONS=0 /EHs-c-") set(excptnRTTI_ON "/GR") set(excptnRTTI_OFF "/GR-") set(excptnEHRTTIRegEx "(/EHs(-c-?)|_HAS_EXCEPTIONS=(0|1))") else() set(excptnExceptions_ON "-fexceptions") set(excptnExceptions_OFF "-fno-exceptions") set(excptnRTTI_ON "-frtti") set(excptnRTTI_OFF "-fno-rtti") set(excptnEHRTTIRegEx "-f(exceptions|no-exceptions)") endif() if (LLVM_REQUIRES_EH) set(excptnExceptions_DFLT ${excptnExceptions_ON}) else() set(excptnExceptions_DFLT ${excptnExceptions_OFF}) endif() if (LLVM_REQUIRES_RTTI) set(excptnRTTI_DFLT ${excptnRTTI_ON}) else() set(excptnRTTI_DFLT ${excptnRTTI_OFF}) endif() # Strip the exception & rtti flags from the target get_property(addedFlags TARGET ${TARGET} PROPERTY COMPILE_FLAGS) string(REGEX REPLACE ${excptnEHRTTIRegEx} "" editedFlags "${addedFlags}") string(REPLACE ${excptnRTTI_OFF} "" editedFlags "${editedFlags}") set_property(TARGET ${TARGET} PROPERTY COMPILE_FLAGS "${editedFlags}") get_property(addedFlags TARGET ${TARGET} PROPERTY COMPILE_DEFINITIONS) string(REGEX REPLACE ${excptnEHRTTIRegEx} "" editedFlags "${addedFlags}") string(REPLACE ${excptnRTTI_OFF} "" editedFlags "${editedFlags}") set_property(TARGET ${TARGET} PROPERTY COMPILE_DEFINITIONS "${editedFlags}") # Re-add the exception & rtti flags from LLVM set_property(SOURCE main.cpp APPEND_STRING PROPERTY COMPILE_FLAGS " ${excptnExceptions_DFLT} ${excptnRTTI_DFLT} ") set_property(SOURCE Manager.cpp APPEND_STRING PROPERTY COMPILE_FLAGS " ${excptnExceptions_DFLT} ${excptnRTTI_DFLT} ") # Invoke with exceptions & rtti set_property(SOURCE Invoke.cpp APPEND_STRING PROPERTY COMPILE_FLAGS " ${excptnExceptions_ON} ${excptnRTTI_ON} ") endif() endfunction(clang_enable_exceptions) clang_enable_exceptions(clang-interpreter)