Эх сурвалжийг харах

clang-interpreter: use LLVM interpreter if JIT is unavailable

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
Alp Toker 11 жил өмнө
parent
commit
73e75f0db8

+ 2 - 0
examples/clang-interpreter/CMakeLists.txt

@@ -2,7 +2,9 @@ set(LLVM_LINK_COMPONENTS
   Core
   Core
   ExecutionEngine
   ExecutionEngine
   Interpreter
   Interpreter
+  JIT
   Support
   Support
+  native
   )
   )
 
 
 add_clang_executable(clang-interpreter
 add_clang_executable(clang-interpreter

+ 1 - 2
examples/clang-interpreter/README.txt

@@ -10,8 +10,7 @@ It demonstrates the following features:
  3. Invoking the Clang compiler to lex, parse, syntax check, and then generate
  3. Invoking the Clang compiler to lex, parse, syntax check, and then generate
     LLVM code.
     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
 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
 C interpreter. It is designed to demonstrate a simple but functional use of the

+ 3 - 3
examples/clang-interpreter/main.cpp

@@ -18,6 +18,7 @@
 #include "clang/Frontend/TextDiagnosticPrinter.h"
 #include "clang/Frontend/TextDiagnosticPrinter.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ExecutionEngine/ExecutionEngine.h"
 #include "llvm/ExecutionEngine/ExecutionEngine.h"
+#include "llvm/ExecutionEngine/JIT.h"
 #include "llvm/IR/Module.h"
 #include "llvm/IR/Module.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Host.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) {
 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::string Error;
   std::unique_ptr<llvm::ExecutionEngine> EE(
   std::unique_ptr<llvm::ExecutionEngine> EE(
-      llvm::ExecutionEngine::create(Mod, /*ForceInterpreter*/ true, &Error));
+      llvm::ExecutionEngine::create(Mod, /*ForceInterpreter*/ false, &Error));
   if (!EE) {
   if (!EE) {
     llvm::errs() << "unable to make execution engine: " << Error << "\n";
     llvm::errs() << "unable to make execution engine: " << Error << "\n";
     return 255;
     return 255;