| 1 | set(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 | |
| 14 | add_clang_executable(clang-interpreter |
| 15 | main.cpp |
| 16 | ) |
| 17 | |
| 18 | add_dependencies(clang-interpreter |
| 19 | clang-resource-headers |
| 20 | ) |
| 21 | |
| 22 | target_link_libraries(clang-interpreter |
| 23 | PRIVATE |
| 24 | clangBasic |
| 25 | clangCodeGen |
| 26 | clangDriver |
| 27 | clangFrontend |
| 28 | clangSerialization |
| 29 | ) |
| 30 | |
| 31 | export_executable_symbols(clang-interpreter) |
| 32 | |
| 33 | if (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@") |
| 38 | endif() |
| 39 | |
| 40 | function(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() |
| 91 | endfunction(clang_enable_exceptions) |
| 92 | |
| 93 | clang_enable_exceptions(clang-interpreter) |
| 94 | |