annotate llvm/lib/ExecutionEngine/Orc/Layer.cpp @ 181:df311c476dd5

CreateIdentifierInfo in ParseCbC (not yet worked)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 31 May 2020 12:30:11 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-------------------- Layer.cpp - Layer interfaces --------------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "llvm/ExecutionEngine/Orc/Layer.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
10
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
11 #include "llvm/ExecutionEngine/Orc/DebugUtils.h"
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
12 #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
150
anatofuz
parents:
diff changeset
13 #include "llvm/IR/Constants.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
14 #include "llvm/Object/MachO.h"
150
anatofuz
parents:
diff changeset
15 #include "llvm/Object/ObjectFile.h"
anatofuz
parents:
diff changeset
16 #include "llvm/Support/Debug.h"
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 #define DEBUG_TYPE "orc"
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 namespace llvm {
anatofuz
parents:
diff changeset
21 namespace orc {
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 IRLayer::~IRLayer() {}
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 Error IRLayer::add(JITDylib &JD, ThreadSafeModule TSM, VModuleKey K) {
anatofuz
parents:
diff changeset
26 return JD.define(std::make_unique<BasicIRLayerMaterializationUnit>(
anatofuz
parents:
diff changeset
27 *this, *getManglingOptions(), std::move(TSM), std::move(K)));
anatofuz
parents:
diff changeset
28 }
anatofuz
parents:
diff changeset
29
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
30 IRMaterializationUnit::IRMaterializationUnit(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
31 ExecutionSession &ES, const IRSymbolMapper::ManglingOptions &MO,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
32 ThreadSafeModule TSM, VModuleKey K)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
33 : MaterializationUnit(SymbolFlagsMap(), nullptr, std::move(K)),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
34 TSM(std::move(TSM)) {
150
anatofuz
parents:
diff changeset
35
anatofuz
parents:
diff changeset
36 assert(this->TSM && "Module must not be null");
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 MangleAndInterner Mangle(ES, this->TSM.getModuleUnlocked()->getDataLayout());
anatofuz
parents:
diff changeset
39 this->TSM.withModuleDo([&](Module &M) {
anatofuz
parents:
diff changeset
40 for (auto &G : M.global_values()) {
anatofuz
parents:
diff changeset
41 // Skip globals that don't generate symbols.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
42
150
anatofuz
parents:
diff changeset
43 if (!G.hasName() || G.isDeclaration() || G.hasLocalLinkage() ||
anatofuz
parents:
diff changeset
44 G.hasAvailableExternallyLinkage() || G.hasAppendingLinkage())
anatofuz
parents:
diff changeset
45 continue;
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 // thread locals generate different symbols depending on whether or not
anatofuz
parents:
diff changeset
48 // emulated TLS is enabled.
anatofuz
parents:
diff changeset
49 if (G.isThreadLocal() && MO.EmulatedTLS) {
anatofuz
parents:
diff changeset
50 auto &GV = cast<GlobalVariable>(G);
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 auto Flags = JITSymbolFlags::fromGlobalValue(GV);
anatofuz
parents:
diff changeset
53
anatofuz
parents:
diff changeset
54 auto EmuTLSV = Mangle(("__emutls_v." + GV.getName()).str());
anatofuz
parents:
diff changeset
55 SymbolFlags[EmuTLSV] = Flags;
anatofuz
parents:
diff changeset
56 SymbolToDefinition[EmuTLSV] = &GV;
anatofuz
parents:
diff changeset
57
anatofuz
parents:
diff changeset
58 // If this GV has a non-zero initializer we'll need to emit an
anatofuz
parents:
diff changeset
59 // __emutls.t symbol too.
anatofuz
parents:
diff changeset
60 if (GV.hasInitializer()) {
anatofuz
parents:
diff changeset
61 const auto *InitVal = GV.getInitializer();
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 // Skip zero-initializers.
anatofuz
parents:
diff changeset
64 if (isa<ConstantAggregateZero>(InitVal))
anatofuz
parents:
diff changeset
65 continue;
anatofuz
parents:
diff changeset
66 const auto *InitIntValue = dyn_cast<ConstantInt>(InitVal);
anatofuz
parents:
diff changeset
67 if (InitIntValue && InitIntValue->isZero())
anatofuz
parents:
diff changeset
68 continue;
anatofuz
parents:
diff changeset
69
anatofuz
parents:
diff changeset
70 auto EmuTLST = Mangle(("__emutls_t." + GV.getName()).str());
anatofuz
parents:
diff changeset
71 SymbolFlags[EmuTLST] = Flags;
anatofuz
parents:
diff changeset
72 }
anatofuz
parents:
diff changeset
73 continue;
anatofuz
parents:
diff changeset
74 }
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 // Otherwise we just need a normal linker mangling.
anatofuz
parents:
diff changeset
77 auto MangledName = Mangle(G.getName());
anatofuz
parents:
diff changeset
78 SymbolFlags[MangledName] = JITSymbolFlags::fromGlobalValue(G);
anatofuz
parents:
diff changeset
79 SymbolToDefinition[MangledName] = &G;
anatofuz
parents:
diff changeset
80 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
81
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
82 // If we need an init symbol for this module then create one.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
83 if (!llvm::empty(getStaticInitGVs(M))) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
84 size_t Counter = 0;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
85
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
86 while (true) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
87 std::string InitSymbolName;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
88 raw_string_ostream(InitSymbolName)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
89 << "$." << M.getModuleIdentifier() << ".__inits." << Counter++;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
90 InitSymbol = ES.intern(InitSymbolName);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
91 if (SymbolFlags.count(InitSymbol))
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
92 continue;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
93 SymbolFlags[InitSymbol] =
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
94 JITSymbolFlags::MaterializationSideEffectsOnly;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
95 break;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
96 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
97 }
150
anatofuz
parents:
diff changeset
98 });
anatofuz
parents:
diff changeset
99 }
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 IRMaterializationUnit::IRMaterializationUnit(
anatofuz
parents:
diff changeset
102 ThreadSafeModule TSM, VModuleKey K, SymbolFlagsMap SymbolFlags,
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
103 SymbolStringPtr InitSymbol, SymbolNameToDefinitionMap SymbolToDefinition)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
104 : MaterializationUnit(std::move(SymbolFlags), std::move(InitSymbol),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
105 std::move(K)),
150
anatofuz
parents:
diff changeset
106 TSM(std::move(TSM)), SymbolToDefinition(std::move(SymbolToDefinition)) {}
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 StringRef IRMaterializationUnit::getName() const {
anatofuz
parents:
diff changeset
109 if (TSM)
anatofuz
parents:
diff changeset
110 return TSM.withModuleDo(
anatofuz
parents:
diff changeset
111 [](const Module &M) -> StringRef { return M.getModuleIdentifier(); });
anatofuz
parents:
diff changeset
112 return "<null module>";
anatofuz
parents:
diff changeset
113 }
anatofuz
parents:
diff changeset
114
anatofuz
parents:
diff changeset
115 void IRMaterializationUnit::discard(const JITDylib &JD,
anatofuz
parents:
diff changeset
116 const SymbolStringPtr &Name) {
anatofuz
parents:
diff changeset
117 LLVM_DEBUG(JD.getExecutionSession().runSessionLocked([&]() {
anatofuz
parents:
diff changeset
118 dbgs() << "In " << JD.getName() << " discarding " << *Name << " from MU@"
anatofuz
parents:
diff changeset
119 << this << " (" << getName() << ")\n";
anatofuz
parents:
diff changeset
120 }););
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 auto I = SymbolToDefinition.find(Name);
anatofuz
parents:
diff changeset
123 assert(I != SymbolToDefinition.end() &&
anatofuz
parents:
diff changeset
124 "Symbol not provided by this MU, or previously discarded");
anatofuz
parents:
diff changeset
125 assert(!I->second->isDeclaration() &&
anatofuz
parents:
diff changeset
126 "Discard should only apply to definitions");
anatofuz
parents:
diff changeset
127 I->second->setLinkage(GlobalValue::AvailableExternallyLinkage);
anatofuz
parents:
diff changeset
128 SymbolToDefinition.erase(I);
anatofuz
parents:
diff changeset
129 }
anatofuz
parents:
diff changeset
130
anatofuz
parents:
diff changeset
131 BasicIRLayerMaterializationUnit::BasicIRLayerMaterializationUnit(
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
132 IRLayer &L, const IRSymbolMapper::ManglingOptions &MO, ThreadSafeModule TSM,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
133 VModuleKey K)
150
anatofuz
parents:
diff changeset
134 : IRMaterializationUnit(L.getExecutionSession(), MO, std::move(TSM),
anatofuz
parents:
diff changeset
135 std::move(K)),
anatofuz
parents:
diff changeset
136 L(L), K(std::move(K)) {}
anatofuz
parents:
diff changeset
137
anatofuz
parents:
diff changeset
138 void BasicIRLayerMaterializationUnit::materialize(
anatofuz
parents:
diff changeset
139 MaterializationResponsibility R) {
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 // Throw away the SymbolToDefinition map: it's not usable after we hand
anatofuz
parents:
diff changeset
142 // off the module.
anatofuz
parents:
diff changeset
143 SymbolToDefinition.clear();
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 // If cloneToNewContextOnEmit is set, clone the module now.
anatofuz
parents:
diff changeset
146 if (L.getCloneToNewContextOnEmit())
anatofuz
parents:
diff changeset
147 TSM = cloneToNewContext(TSM);
anatofuz
parents:
diff changeset
148
anatofuz
parents:
diff changeset
149 #ifndef NDEBUG
anatofuz
parents:
diff changeset
150 auto &ES = R.getTargetJITDylib().getExecutionSession();
anatofuz
parents:
diff changeset
151 auto &N = R.getTargetJITDylib().getName();
anatofuz
parents:
diff changeset
152 #endif // NDEBUG
anatofuz
parents:
diff changeset
153
anatofuz
parents:
diff changeset
154 LLVM_DEBUG(ES.runSessionLocked(
anatofuz
parents:
diff changeset
155 [&]() { dbgs() << "Emitting, for " << N << ", " << *this << "\n"; }););
anatofuz
parents:
diff changeset
156 L.emit(std::move(R), std::move(TSM));
anatofuz
parents:
diff changeset
157 LLVM_DEBUG(ES.runSessionLocked([&]() {
anatofuz
parents:
diff changeset
158 dbgs() << "Finished emitting, for " << N << ", " << *this << "\n";
anatofuz
parents:
diff changeset
159 }););
anatofuz
parents:
diff changeset
160 }
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 ObjectLayer::ObjectLayer(ExecutionSession &ES) : ES(ES) {}
anatofuz
parents:
diff changeset
163
anatofuz
parents:
diff changeset
164 ObjectLayer::~ObjectLayer() {}
anatofuz
parents:
diff changeset
165
anatofuz
parents:
diff changeset
166 Error ObjectLayer::add(JITDylib &JD, std::unique_ptr<MemoryBuffer> O,
anatofuz
parents:
diff changeset
167 VModuleKey K) {
anatofuz
parents:
diff changeset
168 auto ObjMU = BasicObjectLayerMaterializationUnit::Create(*this, std::move(K),
anatofuz
parents:
diff changeset
169 std::move(O));
anatofuz
parents:
diff changeset
170 if (!ObjMU)
anatofuz
parents:
diff changeset
171 return ObjMU.takeError();
anatofuz
parents:
diff changeset
172 return JD.define(std::move(*ObjMU));
anatofuz
parents:
diff changeset
173 }
anatofuz
parents:
diff changeset
174
anatofuz
parents:
diff changeset
175 Expected<std::unique_ptr<BasicObjectLayerMaterializationUnit>>
anatofuz
parents:
diff changeset
176 BasicObjectLayerMaterializationUnit::Create(ObjectLayer &L, VModuleKey K,
anatofuz
parents:
diff changeset
177 std::unique_ptr<MemoryBuffer> O) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
178 auto ObjSymInfo =
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
179 getObjectSymbolInfo(L.getExecutionSession(), O->getMemBufferRef());
150
anatofuz
parents:
diff changeset
180
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
181 if (!ObjSymInfo)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
182 return ObjSymInfo.takeError();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
183
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
184 auto &SymbolFlags = ObjSymInfo->first;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
185 auto &InitSymbol = ObjSymInfo->second;
150
anatofuz
parents:
diff changeset
186
anatofuz
parents:
diff changeset
187 return std::unique_ptr<BasicObjectLayerMaterializationUnit>(
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
188 new BasicObjectLayerMaterializationUnit(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
189 L, K, std::move(O), std::move(SymbolFlags), std::move(InitSymbol)));
150
anatofuz
parents:
diff changeset
190 }
anatofuz
parents:
diff changeset
191
anatofuz
parents:
diff changeset
192 BasicObjectLayerMaterializationUnit::BasicObjectLayerMaterializationUnit(
anatofuz
parents:
diff changeset
193 ObjectLayer &L, VModuleKey K, std::unique_ptr<MemoryBuffer> O,
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
194 SymbolFlagsMap SymbolFlags, SymbolStringPtr InitSymbol)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
195 : MaterializationUnit(std::move(SymbolFlags), std::move(InitSymbol),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
196 std::move(K)),
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
197 L(L), O(std::move(O)) {}
150
anatofuz
parents:
diff changeset
198
anatofuz
parents:
diff changeset
199 StringRef BasicObjectLayerMaterializationUnit::getName() const {
anatofuz
parents:
diff changeset
200 if (O)
anatofuz
parents:
diff changeset
201 return O->getBufferIdentifier();
anatofuz
parents:
diff changeset
202 return "<null object>";
anatofuz
parents:
diff changeset
203 }
anatofuz
parents:
diff changeset
204
anatofuz
parents:
diff changeset
205 void BasicObjectLayerMaterializationUnit::materialize(
anatofuz
parents:
diff changeset
206 MaterializationResponsibility R) {
anatofuz
parents:
diff changeset
207 L.emit(std::move(R), std::move(O));
anatofuz
parents:
diff changeset
208 }
anatofuz
parents:
diff changeset
209
anatofuz
parents:
diff changeset
210 void BasicObjectLayerMaterializationUnit::discard(const JITDylib &JD,
anatofuz
parents:
diff changeset
211 const SymbolStringPtr &Name) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
212 // This is a no-op for object files: Having removed 'Name' from SymbolFlags
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
213 // the symbol will be dead-stripped by the JIT linker.
150
anatofuz
parents:
diff changeset
214 }
anatofuz
parents:
diff changeset
215
anatofuz
parents:
diff changeset
216 } // End namespace orc.
anatofuz
parents:
diff changeset
217 } // End namespace llvm.