| 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 |
| ) |
| |
| clang_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) |