|
| 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 | +clang_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) |
0 commit comments