1set(LLVM_LINK_COMPONENTS 2 Core 3 ExecutionEngine 4 MC 5 MCJIT 6 Object 7 OrcJit 8 Option 9 RuntimeDyld 10 Support 11 native 12 ) 13 14add_clang_executable(clang-interpreter 15 main.cpp 16 ) 17 18add_dependencies(clang-interpreter 19 clang-resource-headers 20 ) 21 22clang_target_link_libraries(clang-interpreter 23 PRIVATE 24 clangBasic 25 clangCodeGen 26 clangDriver 27 clangFrontend 28 clangSerialization 29 ) 30 31export_executable_symbols(clang-interpreter) 32 33if (MSVC) 34 # Is this a CMake bug that even with export_executable_symbols, Windows 35 # needs to explictly export the type_info vtable 36 set_property(TARGET clang-interpreter 37 APPEND_STRING PROPERTY LINK_FLAGS " /EXPORT:??_7type_info@@6B@") 38endif() 39 40function(clang_enable_exceptions TARGET) 41 # Really have to jump through hoops to enable exception handling independent 42 # of how LLVM is being built. 43 if (NOT LLVM_REQUIRES_EH AND NOT LLVM_REQUIRES_RTTI) 44 if (MSVC) 45 # /EHs to allow throwing from extern "C" 46 set(excptnExceptions_ON "/D _HAS_EXCEPTIONS=1 /EHs /wd4714") 47 set(excptnExceptions_OFF "/D _HAS_EXCEPTIONS=0 /EHs-c-") 48 set(excptnRTTI_ON "/GR") 49 set(excptnRTTI_OFF "/GR-") 50 set(excptnEHRTTIRegEx "(/EHs(-c-?)|_HAS_EXCEPTIONS=(0|1))") 51 else() 52 set(excptnExceptions_ON "-fexceptions") 53 set(excptnExceptions_OFF "-fno-exceptions") 54 set(excptnRTTI_ON "-frtti") 55 set(excptnRTTI_OFF "-fno-rtti") 56 set(excptnEHRTTIRegEx "-f(exceptions|no-exceptions)") 57 endif() 58 if (LLVM_REQUIRES_EH) 59 set(excptnExceptions_DFLT ${excptnExceptions_ON}) 60 else() 61 set(excptnExceptions_DFLT ${excptnExceptions_OFF}) 62 endif() 63 if (LLVM_REQUIRES_RTTI) 64 set(excptnRTTI_DFLT ${excptnRTTI_ON}) 65 else() 66 set(excptnRTTI_DFLT ${excptnRTTI_OFF}) 67 endif() 68 69 # Strip the exception & rtti flags from the target 70 get_property(addedFlags TARGET ${TARGET} PROPERTY COMPILE_FLAGS) 71 string(REGEX REPLACE ${excptnEHRTTIRegEx} "" editedFlags "${addedFlags}") 72 string(REPLACE ${excptnRTTI_OFF} "" editedFlags "${editedFlags}") 73 set_property(TARGET ${TARGET} PROPERTY COMPILE_FLAGS "${editedFlags}") 74 75 get_property(addedFlags TARGET ${TARGET} PROPERTY COMPILE_DEFINITIONS) 76 string(REGEX REPLACE ${excptnEHRTTIRegEx} "" editedFlags "${addedFlags}") 77 string(REPLACE ${excptnRTTI_OFF} "" editedFlags "${editedFlags}") 78 set_property(TARGET ${TARGET} PROPERTY COMPILE_DEFINITIONS "${editedFlags}") 79 80 # Re-add the exception & rtti flags from LLVM 81 set_property(SOURCE main.cpp APPEND_STRING PROPERTY COMPILE_FLAGS 82 " ${excptnExceptions_DFLT} ${excptnRTTI_DFLT} ") 83 set_property(SOURCE Manager.cpp APPEND_STRING PROPERTY COMPILE_FLAGS 84 " ${excptnExceptions_DFLT} ${excptnRTTI_DFLT} ") 85 86 # Invoke with exceptions & rtti 87 set_property(SOURCE Invoke.cpp APPEND_STRING PROPERTY COMPILE_FLAGS 88 " ${excptnExceptions_ON} ${excptnRTTI_ON} ") 89 90 endif() 91endfunction(clang_enable_exceptions) 92 93clang_enable_exceptions(clang-interpreter) 94