Skip to content

Commit 7dcd004

Browse files
committed
Re-apply "[ORC] Make MaterializationResponsibility immovable..." with fixes.
Re-applies c74900c with fixes for the ThinLtoJIT example.
1 parent 7c37b82 commit 7dcd004

29 files changed

+323
-283
lines changed

llvm/examples/SpeculativeJIT/SpeculativeJIT.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,13 @@ class SpeculativeJIT {
113113
this->CODLayer.setImplMap(&Imps);
114114
this->ES->setDispatchMaterialization(
115115
[this](std::unique_ptr<MaterializationUnit> MU,
116-
MaterializationResponsibility MR) {
117-
// FIXME: Switch to move capture once we have C++14.
118-
auto SharedMU = std::shared_ptr<MaterializationUnit>(std::move(MU));
119-
auto SharedMR =
120-
std::make_shared<MaterializationResponsibility>(std::move(MR));
121-
CompileThreads.async([SharedMU, SharedMR]() {
122-
SharedMU->materialize(std::move(*SharedMR));
123-
});
116+
std::unique_ptr<MaterializationResponsibility> MR) {
117+
CompileThreads.async(
118+
[UnownedMU = MU.release(), UnownedMR = MR.release()]() {
119+
std::unique_ptr<MaterializationUnit> MU(UnownedMU);
120+
std::unique_ptr<MaterializationResponsibility> MR(UnownedMR);
121+
MU->materialize(std::move(MR));
122+
});
124123
});
125124
ExitOnErr(S.addSpeculationRuntime(MainJD, Mangle));
126125
LocalCXXRuntimeOverrides CXXRuntimeoverrides;

llvm/examples/ThinLtoJIT/ThinLtoInstrumentationLayer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ void ThinLtoInstrumentationLayer::nudgeIntoDiscovery(
120120
LLVM_DEBUG(dbgs() << "Nudged " << Count << " new functions into discovery\n");
121121
}
122122

123-
void ThinLtoInstrumentationLayer::emit(MaterializationResponsibility R,
124-
ThreadSafeModule TSM) {
123+
void ThinLtoInstrumentationLayer::emit(
124+
std::unique_ptr<MaterializationResponsibility> R, ThreadSafeModule TSM) {
125125
TSM.withModuleDo([this](Module &M) {
126126
std::vector<Function *> FunctionsToInstrument;
127127

llvm/examples/ThinLtoJIT/ThinLtoInstrumentationLayer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ class ThinLtoInstrumentationLayer : public IRLayer {
3434

3535
~ThinLtoInstrumentationLayer() override;
3636

37-
void emit(MaterializationResponsibility R, ThreadSafeModule TSM) override;
37+
void emit(std::unique_ptr<MaterializationResponsibility> R,
38+
ThreadSafeModule TSM) override;
3839

3940
unsigned reserveDiscoveryFlags(unsigned Count);
4041
void registerDiscoveryFlagOwners(std::vector<GlobalValue::GUID> Guids,

llvm/examples/ThinLtoJIT/ThinLtoJIT.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -267,19 +267,18 @@ void ThinLtoJIT::setupLayers(JITTargetMachineBuilder JTMB,
267267
llvm::hardware_concurrency(NumCompileThreads));
268268
ES.setDispatchMaterialization(
269269
[this](std::unique_ptr<MaterializationUnit> MU,
270-
MaterializationResponsibility MR) {
270+
std::unique_ptr<MaterializationResponsibility> MR) {
271271
if (IsTrivialModule(MU.get())) {
272272
// This should be quick and we may save a few session locks.
273273
MU->materialize(std::move(MR));
274274
} else {
275275
// FIXME: Drop the std::shared_ptr workaround once ThreadPool::async()
276276
// accepts llvm::unique_function to define jobs.
277-
auto SharedMU = std::shared_ptr<MaterializationUnit>(std::move(MU));
278-
auto SharedMR =
279-
std::make_shared<MaterializationResponsibility>(std::move(MR));
280277
CompileThreads->async(
281-
[MU = std::move(SharedMU), MR = std::move(SharedMR)]() {
282-
MU->materialize(std::move(*MR));
278+
[UnownedMU = MU.release(), UnownedMR = MR.release()]() {
279+
std::unique_ptr<MaterializationUnit> MU(UnownedMU);
280+
std::unique_ptr<MaterializationResponsibility> MR(UnownedMR);
281+
MU->materialize(std::move(MR));
283282
});
284283
}
285284
});

llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ class CompileOnDemandLayer : public IRLayer {
9696

9797
/// Emits the given module. This should not be called by clients: it will be
9898
/// called by the JIT when a definition added via the add method is requested.
99-
void emit(MaterializationResponsibility R, ThreadSafeModule TSM) override;
99+
void emit(std::unique_ptr<MaterializationResponsibility> R,
100+
ThreadSafeModule TSM) override;
100101

101102
private:
102103
struct PerDylibResources {
@@ -120,7 +121,8 @@ class CompileOnDemandLayer : public IRLayer {
120121

121122
void expandPartition(GlobalValueSet &Partition);
122123

123-
void emitPartition(MaterializationResponsibility R, ThreadSafeModule TSM,
124+
void emitPartition(std::unique_ptr<MaterializationResponsibility> R,
125+
ThreadSafeModule TSM,
124126
IRMaterializationUnit::SymbolNameToDefinitionMap Defs);
125127

126128
mutable std::mutex CODLayerMutex;

llvm/include/llvm/ExecutionEngine/Orc/Core.h

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ class UnexpectedSymbolDefinitions : public ErrorInfo<UnexpectedSymbolDefinitions
410410
class MaterializationResponsibility {
411411
friend class MaterializationUnit;
412412
public:
413-
MaterializationResponsibility(MaterializationResponsibility &&) = default;
413+
MaterializationResponsibility(MaterializationResponsibility &&) = delete;
414414
MaterializationResponsibility &
415415
operator=(MaterializationResponsibility &&) = delete;
416416

@@ -514,8 +514,8 @@ class MaterializationResponsibility {
514514
/// Delegates responsibility for the given symbols to the returned
515515
/// materialization responsibility. Useful for breaking up work between
516516
/// threads, or different kinds of materialization processes.
517-
MaterializationResponsibility delegate(const SymbolNameSet &Symbols,
518-
VModuleKey NewKey = VModuleKey());
517+
std::unique_ptr<MaterializationResponsibility>
518+
delegate(const SymbolNameSet &Symbols, VModuleKey NewKey = VModuleKey());
519519

520520
void addDependencies(const SymbolStringPtr &Name,
521521
const SymbolDependenceMap &Dependencies);
@@ -577,7 +577,8 @@ class MaterializationUnit {
577577
/// Implementations of this method should materialize all symbols
578578
/// in the materialzation unit, except for those that have been
579579
/// previously discarded.
580-
virtual void materialize(MaterializationResponsibility R) = 0;
580+
virtual void
581+
materialize(std::unique_ptr<MaterializationResponsibility> R) = 0;
581582

582583
/// Called by JITDylibs to notify MaterializationUnits that the given symbol
583584
/// has been overridden.
@@ -594,10 +595,11 @@ class MaterializationUnit {
594595
private:
595596
virtual void anchor();
596597

597-
MaterializationResponsibility
598+
std::unique_ptr<MaterializationResponsibility>
598599
createMaterializationResponsibility(std::shared_ptr<JITDylib> JD) {
599-
return MaterializationResponsibility(std::move(JD), std::move(SymbolFlags),
600-
std::move(InitSymbol), K);
600+
return std::unique_ptr<MaterializationResponsibility>(
601+
new MaterializationResponsibility(std::move(JD), std::move(SymbolFlags),
602+
std::move(InitSymbol), K));
601603
}
602604

603605
/// Implementations of this method should discard the given symbol
@@ -621,7 +623,7 @@ class AbsoluteSymbolsMaterializationUnit : public MaterializationUnit {
621623
StringRef getName() const override;
622624

623625
private:
624-
void materialize(MaterializationResponsibility R) override;
626+
void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
625627
void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
626628
static SymbolFlagsMap extractFlags(const SymbolMap &Symbols);
627629

@@ -663,7 +665,7 @@ class ReExportsMaterializationUnit : public MaterializationUnit {
663665
StringRef getName() const override;
664666

665667
private:
666-
void materialize(MaterializationResponsibility R) override;
668+
void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
667669
void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
668670
static SymbolFlagsMap extractFlags(const SymbolAliasMap &Aliases);
669671

@@ -1116,7 +1118,7 @@ class ExecutionSession {
11161118
/// For dispatching MaterializationUnit::materialize calls.
11171119
using DispatchMaterializationFunction =
11181120
std::function<void(std::unique_ptr<MaterializationUnit> MU,
1119-
MaterializationResponsibility MR)>;
1121+
std::unique_ptr<MaterializationResponsibility> MR)>;
11201122

11211123
/// Construct an ExecutionSession.
11221124
///
@@ -1268,10 +1270,11 @@ class ExecutionSession {
12681270
SymbolState RequiredState = SymbolState::Ready);
12691271

12701272
/// Materialize the given unit.
1271-
void dispatchMaterialization(std::unique_ptr<MaterializationUnit> MU,
1272-
MaterializationResponsibility MR) {
1273+
void
1274+
dispatchMaterialization(std::unique_ptr<MaterializationUnit> MU,
1275+
std::unique_ptr<MaterializationResponsibility> MR) {
12731276
assert(MU && "MU must be non-null");
1274-
DEBUG_WITH_TYPE("orc", dumpDispatchInfo(MR.getTargetJITDylib(), *MU));
1277+
DEBUG_WITH_TYPE("orc", dumpDispatchInfo(MR->getTargetJITDylib(), *MU));
12751278
DispatchMaterialization(std::move(MU), std::move(MR));
12761279
}
12771280

@@ -1283,9 +1286,9 @@ class ExecutionSession {
12831286
logAllUnhandledErrors(std::move(Err), errs(), "JIT session error: ");
12841287
}
12851288

1286-
static void
1287-
materializeOnCurrentThread(std::unique_ptr<MaterializationUnit> MU,
1288-
MaterializationResponsibility MR) {
1289+
static void materializeOnCurrentThread(
1290+
std::unique_ptr<MaterializationUnit> MU,
1291+
std::unique_ptr<MaterializationResponsibility> MR) {
12891292
MU->materialize(std::move(MR));
12901293
}
12911294

@@ -1309,7 +1312,7 @@ class ExecutionSession {
13091312
// with callbacks from asynchronous queries.
13101313
mutable std::recursive_mutex OutstandingMUsMutex;
13111314
std::vector<std::pair<std::unique_ptr<MaterializationUnit>,
1312-
MaterializationResponsibility>>
1315+
std::unique_ptr<MaterializationResponsibility>>>
13131316
OutstandingMUs;
13141317
};
13151318

llvm/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ class IRCompileLayer : public IRLayer {
5555

5656
void setNotifyCompiled(NotifyCompiledFunction NotifyCompiled);
5757

58-
void emit(MaterializationResponsibility R, ThreadSafeModule TSM) override;
58+
void emit(std::unique_ptr<MaterializationResponsibility> R,
59+
ThreadSafeModule TSM) override;
5960

6061
private:
6162
mutable std::mutex IRLayerMutex;

llvm/include/llvm/ExecutionEngine/Orc/IRTransformLayer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ class IRTransformLayer : public IRLayer {
3737
this->Transform = std::move(Transform);
3838
}
3939

40-
void emit(MaterializationResponsibility R, ThreadSafeModule TSM) override;
40+
void emit(std::unique_ptr<MaterializationResponsibility> R,
41+
ThreadSafeModule TSM) override;
4142

4243
static ThreadSafeModule identityTransform(ThreadSafeModule TSM,
4344
MaterializationResponsibility &R) {

llvm/include/llvm/ExecutionEngine/Orc/Layer.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ class IRLayer {
100100
VModuleKey K = VModuleKey());
101101

102102
/// Emit should materialize the given IR.
103-
virtual void emit(MaterializationResponsibility R, ThreadSafeModule TSM) = 0;
103+
virtual void emit(std::unique_ptr<MaterializationResponsibility> R,
104+
ThreadSafeModule TSM) = 0;
104105

105106
private:
106107
bool CloneToNewContextOnEmit = false;
@@ -117,8 +118,7 @@ class BasicIRLayerMaterializationUnit : public IRMaterializationUnit {
117118
ThreadSafeModule TSM, VModuleKey K);
118119

119120
private:
120-
121-
void materialize(MaterializationResponsibility R) override;
121+
void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
122122

123123
IRLayer &L;
124124
VModuleKey K;
@@ -139,7 +139,7 @@ class ObjectLayer {
139139
VModuleKey K = VModuleKey());
140140

141141
/// Emit should materialize the given IR.
142-
virtual void emit(MaterializationResponsibility R,
142+
virtual void emit(std::unique_ptr<MaterializationResponsibility> R,
143143
std::unique_ptr<MemoryBuffer> O) = 0;
144144

145145
private:
@@ -162,8 +162,7 @@ class BasicObjectLayerMaterializationUnit : public MaterializationUnit {
162162
StringRef getName() const override;
163163

164164
private:
165-
166-
void materialize(MaterializationResponsibility R) override;
165+
void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
167166
void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
168167

169168
ObjectLayer &L;

llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ class LazyReexportsMaterializationUnit : public MaterializationUnit {
149149
StringRef getName() const override;
150150

151151
private:
152-
void materialize(MaterializationResponsibility R) override;
152+
void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
153153
void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
154154
static SymbolFlagsMap extractFlags(const SymbolAliasMap &Aliases);
155155

0 commit comments

Comments
 (0)