//===- IRCompileLayer.h -- Eagerly compile IR for JIT -----------*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// // // Contains the definition for a basic, eagerly compiling layer of the JIT. // //===----------------------------------------------------------------------===// #ifndef LLVM_EXECUTIONENGINE_ORC_IRCOMPILELAYER_H #define LLVM_EXECUTIONENGINE_ORC_IRCOMPILELAYER_H #include "llvm/ADT/STLExtras.h" #include "llvm/ExecutionEngine/JITSymbol.h" #include "llvm/ExecutionEngine/Orc/Layer.h" #include "llvm/Support/Error.h" #include "llvm/Support/MemoryBuffer.h" #include #include #include namespace llvm { class Module; namespace orc { class IRCompileLayer : public IRLayer { public: class IRCompiler { public: IRCompiler(IRSymbolMapper::ManglingOptions MO) : MO(std::move(MO)) {} virtual ~IRCompiler(); const IRSymbolMapper::ManglingOptions &getManglingOptions() const { return MO; } virtual Expected> operator()(Module &M) = 0; protected: IRSymbolMapper::ManglingOptions &manglingOptions() { return MO; } private: IRSymbolMapper::ManglingOptions MO; }; using NotifyCompiledFunction = std::function; IRCompileLayer(ExecutionSession &ES, ObjectLayer &BaseLayer, std::unique_ptr Compile); IRCompiler &getCompiler() { return *Compile; } void setNotifyCompiled(NotifyCompiledFunction NotifyCompiled); void emit(std::unique_ptr R, ThreadSafeModule TSM) override; private: mutable std::mutex IRLayerMutex; ObjectLayer &BaseLayer; std::unique_ptr Compile; const IRSymbolMapper::ManglingOptions *ManglingOpts; NotifyCompiledFunction NotifyCompiled = NotifyCompiledFunction(); }; } // end namespace orc } // end namespace llvm #endif // LLVM_EXECUTIONENGINE_ORC_IRCOMPILELAYER_H