summaryrefslogtreecommitdiff
path: root/clang/examples
diff options
context:
space:
mode:
authorVassil Vassilev <v.g.vassilev@gmail.com>2021-09-01 06:49:17 +0000
committerVassil Vassilev <v.g.vassilev@gmail.com>2021-09-01 06:49:52 +0000
commit04bbd189a9b964db8713c507d500a87af3f67a79 (patch)
tree3b26c3936c07e7f4457db825ac027177e30d7095 /clang/examples
parentd396d09fc2278bfe34b9db2ee27ecfd470149da8 (diff)
downloadllvm-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.txt1
-rw-r--r--clang/examples/clang-interpreter/CMakeLists.txt93
-rw-r--r--clang/examples/clang-interpreter/README.txt20
-rw-r--r--clang/examples/clang-interpreter/Test.cxx33
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;
+}