diff options
Diffstat (limited to 'examples/clang-interpreter/main.cpp')
| -rw-r--r-- | examples/clang-interpreter/main.cpp | 40 | 
1 files changed, 29 insertions, 11 deletions
| diff --git a/examples/clang-interpreter/main.cpp b/examples/clang-interpreter/main.cpp index 8b8ccfdf70a0..9b4a257bcba3 100644 --- a/examples/clang-interpreter/main.cpp +++ b/examples/clang-interpreter/main.cpp @@ -18,7 +18,7 @@  #include "clang/Frontend/TextDiagnosticPrinter.h"  #include "llvm/ADT/SmallString.h"  #include "llvm/ExecutionEngine/ExecutionEngine.h" -#include "llvm/ExecutionEngine/JIT.h" +#include "llvm/ExecutionEngine/MCJIT.h"  #include "llvm/IR/Module.h"  #include "llvm/Support/FileSystem.h"  #include "llvm/Support/Host.h" @@ -42,18 +42,28 @@ std::string GetExecutablePath(const char *Argv0) {    return llvm::sys::fs::getMainExecutable(Argv0, MainAddr);  } -static int Execute(llvm::Module *Mod, char * const *envp) { +static llvm::ExecutionEngine * +createExecutionEngine(std::unique_ptr<llvm::Module> M, std::string *ErrorStr) { +  return llvm::EngineBuilder(std::move(M)) +      .setEngineKind(llvm::EngineKind::Either) +      .setErrorStr(ErrorStr) +      .create(); +} + +static int Execute(std::unique_ptr<llvm::Module> Mod, char *const *envp) {    llvm::InitializeNativeTarget(); +  llvm::InitializeNativeTargetAsmPrinter(); +  llvm::Module &M = *Mod;    std::string Error;    std::unique_ptr<llvm::ExecutionEngine> EE( -      llvm::ExecutionEngine::create(Mod, /*ForceInterpreter*/ false, &Error)); +      createExecutionEngine(std::move(Mod), &Error));    if (!EE) {      llvm::errs() << "unable to make execution engine: " << Error << "\n";      return 255;    } -  llvm::Function *EntryFn = Mod->getFunction("main"); +  llvm::Function *EntryFn = M.getFunction("main");    if (!EntryFn) {      llvm::errs() << "'main' function not found in module.\n";      return 255; @@ -61,8 +71,9 @@ static int Execute(llvm::Module *Mod, char * const *envp) {    // FIXME: Support passing arguments.    std::vector<std::string> Args; -  Args.push_back(Mod->getModuleIdentifier()); +  Args.push_back(M.getModuleIdentifier()); +  EE->finalizeObject();    return EE->runFunctionAsMain(EntryFn, Args, envp);  } @@ -75,7 +86,14 @@ int main(int argc, const char **argv, char * const *envp) {    IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());    DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagClient); -  Driver TheDriver(Path, llvm::sys::getProcessTriple(), Diags); + +  // Use ELF on windows for now. +  std::string TripleStr = llvm::sys::getProcessTriple(); +  llvm::Triple T(TripleStr); +  if (T.isOSBinFormatCOFF()) +    T.setObjectFormat(llvm::Triple::ELF); + +  Driver TheDriver(Path, T.str(), Diags);    TheDriver.setTitle("clang interpreter");    TheDriver.setCheckInputsExist(false); @@ -101,14 +119,14 @@ int main(int argc, const char **argv, char * const *envp) {      return 1;    } -  const driver::Command *Cmd = cast<driver::Command>(*Jobs.begin()); -  if (llvm::StringRef(Cmd->getCreator().getName()) != "clang") { +  const driver::Command &Cmd = cast<driver::Command>(*Jobs.begin()); +  if (llvm::StringRef(Cmd.getCreator().getName()) != "clang") {      Diags.Report(diag::err_fe_expected_clang_command);      return 1;    }    // Initialize a compiler invocation object from the clang (-cc1) arguments. -  const driver::ArgStringList &CCArgs = Cmd->getArguments(); +  const driver::ArgStringList &CCArgs = Cmd.getArguments();    std::unique_ptr<CompilerInvocation> CI(new CompilerInvocation);    CompilerInvocation::CreateFromArgs(*CI,                                       const_cast<const char **>(CCArgs.data()), @@ -146,8 +164,8 @@ int main(int argc, const char **argv, char * const *envp) {      return 1;    int Res = 255; -  if (llvm::Module *Module = Act->takeModule()) -    Res = Execute(Module, envp); +  if (std::unique_ptr<llvm::Module> Module = Act->takeModule()) +    Res = Execute(std::move(Module), envp);    // Shutdown. | 
