CompileUtils.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
  9. #include "llvm/ADT/SmallVector.h"
  10. #include "llvm/ExecutionEngine/ObjectCache.h"
  11. #include "llvm/IR/LegacyPassManager.h"
  12. #include "llvm/IR/Module.h"
  13. #include "llvm/Object/ObjectFile.h"
  14. #include "llvm/Support/Error.h"
  15. #include "llvm/Support/ErrorHandling.h"
  16. #include "llvm/Support/MemoryBuffer.h"
  17. #include "llvm/Support/SmallVectorMemoryBuffer.h"
  18. #include "llvm/Target/TargetMachine.h"
  19. #include <algorithm>
  20. namespace llvm {
  21. namespace orc {
  22. IRSymbolMapper::ManglingOptions
  23. irManglingOptionsFromTargetOptions(const TargetOptions &Opts) {
  24. IRSymbolMapper::ManglingOptions MO;
  25. MO.EmulatedTLS = Opts.EmulatedTLS;
  26. return MO;
  27. }
  28. /// Compile a Module to an ObjectFile.
  29. Expected<SimpleCompiler::CompileResult> SimpleCompiler::operator()(Module &M) {
  30. CompileResult CachedObject = tryToLoadFromObjectCache(M);
  31. if (CachedObject)
  32. return std::move(CachedObject);
  33. SmallVector<char, 0> ObjBufferSV;
  34. {
  35. raw_svector_ostream ObjStream(ObjBufferSV);
  36. legacy::PassManager PM;
  37. MCContext *Ctx;
  38. if (TM.addPassesToEmitMC(PM, Ctx, ObjStream))
  39. return make_error<StringError>("Target does not support MC emission",
  40. inconvertibleErrorCode());
  41. PM.run(M);
  42. }
  43. auto ObjBuffer = std::make_unique<SmallVectorMemoryBuffer>(
  44. std::move(ObjBufferSV), M.getModuleIdentifier() + "-jitted-objectbuffer",
  45. /*RequiresNullTerminator=*/false);
  46. auto Obj = object::ObjectFile::createObjectFile(ObjBuffer->getMemBufferRef());
  47. if (!Obj)
  48. return Obj.takeError();
  49. notifyObjectCompiled(M, *ObjBuffer);
  50. return std::move(ObjBuffer);
  51. }
  52. SimpleCompiler::CompileResult
  53. SimpleCompiler::tryToLoadFromObjectCache(const Module &M) {
  54. if (!ObjCache)
  55. return CompileResult();
  56. return ObjCache->getObject(&M);
  57. }
  58. void SimpleCompiler::notifyObjectCompiled(const Module &M,
  59. const MemoryBuffer &ObjBuffer) {
  60. if (ObjCache)
  61. ObjCache->notifyObjectCompiled(&M, ObjBuffer.getMemBufferRef());
  62. }
  63. ConcurrentIRCompiler::ConcurrentIRCompiler(JITTargetMachineBuilder JTMB,
  64. ObjectCache *ObjCache)
  65. : IRCompiler(irManglingOptionsFromTargetOptions(JTMB.getOptions())),
  66. JTMB(std::move(JTMB)), ObjCache(ObjCache) {}
  67. Expected<std::unique_ptr<MemoryBuffer>>
  68. ConcurrentIRCompiler::operator()(Module &M) {
  69. auto TM = cantFail(JTMB.createTargetMachine());
  70. SimpleCompiler C(*TM, ObjCache);
  71. return C(M);
  72. }
  73. } // end namespace orc
  74. } // end namespace llvm