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 8b8ccfd..9b4a257 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. |