32 #include "llvm/IR/Module.h"
33 #include "llvm/Support/Errc.h"
34 #include "llvm/Support/Host.h"
36 using namespace clang;
49 if (!Jobs.
size() || !isa<driver::Command>(*Jobs.
begin()))
50 return llvm::createStringError(llvm::errc::not_supported,
51 "Driver initialization failed. "
52 "Unable to create a driver job");
56 if (llvm::StringRef(
Cmd->getCreator().getName()) !=
"clang")
57 return llvm::createStringError(llvm::errc::not_supported,
58 "Driver initialization failed");
60 return &
Cmd->getArguments();
64 CreateCI(
const llvm::opt::ArgStringList &Argv) {
70 auto PCHOps = Clang->getPCHContainerOperations();
71 PCHOps->registerWriter(std::make_unique<ObjectFilePCHContainerWriter>());
72 PCHOps->registerReader(std::make_unique<ObjectFilePCHContainerReader>());
80 Clang->getInvocation(), llvm::makeArrayRef(Argv.begin(), Argv.size()),
84 if (Clang->getHeaderSearchOpts().UseBuiltinIncludes &&
85 Clang->getHeaderSearchOpts().ResourceDir.empty())
86 Clang->getHeaderSearchOpts().ResourceDir =
90 Clang->createDiagnostics();
91 if (!Clang->hasDiagnostics())
92 return llvm::createStringError(llvm::errc::not_supported,
93 "Initialization failed. "
94 "Unable to create diagnostics engine");
98 return llvm::createStringError(llvm::errc::not_supported,
99 "Initialization failed. "
100 "Unable to flush diagnostics");
103 llvm::MemoryBuffer *MB = llvm::MemoryBuffer::getMemBuffer(
"").release();
104 Clang->getPreprocessorOpts().addRemappedFile(
"<<< inputs >>>", MB);
107 Clang->getDiagnostics(), Clang->getInvocation().TargetOpts));
108 if (!Clang->hasTarget())
109 return llvm::createStringError(llvm::errc::not_supported,
110 "Initialization failed. "
111 "Target is missing");
113 Clang->getTarget().adjust(Clang->getDiagnostics(), Clang->getLangOpts());
117 Clang->getCodeGenOpts().ClearASTBeforeBackend =
false;
119 return std::move(Clang);
130 llvm::sys::fs::getMainExecutable(
nullptr,
nullptr);
132 ClangArgv.insert(ClangArgv.begin(), MainExecutableName.c_str());
138 ClangArgv.insert(ClangArgv.begin() + 1,
"-c");
140 if (!llvm::is_contained(ClangArgv,
" -x")) {
142 ClangArgv.push_back(
"-x");
143 ClangArgv.push_back(
"c++");
148 ClangArgv.push_back(
"<<< inputs >>>");
159 llvm::sys::getProcessTriple(), Diags);
162 std::unique_ptr<driver::Compilation> Compilation(Driver.
BuildCompilation(RF));
164 if (Compilation->getArgs().hasArg(driver::options::OPT_v))
165 Compilation->getJobs().Print(llvm::errs(),
"\n",
false);
167 auto ErrOrCC1Args = GetCC1Arguments(&Diags, Compilation.get());
168 if (
auto Err = ErrOrCC1Args.takeError())
169 return std::move(Err);
171 return CreateCI(**ErrOrCC1Args);
174 Interpreter::Interpreter(std::unique_ptr<CompilerInstance> CI,
176 llvm::ErrorAsOutParameter EAO(&Err);
177 auto LLVMCtx = std::make_unique<llvm::LLVMContext>();
178 TSCtx = std::make_unique<llvm::orc::ThreadSafeContext>(std::move(LLVMCtx));
179 IncrParser = std::make_unique<IncrementalParser>(std::move(CI),
180 *TSCtx->getContext(), Err);
187 llvm::Error Err = llvm::Error::success();
189 std::unique_ptr<Interpreter>(
new Interpreter(std::move(CI), Err));
191 return std::move(Err);
192 return std::move(Interp);
196 return IncrParser->getCI();
201 return IncrExecutor->getExecutionEngine();
207 return IncrParser->Parse(Code);
213 const llvm::Triple &Triple =
215 llvm::Error Err = llvm::Error::success();
216 IncrExecutor = std::make_unique<IncrementalExecutor>(*TSCtx, Err, Triple);
222 if (
auto Err = IncrExecutor->addModule(std::move(T.
TheModule)))
225 if (
auto Err = IncrExecutor->runCtors())
228 return llvm::Error::success();
234 return llvm::make_error<llvm::StringError>(
"Operation failed. "
235 "No execution engine",
237 llvm::StringRef MangledName = IncrParser->GetMangledName(GD);
244 return llvm::make_error<llvm::StringError>(
"Operation failed. "
245 "No execution engine",
254 return llvm::make_error<llvm::StringError>(
"Operation failed. "
255 "No execution engine",