diff options
Diffstat (limited to 'examples/clang-interpreter/CMakeLists.txt')
-rw-r--r-- | examples/clang-interpreter/CMakeLists.txt | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/examples/clang-interpreter/CMakeLists.txt b/examples/clang-interpreter/CMakeLists.txt index 3084238844802..7b9657ec1abf5 100644 --- a/examples/clang-interpreter/CMakeLists.txt +++ b/examples/clang-interpreter/CMakeLists.txt @@ -3,7 +3,10 @@ set(LLVM_LINK_COMPONENTS ExecutionEngine MC MCJIT + Object + OrcJit Option + RuntimeDyld Support native ) @@ -23,3 +26,67 @@ target_link_libraries(clang-interpreter clangDriver clangFrontend ) + +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) |