Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/CompileUtils.cpp
35266 views
//===------ CompileUtils.cpp - Utilities for compiling IR in the JIT ------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/ExecutionEngine/Orc/CompileUtils.h"910#include "llvm/ADT/SmallVector.h"11#include "llvm/ExecutionEngine/ObjectCache.h"12#include "llvm/IR/LegacyPassManager.h"13#include "llvm/IR/Module.h"14#include "llvm/MC/MCContext.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"2122#include <algorithm>2324namespace llvm {25namespace orc {2627IRSymbolMapper::ManglingOptions28irManglingOptionsFromTargetOptions(const TargetOptions &Opts) {29IRSymbolMapper::ManglingOptions MO;3031MO.EmulatedTLS = Opts.EmulatedTLS;3233return MO;34}3536/// Compile a Module to an ObjectFile.37Expected<SimpleCompiler::CompileResult> SimpleCompiler::operator()(Module &M) {38CompileResult CachedObject = tryToLoadFromObjectCache(M);39if (CachedObject)40return std::move(CachedObject);4142SmallVector<char, 0> ObjBufferSV;4344{45raw_svector_ostream ObjStream(ObjBufferSV);4647legacy::PassManager PM;48MCContext *Ctx;49if (TM.addPassesToEmitMC(PM, Ctx, ObjStream))50return make_error<StringError>("Target does not support MC emission",51inconvertibleErrorCode());52PM.run(M);53}5455auto ObjBuffer = std::make_unique<SmallVectorMemoryBuffer>(56std::move(ObjBufferSV), M.getModuleIdentifier() + "-jitted-objectbuffer",57/*RequiresNullTerminator=*/false);5859auto Obj = object::ObjectFile::createObjectFile(ObjBuffer->getMemBufferRef());6061if (!Obj)62return Obj.takeError();6364notifyObjectCompiled(M, *ObjBuffer);65return std::move(ObjBuffer);66}6768SimpleCompiler::CompileResult69SimpleCompiler::tryToLoadFromObjectCache(const Module &M) {70if (!ObjCache)71return CompileResult();7273return ObjCache->getObject(&M);74}7576void SimpleCompiler::notifyObjectCompiled(const Module &M,77const MemoryBuffer &ObjBuffer) {78if (ObjCache)79ObjCache->notifyObjectCompiled(&M, ObjBuffer.getMemBufferRef());80}8182ConcurrentIRCompiler::ConcurrentIRCompiler(JITTargetMachineBuilder JTMB,83ObjectCache *ObjCache)84: IRCompiler(irManglingOptionsFromTargetOptions(JTMB.getOptions())),85JTMB(std::move(JTMB)), ObjCache(ObjCache) {}8687Expected<std::unique_ptr<MemoryBuffer>>88ConcurrentIRCompiler::operator()(Module &M) {89auto TM = cantFail(JTMB.createTargetMachine());90SimpleCompiler C(*TM, ObjCache);91return C(M);92}9394} // end namespace orc95} // end namespace llvm969798