]> granicus.if.org Git - clang/commitdiff
clang-interpreter: interpret instead of JITing
authorAlp Toker <alp@nuanti.com>
Tue, 1 Jul 2014 02:41:55 +0000 (02:41 +0000)
committerAlp Toker <alp@nuanti.com>
Tue, 1 Jul 2014 02:41:55 +0000 (02:41 +0000)
Fixes the build when no targets are selected, or no native target is built.

This also better matches up with the description/title of the example and
demonstrates how clang can be used to run C++ on constrained environments
without file IO or executable memory permissions (e.g. iOS apps).

A comment is added explaining how to extend the demo with JIT support as
needed.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@212083 91177308-0d34-0410-b5e6-96231b3b80d8

examples/clang-interpreter/CMakeLists.txt
examples/clang-interpreter/README.txt
examples/clang-interpreter/main.cpp

index 10df7e7e06076f6d6d4828079189dfbd985338a3..6d78408f855652af2fbaf87ff14db5d3d6ff71e9 100644 (file)
@@ -1,9 +1,8 @@
 set(LLVM_LINK_COMPONENTS
   Core
   ExecutionEngine
-  JIT
+  Interpreter
   Support
-  nativecodegen
   )
 
 add_clang_executable(clang-interpreter
index 7dd45fad50483302c38f0f8f0673220147408741..b81d3813a1d354860f609539a7796cec1c322876 100644 (file)
@@ -10,7 +10,8 @@ It demonstrates the following features:
  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.
+ 4. Use the LLVM interpreter functionality to execute the final module, with
+    guidance on how to extend the demo with JIT execution.
 
 The implementation has many limitations and is not designed to be a full fledged
 C interpreter. It is designed to demonstrate a simple but functional use of the
index 0f083c151434b0ce9da04e2ee462873e44da8a00..c255f51cee89287869b3b7a314b3bb10cd752c42 100644 (file)
@@ -18,7 +18,6 @@
 #include "clang/Frontend/TextDiagnosticPrinter.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ExecutionEngine/ExecutionEngine.h"
-#include "llvm/ExecutionEngine/JIT.h"
 #include "llvm/IR/Module.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Host.h"
@@ -43,11 +42,12 @@ std::string GetExecutablePath(const char *Argv0) {
 }
 
 static int Execute(llvm::Module *Mod, char * const *envp) {
-  llvm::InitializeNativeTarget();
+  // To JIT instead of interpreting, call llvm::InitializeNativeTarget() here
+  // and pass ForceInterpreter=false to ExecutionEngine::create().
 
   std::string Error;
   std::unique_ptr<llvm::ExecutionEngine> EE(
-      llvm::ExecutionEngine::createJIT(Mod, &Error));
+      llvm::ExecutionEngine::create(Mod, /*ForceInterpreter*/ true, &Error));
   if (!EE) {
     llvm::errs() << "unable to make execution engine: " << Error << "\n";
     return 255;