diff options
author | Vassil Vassilev <v.g.vassilev@gmail.com> | 2021-09-01 06:49:17 +0000 |
---|---|---|
committer | Vassil Vassilev <v.g.vassilev@gmail.com> | 2021-09-01 06:49:52 +0000 |
commit | 04bbd189a9b964db8713c507d500a87af3f67a79 (patch) | |
tree | 3b26c3936c07e7f4457db825ac027177e30d7095 /clang/examples | |
parent | d396d09fc2278bfe34b9db2ee27ecfd470149da8 (diff) | |
download | llvm-04bbd189a9b964db8713c507d500a87af3f67a79.tar.gz |
Revert "[clang-repl] Re-implement clang-interpreter as a test case."
This reverts commit 319ce98011742141dad8dd95a2f9de9c0449be5c because it fails
on various platforms.
Diffstat (limited to 'clang/examples')
-rw-r--r-- | clang/examples/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clang/examples/clang-interpreter/CMakeLists.txt | 93 | ||||
-rw-r--r-- | clang/examples/clang-interpreter/README.txt | 20 | ||||
-rw-r--r-- | clang/examples/clang-interpreter/Test.cxx | 33 |
4 files changed, 147 insertions, 0 deletions
diff --git a/clang/examples/CMakeLists.txt b/clang/examples/CMakeLists.txt index 8a4139f5d8c1..300d8d795c67 100644 --- a/clang/examples/CMakeLists.txt +++ b/clang/examples/CMakeLists.txt @@ -3,6 +3,7 @@ if(NOT CLANG_BUILD_EXAMPLES) set(EXCLUDE_FROM_ALL ON) endif() +add_subdirectory(clang-interpreter) add_subdirectory(PrintFunctionNames) add_subdirectory(AnnotateFunctions) add_subdirectory(Attribute) diff --git a/clang/examples/clang-interpreter/CMakeLists.txt b/clang/examples/clang-interpreter/CMakeLists.txt new file mode 100644 index 000000000000..11056aa379ae --- /dev/null +++ b/clang/examples/clang-interpreter/CMakeLists.txt @@ -0,0 +1,93 @@ +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) diff --git a/clang/examples/clang-interpreter/README.txt b/clang/examples/clang-interpreter/README.txt new file mode 100644 index 000000000000..b4f8a935cef8 --- /dev/null +++ b/clang/examples/clang-interpreter/README.txt @@ -0,0 +1,20 @@ +This is an example of Clang based interpreter, for executing standalone C/C++ +programs. + +It demonstrates the following features: + 1. Parsing standard compiler command line arguments using the Driver library. + + 2. Constructing a Clang compiler instance, using the appropriate arguments + derived in step #1. + + 3. Invoking the Clang compiler to lex, parse, syntax check, and then generate + LLVM code. + + 4. Use the LLVM JIT functionality to execute the final module. + + 5. Intercepting a Win64 library call to allow throwing and catching exceptions + in and from the JIT. + +The implementation has many limitations and is not designed to be a full fledged +interpreter. It is designed to demonstrate a simple but functional use of the +Clang compiler libraries. diff --git a/clang/examples/clang-interpreter/Test.cxx b/clang/examples/clang-interpreter/Test.cxx new file mode 100644 index 000000000000..ed7fc86f9e5f --- /dev/null +++ b/clang/examples/clang-interpreter/Test.cxx @@ -0,0 +1,33 @@ +//===-- examples/clang-interpreter/Test.cxx - Clang C Interpreter Example -===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Example throwing in and from the JIT (particularly on Win64). +// +// ./bin/clang-interpreter <src>/tools/clang/examples/clang-interpreter/Test.cxx + +#include <stdexcept> +#include <stdio.h> + +static void ThrowerAnError(const char* Name) { + throw std::runtime_error(Name); +} + +int main(int argc, const char** argv) { + for (int I = 0; I < argc; ++I) + printf("arg[%d]='%s'\n", I, argv[I]); + + try { + ThrowerAnError("In JIT"); + } catch (const std::exception& E) { + printf("Caught: '%s'\n", E.what()); + } catch (...) { + printf("Unknown exception\n"); + } + ThrowerAnError("From JIT"); + return 0; +} |