diff options
Diffstat (limited to 'include/llvm/ExecutionEngine/Orc/CompileUtils.h')
-rw-r--r-- | include/llvm/ExecutionEngine/Orc/CompileUtils.h | 95 |
1 files changed, 29 insertions, 66 deletions
diff --git a/include/llvm/ExecutionEngine/Orc/CompileUtils.h b/include/llvm/ExecutionEngine/Orc/CompileUtils.h index f34f88311ba5..eb6d84e8cbb4 100644 --- a/include/llvm/ExecutionEngine/Orc/CompileUtils.h +++ b/include/llvm/ExecutionEngine/Orc/CompileUtils.h @@ -1,9 +1,8 @@ //===- CompileUtils.h - Utilities for compiling IR in the JIT ---*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // @@ -14,28 +13,21 @@ #ifndef LLVM_EXECUTIONENGINE_ORC_COMPILEUTILS_H #define LLVM_EXECUTIONENGINE_ORC_COMPILEUTILS_H -#include "llvm/ADT/SmallVector.h" -#include "llvm/ExecutionEngine/ObjectCache.h" #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h" -#include "llvm/IR/LegacyPassManager.h" -#include "llvm/Object/Binary.h" -#include "llvm/Object/ObjectFile.h" -#include "llvm/Support/Error.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/SmallVectorMemoryBuffer.h" -#include "llvm/Support/raw_ostream.h" -#include "llvm/Target/TargetMachine.h" -#include <algorithm> #include <memory> namespace llvm { class MCContext; +class MemoryBuffer; class Module; +class ObjectCache; +class TargetMachine; namespace orc { +class JITTargetMachineBuilder; + /// Simple compile functor: Takes a single IR module and returns an ObjectFile. /// This compiler supports a single compilation thread and LLVMContext only. /// For multithreaded compilation, use ConcurrentIRCompiler below. @@ -51,56 +43,32 @@ public: void setObjectCache(ObjectCache *NewCache) { ObjCache = NewCache; } /// Compile a Module to an ObjectFile. - CompileResult operator()(Module &M) { - CompileResult CachedObject = tryToLoadFromObjectCache(M); - if (CachedObject) - return CachedObject; - - SmallVector<char, 0> ObjBufferSV; - - { - raw_svector_ostream ObjStream(ObjBufferSV); - - legacy::PassManager PM; - MCContext *Ctx; - if (TM.addPassesToEmitMC(PM, Ctx, ObjStream)) - llvm_unreachable("Target does not support MC emission."); - PM.run(M); - } - - auto ObjBuffer = - llvm::make_unique<SmallVectorMemoryBuffer>(std::move(ObjBufferSV)); - auto Obj = - object::ObjectFile::createObjectFile(ObjBuffer->getMemBufferRef()); - - if (Obj) { - notifyObjectCompiled(M, *ObjBuffer); - return std::move(ObjBuffer); - } - - // TODO: Actually report errors helpfully. - consumeError(Obj.takeError()); - return nullptr; - } + CompileResult operator()(Module &M); private: - - CompileResult tryToLoadFromObjectCache(const Module &M) { - if (!ObjCache) - return CompileResult(); - - return ObjCache->getObject(&M); - } - - void notifyObjectCompiled(const Module &M, const MemoryBuffer &ObjBuffer) { - if (ObjCache) - ObjCache->notifyObjectCompiled(&M, ObjBuffer.getMemBufferRef()); - } + CompileResult tryToLoadFromObjectCache(const Module &M); + void notifyObjectCompiled(const Module &M, const MemoryBuffer &ObjBuffer); TargetMachine &TM; ObjectCache *ObjCache = nullptr; }; +/// A SimpleCompiler that owns its TargetMachine. +/// +/// This convenient for clients who don't want to own their TargetMachines, +/// e.g. LLJIT. +class TMOwningSimpleCompiler : public SimpleCompiler { +public: + TMOwningSimpleCompiler(std::unique_ptr<TargetMachine> TM, + ObjectCache *ObjCache = nullptr) + : SimpleCompiler(*TM, ObjCache), TM(std::move(TM)) {} + +private: + // FIXME: shared because std::functions (and consequently + // IRCompileLayer::CompileFunction) are not moveable. + std::shared_ptr<llvm::TargetMachine> TM; +}; + /// A thread-safe version of SimpleCompiler. /// /// This class creates a new TargetMachine and SimpleCompiler instance for each @@ -108,16 +76,11 @@ private: class ConcurrentIRCompiler { public: ConcurrentIRCompiler(JITTargetMachineBuilder JTMB, - ObjectCache *ObjCache = nullptr) - : JTMB(std::move(JTMB)), ObjCache(ObjCache) {} + ObjectCache *ObjCache = nullptr); void setObjectCache(ObjectCache *ObjCache) { this->ObjCache = ObjCache; } - std::unique_ptr<MemoryBuffer> operator()(Module &M) { - auto TM = cantFail(JTMB.createTargetMachine()); - SimpleCompiler C(*TM, ObjCache); - return C(M); - } + std::unique_ptr<MemoryBuffer> operator()(Module &M); private: JITTargetMachineBuilder JTMB; |