1 //===------ CompileUtils.cpp - Utilities for compiling IR in the JIT ------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
11 #include "llvm/ADT/SmallVector.h"
12 #include "llvm/ExecutionEngine/ObjectCache.h"
13 #include "llvm/IR/LegacyPassManager.h"
14 #include "llvm/IR/Module.h"
15 #include "llvm/Object/ObjectFile.h"
16 #include "llvm/Support/Error.h"
17 #include "llvm/Support/ErrorHandling.h"
18 #include "llvm/Support/MemoryBuffer.h"
19 #include "llvm/Support/SmallVectorMemoryBuffer.h"
20 #include "llvm/Target/TargetMachine.h"
27 /// Compile a Module to an ObjectFile.
28 SimpleCompiler::CompileResult
SimpleCompiler::operator()(Module
&M
) {
29 CompileResult CachedObject
= tryToLoadFromObjectCache(M
);
33 SmallVector
<char, 0> ObjBufferSV
;
36 raw_svector_ostream
ObjStream(ObjBufferSV
);
38 legacy::PassManager PM
;
40 if (TM
.addPassesToEmitMC(PM
, Ctx
, ObjStream
))
41 llvm_unreachable("Target does not support MC emission.");
45 auto ObjBuffer
= std::make_unique
<SmallVectorMemoryBuffer
>(
46 std::move(ObjBufferSV
),
47 "<in memory object compiled from " + M
.getModuleIdentifier() + ">");
49 auto Obj
= object::ObjectFile::createObjectFile(ObjBuffer
->getMemBufferRef());
52 notifyObjectCompiled(M
, *ObjBuffer
);
53 return std::move(ObjBuffer
);
56 // TODO: Actually report errors helpfully.
57 consumeError(Obj
.takeError());
61 SimpleCompiler::CompileResult
62 SimpleCompiler::tryToLoadFromObjectCache(const Module
&M
) {
64 return CompileResult();
66 return ObjCache
->getObject(&M
);
69 void SimpleCompiler::notifyObjectCompiled(const Module
&M
,
70 const MemoryBuffer
&ObjBuffer
) {
72 ObjCache
->notifyObjectCompiled(&M
, ObjBuffer
.getMemBufferRef());
75 ConcurrentIRCompiler::ConcurrentIRCompiler(JITTargetMachineBuilder JTMB
,
76 ObjectCache
*ObjCache
)
77 : JTMB(std::move(JTMB
)), ObjCache(ObjCache
) {}
79 std::unique_ptr
<MemoryBuffer
> ConcurrentIRCompiler::operator()(Module
&M
) {
80 auto TM
= cantFail(JTMB
.createTargetMachine());
81 SimpleCompiler
C(*TM
, ObjCache
);
85 } // end namespace orc
86 } // end namespace llvm