32 const std::string _version;
33 std::vector<std::string> _includePaths;
34 std::shared_ptr<llvm::LLVMContext> _context;
35 std::unique_ptr<llvm::Linker> _linker;
36 std::unique_ptr<llvm::Module> _module;
77 std::unique_ptr<LlvmModelLibrary<Base>>
create() {
81 _linker.reset(
nullptr);
83 this->modelLibraryHelper_->startingJob(
"", JobTimer::JIT_MODEL_LIBRARY);
85 llvm::InitializeAllTargetMCs();
86 llvm::InitializeAllTargets();
87 llvm::InitializeAllAsmPrinters();
89 _context.reset(
new llvm::LLVMContext());
91 const std::map<std::string, ModelCSourceGen<Base>*>&
models = this->modelLibraryHelper_->getModels();
93 const std::map<std::string, std::string>&
modelSources = this->getSources(*
p.second);
97 const std::map<std::string, std::string>&
sources = this->getLibrarySources();
100 const std::map<std::string, std::string>&
customSource = this->modelLibraryHelper_->getCustomSources();
103 llvm::InitializeNativeTarget();
107 this->modelLibraryHelper_->finishedJob();
120 using namespace llvm;
127 std::unique_ptr<LlvmModelLibrary<Base>>
lib;
129 this->modelLibraryHelper_->startingJob(
"", JobTimer::JIT_MODEL_LIBRARY);
140 llvm::InitializeAllTargets();
141 llvm::InitializeAllAsmPrinters();
143 _context.reset(
new llvm::LLVMContext());
151 if (
buffer.get() ==
nullptr) {
158 std::ostringstream
error;
161 if (nError > 0) error <<
"; ";
162 error << eib.message();
169 if (_linker.get() ==
nullptr) {
179 llvm::InitializeNativeTarget();
190 this->modelLibraryHelper_->finishedJob();
197 virtual void createLlvmModules(
const std::map<std::string, std::string>&
sources) {
199 createLlvmModule(
p.first,
p.second);
203 virtual void createLlvmModule(
const std::string&
filename,
204 const std::string&
source) {
205 using namespace llvm;
206 using namespace clang;
209 llvm::sys::findProgramByName(
"clang",
paths);
219 throw CGException(
"Failed to create compiler invocation");
223 CompilerInvocation::setLangDefaults(*
invocation->getLangOpts(), InputKind::C,
226 LangStandard::lang_unspecified);
227 invocation->getFrontendOpts().DisableFree =
false;
237 throw CGException(
"No diagnostics");
240 std::unique_ptr<llvm::MemoryBuffer>
buffer = llvm::MemoryBuffer::getMemBufferCopy(
source,
"SIMPLE_BUFFER");
242 throw CGException(
"Failed to create memory buffer");
246 po.addRemappedFile(
"string-input",
buffer.release());
249 std::string
iClangHeaders = this->findInternalClangCHeaders(_version,
hso.ResourceDir);
251 hso.AddPath(llvm::StringRef(
iClangHeaders), clang::frontend::Angled,
false,
false);
254 for (
size_t s = 0; s < _includePaths.size(); s++)
255 hso.AddPath(llvm::StringRef(_includePaths[s]), clang::frontend::Angled,
false,
false);
258 clang::EmitLLVMOnlyAction
action(_context.get());
260 throw CGException(
"Failed to emit LLVM bitcode");
262 std::unique_ptr<llvm::Module>
module = action.takeModule();
264 throw CGException(
"No module");
266 if (_linker.get() ==
nullptr) {
267 _module.reset(
module.release());
268 _linker.reset(
new llvm::Linker(*_module.get()));
270 if (_linker->linkInModule(std::move(
module))) {
271 throw CGException(
"LLVM failed to link module");