]> granicus.if.org Git - clang/commitdiff
clang-interpreter: use LLVM interpreter if JIT is unavailable
authorAlp Toker <alp@nuanti.com>
Tue, 1 Jul 2014 03:19:50 +0000 (03:19 +0000)
committerAlp Toker <alp@nuanti.com>
Tue, 1 Jul 2014 03:19:50 +0000 (03:19 +0000)
Update the strategy in r212083 to try JIT first and otherwise fall back to the
interpreter. This gives the best of both worlds and still builds fine with no
targets enabled.

Requires supporting changes from LLVM r212086.

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

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

index 6d78408f855652af2fbaf87ff14db5d3d6ff71e9..d454539fdac40c9978e1635220c035dc9df3549c 100644 (file)
@@ -2,7 +2,9 @@ set(LLVM_LINK_COMPONENTS
   Core
   ExecutionEngine
   Interpreter
+  JIT
   Support
+  native
   )
 
 add_clang_executable(clang-interpreter
index b81d3813a1d354860f609539a7796cec1c322876..7dd45fad50483302c38f0f8f0673220147408741 100644 (file)
@@ -10,8 +10,7 @@ It demonstrates the following features:
  3. Invoking the Clang compiler to lex, parse, syntax check, and then generate
     LLVM code.
 
- 4. Use the LLVM interpreter functionality to execute the final module, with
-    guidance on how to extend the demo with JIT execution.
+ 4. Use the LLVM JIT functionality to execute the final module.
 
 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 c255f51cee89287869b3b7a314b3bb10cd752c42..fb9d298f0ac9eb7ef5b871909c88f5adb124acd0 100644 (file)
@@ -18,6 +18,7 @@
 #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"
@@ -42,12 +43,11 @@ std::string GetExecutablePath(const char *Argv0) {
 }
 
 static int Execute(llvm::Module *Mod, char * const *envp) {
-  // To JIT instead of interpreting, call llvm::InitializeNativeTarget() here
-  // and pass ForceInterpreter=false to ExecutionEngine::create().
+  llvm::InitializeNativeTarget();
 
   std::string Error;
   std::unique_ptr<llvm::ExecutionEngine> EE(
-      llvm::ExecutionEngine::create(Mod, /*ForceInterpreter*/ true, &Error));
+      llvm::ExecutionEngine::create(Mod, /*ForceInterpreter*/ false, &Error));
   if (!EE) {
     llvm::errs() << "unable to make execution engine: " << Error << "\n";
     return 255;