blob: f47634f853a220e3a1df84278b35c01b0591a844 [file] [log] [blame]
Lang Hames1cf99872018-05-21 21:11:13 +00001//===-------------------- Layer.cpp - Layer interfaces --------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/ExecutionEngine/Orc/Layer.h"
Lang Hames1cf99872018-05-21 21:11:13 +000011#include "llvm/Object/ObjectFile.h"
Lang Hames1cf99872018-05-21 21:11:13 +000012
13namespace llvm {
14namespace orc {
15
Lang Hames1cf99872018-05-21 21:11:13 +000016IRLayer::IRLayer(ExecutionSession &ES) : ES(ES) {}
17IRLayer::~IRLayer() {}
18
Lang Hames8d76c712018-09-26 01:24:12 +000019Error IRLayer::add(JITDylib &JD, VModuleKey K, ThreadSafeModule TSM) {
Lang Hamesd5f56c52018-08-17 21:18:18 +000020 return JD.define(llvm::make_unique<BasicIRLayerMaterializationUnit>(
Lang Hames8d76c712018-09-26 01:24:12 +000021 *this, std::move(K), std::move(TSM)));
Lang Hames1cf99872018-05-21 21:11:13 +000022}
23
Lang Hames5261aa92018-05-22 16:15:38 +000024IRMaterializationUnit::IRMaterializationUnit(ExecutionSession &ES,
Lang Hames8d76c712018-09-26 01:24:12 +000025 ThreadSafeModule TSM)
26 : MaterializationUnit(SymbolFlagsMap()), TSM(std::move(TSM)) {
Lang Hames1cf99872018-05-21 21:11:13 +000027
Lang Hames8d76c712018-09-26 01:24:12 +000028 assert(this->TSM && "Module must not be null");
29
30 MangleAndInterner Mangle(ES, this->TSM.getModule()->getDataLayout());
31 for (auto &G : this->TSM.getModule()->global_values()) {
Lang Hames6a941342018-06-26 21:35:48 +000032 if (G.hasName() && !G.isDeclaration() && !G.hasLocalLinkage() &&
33 !G.hasAvailableExternallyLinkage() && !G.hasAppendingLinkage()) {
Lang Hames1cf99872018-05-21 21:11:13 +000034 auto MangledName = Mangle(G.getName());
35 SymbolFlags[MangledName] = JITSymbolFlags::fromGlobalValue(G);
Lang Hamesd3a76f52018-05-31 19:29:01 +000036 SymbolToDefinition[MangledName] = &G;
Lang Hames1cf99872018-05-21 21:11:13 +000037 }
38 }
39}
40
Lang Hamesd6155ff2018-06-03 19:22:48 +000041IRMaterializationUnit::IRMaterializationUnit(
Lang Hames8d76c712018-09-26 01:24:12 +000042 ThreadSafeModule TSM, SymbolFlagsMap SymbolFlags,
Lang Hamesd6155ff2018-06-03 19:22:48 +000043 SymbolNameToDefinitionMap SymbolToDefinition)
Lang Hames8d76c712018-09-26 01:24:12 +000044 : MaterializationUnit(std::move(SymbolFlags)), TSM(std::move(TSM)),
Lang Hamesd6155ff2018-06-03 19:22:48 +000045 SymbolToDefinition(std::move(SymbolToDefinition)) {}
46
Lang Hamesd5f56c52018-08-17 21:18:18 +000047void IRMaterializationUnit::discard(const JITDylib &JD, SymbolStringPtr Name) {
Lang Hamesd3a76f52018-05-31 19:29:01 +000048 auto I = SymbolToDefinition.find(Name);
49 assert(I != SymbolToDefinition.end() &&
Lang Hames1cf99872018-05-21 21:11:13 +000050 "Symbol not provided by this MU, or previously discarded");
Lang Hamesd3a76f52018-05-31 19:29:01 +000051 assert(!I->second->isDeclaration() &&
52 "Discard should only apply to definitions");
Lang Hames1cf99872018-05-21 21:11:13 +000053 I->second->setLinkage(GlobalValue::AvailableExternallyLinkage);
Lang Hamesd3a76f52018-05-31 19:29:01 +000054 SymbolToDefinition.erase(I);
Lang Hames1cf99872018-05-21 21:11:13 +000055}
56
Lang Hames5261aa92018-05-22 16:15:38 +000057BasicIRLayerMaterializationUnit::BasicIRLayerMaterializationUnit(
Lang Hames8d76c712018-09-26 01:24:12 +000058 IRLayer &L, VModuleKey K, ThreadSafeModule TSM)
59 : IRMaterializationUnit(L.getExecutionSession(), std::move(TSM)), L(L),
60 K(std::move(K)) {}
Lang Hames5261aa92018-05-22 16:15:38 +000061
62void BasicIRLayerMaterializationUnit::materialize(
63 MaterializationResponsibility R) {
Lang Hames8d76c712018-09-26 01:24:12 +000064
65 if (L.getCloneToNewContextOnEmit())
66 TSM = cloneToNewContext(TSM);
67
68 auto Lock = TSM.getContextLock();
69 L.emit(std::move(R), std::move(K), std::move(TSM));
Lang Hames5261aa92018-05-22 16:15:38 +000070}
71
Lang Hames1cf99872018-05-21 21:11:13 +000072ObjectLayer::ObjectLayer(ExecutionSession &ES) : ES(ES) {}
73
74ObjectLayer::~ObjectLayer() {}
75
Lang Hamesd5f56c52018-08-17 21:18:18 +000076Error ObjectLayer::add(JITDylib &JD, VModuleKey K,
77 std::unique_ptr<MemoryBuffer> O) {
Lang Hamesbfea8cd2018-08-01 22:42:23 +000078 auto ObjMU = BasicObjectLayerMaterializationUnit::Create(*this, std::move(K),
79 std::move(O));
80 if (!ObjMU)
81 return ObjMU.takeError();
Lang Hamesd5f56c52018-08-17 21:18:18 +000082 return JD.define(std::move(*ObjMU));
Lang Hames1cf99872018-05-21 21:11:13 +000083}
84
Lang Hamesbfea8cd2018-08-01 22:42:23 +000085Expected<std::unique_ptr<BasicObjectLayerMaterializationUnit>>
86BasicObjectLayerMaterializationUnit::Create(ObjectLayer &L, VModuleKey K,
87 std::unique_ptr<MemoryBuffer> O) {
Lang Hamesc0514f02018-08-05 22:35:37 +000088 auto SymbolFlags =
89 getObjectSymbolFlags(L.getExecutionSession(), O->getMemBufferRef());
Lang Hames1cf99872018-05-21 21:11:13 +000090
Lang Hamesc0514f02018-08-05 22:35:37 +000091 if (!SymbolFlags)
92 return SymbolFlags.takeError();
Lang Hamesbfea8cd2018-08-01 22:42:23 +000093
94 return std::unique_ptr<BasicObjectLayerMaterializationUnit>(
Lang Hamesc0514f02018-08-05 22:35:37 +000095 new BasicObjectLayerMaterializationUnit(L, K, std::move(O),
96 std::move(*SymbolFlags)));
Lang Hames1cf99872018-05-21 21:11:13 +000097}
98
Lang Hamesbfea8cd2018-08-01 22:42:23 +000099BasicObjectLayerMaterializationUnit::BasicObjectLayerMaterializationUnit(
Lang Hamesc0514f02018-08-05 22:35:37 +0000100 ObjectLayer &L, VModuleKey K, std::unique_ptr<MemoryBuffer> O,
101 SymbolFlagsMap SymbolFlags)
Lang Hamesbfea8cd2018-08-01 22:42:23 +0000102 : MaterializationUnit(std::move(SymbolFlags)), L(L), K(std::move(K)),
103 O(std::move(O)) {}
104
Lang Hames1cf99872018-05-21 21:11:13 +0000105void BasicObjectLayerMaterializationUnit::materialize(
106 MaterializationResponsibility R) {
107 L.emit(std::move(R), std::move(K), std::move(O));
108}
109
Lang Hamesd5f56c52018-08-17 21:18:18 +0000110void BasicObjectLayerMaterializationUnit::discard(const JITDylib &JD,
Lang Hames1cf99872018-05-21 21:11:13 +0000111 SymbolStringPtr Name) {
112 // FIXME: Support object file level discard. This could be done by building a
113 // filter to pass to the object layer along with the object itself.
114}
115
Lang Hamesc0514f02018-08-05 22:35:37 +0000116Expected<SymbolFlagsMap> getObjectSymbolFlags(ExecutionSession &ES,
117 MemoryBufferRef ObjBuffer) {
118 auto Obj = object::ObjectFile::createObjectFile(ObjBuffer);
119
120 if (!Obj)
121 return Obj.takeError();
122
123 SymbolFlagsMap SymbolFlags;
124 for (auto &Sym : (*Obj)->symbols()) {
Lang Hames60511582018-08-26 16:46:02 +0000125 // Skip symbols not defined in this object file.
126 if (Sym.getFlags() & object::BasicSymbolRef::SF_Undefined)
127 continue;
128
129 // Skip symbols that are not global.
130 if (!(Sym.getFlags() & object::BasicSymbolRef::SF_Global))
131 continue;
132
133 auto Name = Sym.getName();
134 if (!Name)
135 return Name.takeError();
136 auto InternedName = ES.getSymbolStringPool().intern(*Name);
137 auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym);
138 if (!SymFlags)
139 return SymFlags.takeError();
140 SymbolFlags[InternedName] = std::move(*SymFlags);
Lang Hamesc0514f02018-08-05 22:35:37 +0000141 }
142
143 return SymbolFlags;
144}
145
Lang Hames1cf99872018-05-21 21:11:13 +0000146} // End namespace orc.
147} // End namespace llvm.