brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · c4d65af Raw
97 lines · cpp
1//===------ CompileUtils.cpp - Utilities for compiling IR in the JIT ------===//2//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ExecutionEngine/Orc/CompileUtils.h"10 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/MC/MCContext.h"16#include "llvm/Object/ObjectFile.h"17#include "llvm/Support/Error.h"18#include "llvm/Support/MemoryBuffer.h"19#include "llvm/Support/SmallVectorMemoryBuffer.h"20#include "llvm/Target/TargetMachine.h"21 22namespace llvm {23namespace orc {24 25IRSymbolMapper::ManglingOptions26irManglingOptionsFromTargetOptions(const TargetOptions &Opts) {27  IRSymbolMapper::ManglingOptions MO;28 29  MO.EmulatedTLS = Opts.EmulatedTLS;30 31  return MO;32}33 34/// Compile a Module to an ObjectFile.35Expected<SimpleCompiler::CompileResult> SimpleCompiler::operator()(Module &M) {36  if (M.getDataLayout().isDefault())37    M.setDataLayout(TM.createDataLayout());38 39  CompileResult CachedObject = tryToLoadFromObjectCache(M);40  if (CachedObject)41    return std::move(CachedObject);42 43  SmallVector<char, 0> ObjBufferSV;44 45  {46    raw_svector_ostream ObjStream(ObjBufferSV);47 48    legacy::PassManager PM;49    MCContext *Ctx;50    if (TM.addPassesToEmitMC(PM, Ctx, ObjStream))51      return make_error<StringError>("Target does not support MC emission",52                                     inconvertibleErrorCode());53    PM.run(M);54  }55 56  auto ObjBuffer = std::make_unique<SmallVectorMemoryBuffer>(57      std::move(ObjBufferSV), M.getModuleIdentifier() + "-jitted-objectbuffer",58      /*RequiresNullTerminator=*/false);59 60  auto Obj = object::ObjectFile::createObjectFile(ObjBuffer->getMemBufferRef());61 62  if (!Obj)63    return Obj.takeError();64 65  notifyObjectCompiled(M, *ObjBuffer);66  return std::move(ObjBuffer);67}68 69SimpleCompiler::CompileResult70SimpleCompiler::tryToLoadFromObjectCache(const Module &M) {71  if (!ObjCache)72    return CompileResult();73 74  return ObjCache->getObject(&M);75}76 77void SimpleCompiler::notifyObjectCompiled(const Module &M,78                                          const MemoryBuffer &ObjBuffer) {79  if (ObjCache)80    ObjCache->notifyObjectCompiled(&M, ObjBuffer.getMemBufferRef());81}82 83ConcurrentIRCompiler::ConcurrentIRCompiler(JITTargetMachineBuilder JTMB,84                                           ObjectCache *ObjCache)85    : IRCompiler(irManglingOptionsFromTargetOptions(JTMB.getOptions())),86      JTMB(std::move(JTMB)), ObjCache(ObjCache) {}87 88Expected<std::unique_ptr<MemoryBuffer>>89ConcurrentIRCompiler::operator()(Module &M) {90  auto TM = cantFail(JTMB.createTargetMachine());91  SimpleCompiler C(*TM, ObjCache);92  return C(M);93}94 95} // end namespace orc96} // end namespace llvm97