Skip to content

Commit 6fe2e9a

Browse files
committed
[ORC] Hold shared_ptr<SymbolStringPool> in errors containing SymbolStringPtrs.
This allows these error values to remain valid, even if they tear down the JIT itself.
1 parent c427727 commit 6fe2e9a

File tree

4 files changed

+55
-24
lines changed

4 files changed

+55
-24
lines changed

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

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -433,13 +433,16 @@ class SymbolsNotFound : public ErrorInfo<SymbolsNotFound> {
433433
public:
434434
static char ID;
435435

436-
SymbolsNotFound(SymbolNameSet Symbols);
437-
SymbolsNotFound(SymbolNameVector Symbols);
436+
SymbolsNotFound(std::shared_ptr<SymbolStringPool> SSP, SymbolNameSet Symbols);
437+
SymbolsNotFound(std::shared_ptr<SymbolStringPool> SSP,
438+
SymbolNameVector Symbols);
438439
std::error_code convertToErrorCode() const override;
439440
void log(raw_ostream &OS) const override;
441+
std::shared_ptr<SymbolStringPool> getSymbolStringPool() { return SSP; }
440442
const SymbolNameVector &getSymbols() const { return Symbols; }
441443

442444
private:
445+
std::shared_ptr<SymbolStringPool> SSP;
443446
SymbolNameVector Symbols;
444447
};
445448

@@ -448,12 +451,15 @@ class SymbolsCouldNotBeRemoved : public ErrorInfo<SymbolsCouldNotBeRemoved> {
448451
public:
449452
static char ID;
450453

451-
SymbolsCouldNotBeRemoved(SymbolNameSet Symbols);
454+
SymbolsCouldNotBeRemoved(std::shared_ptr<SymbolStringPool> SSP,
455+
SymbolNameSet Symbols);
452456
std::error_code convertToErrorCode() const override;
453457
void log(raw_ostream &OS) const override;
458+
std::shared_ptr<SymbolStringPool> getSymbolStringPool() { return SSP; }
454459
const SymbolNameSet &getSymbols() const { return Symbols; }
455460

456461
private:
462+
std::shared_ptr<SymbolStringPool> SSP;
457463
SymbolNameSet Symbols;
458464
};
459465

@@ -465,13 +471,17 @@ class MissingSymbolDefinitions : public ErrorInfo<MissingSymbolDefinitions> {
465471
public:
466472
static char ID;
467473

468-
MissingSymbolDefinitions(std::string ModuleName, SymbolNameVector Symbols)
469-
: ModuleName(std::move(ModuleName)), Symbols(std::move(Symbols)) {}
474+
MissingSymbolDefinitions(std::shared_ptr<SymbolStringPool> SSP,
475+
std::string ModuleName, SymbolNameVector Symbols)
476+
: SSP(std::move(SSP)), ModuleName(std::move(ModuleName)),
477+
Symbols(std::move(Symbols)) {}
470478
std::error_code convertToErrorCode() const override;
471479
void log(raw_ostream &OS) const override;
480+
std::shared_ptr<SymbolStringPool> getSymbolStringPool() { return SSP; }
472481
const std::string &getModuleName() const { return ModuleName; }
473482
const SymbolNameVector &getSymbols() const { return Symbols; }
474483
private:
484+
std::shared_ptr<SymbolStringPool> SSP;
475485
std::string ModuleName;
476486
SymbolNameVector Symbols;
477487
};
@@ -484,13 +494,17 @@ class UnexpectedSymbolDefinitions : public ErrorInfo<UnexpectedSymbolDefinitions
484494
public:
485495
static char ID;
486496

487-
UnexpectedSymbolDefinitions(std::string ModuleName, SymbolNameVector Symbols)
488-
: ModuleName(std::move(ModuleName)), Symbols(std::move(Symbols)) {}
497+
UnexpectedSymbolDefinitions(std::shared_ptr<SymbolStringPool> SSP,
498+
std::string ModuleName, SymbolNameVector Symbols)
499+
: SSP(std::move(SSP)), ModuleName(std::move(ModuleName)),
500+
Symbols(std::move(Symbols)) {}
489501
std::error_code convertToErrorCode() const override;
490502
void log(raw_ostream &OS) const override;
503+
std::shared_ptr<SymbolStringPool> getSymbolStringPool() { return SSP; }
491504
const std::string &getModuleName() const { return ModuleName; }
492505
const SymbolNameVector &getSymbols() const { return Symbols; }
493506
private:
507+
std::shared_ptr<SymbolStringPool> SSP;
494508
std::string ModuleName;
495509
SymbolNameVector Symbols;
496510
};
@@ -1310,6 +1324,11 @@ class ExecutionSession {
13101324
/// ExecutionSession.
13111325
ExecutorProcessControl &getExecutorProcessControl() { return *EPC; }
13121326

1327+
/// Get the SymbolStringPool for this instance.
1328+
std::shared_ptr<SymbolStringPool> getSymbolStringPool() {
1329+
return EPC->getSymbolStringPool();
1330+
}
1331+
13131332
/// Add a symbol name to the SymbolStringPool and return a pointer to it.
13141333
SymbolStringPtr intern(StringRef SymName) { return EPC->intern(SymName); }
13151334

llvm/lib/ExecutionEngine/Orc/Core.cpp

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,17 @@ void FailedToMaterialize::log(raw_ostream &OS) const {
9090
OS << "Failed to materialize symbols: " << *Symbols;
9191
}
9292

93-
SymbolsNotFound::SymbolsNotFound(SymbolNameSet Symbols) {
93+
SymbolsNotFound::SymbolsNotFound(std::shared_ptr<SymbolStringPool> SSP,
94+
SymbolNameSet Symbols)
95+
: SSP(std::move(SSP)) {
9496
for (auto &Sym : Symbols)
9597
this->Symbols.push_back(Sym);
9698
assert(!this->Symbols.empty() && "Can not fail to resolve an empty set");
9799
}
98100

99-
SymbolsNotFound::SymbolsNotFound(SymbolNameVector Symbols)
100-
: Symbols(std::move(Symbols)) {
101+
SymbolsNotFound::SymbolsNotFound(std::shared_ptr<SymbolStringPool> SSP,
102+
SymbolNameVector Symbols)
103+
: SSP(std::move(SSP)), Symbols(std::move(Symbols)) {
101104
assert(!this->Symbols.empty() && "Can not fail to resolve an empty set");
102105
}
103106

@@ -109,8 +112,9 @@ void SymbolsNotFound::log(raw_ostream &OS) const {
109112
OS << "Symbols not found: " << Symbols;
110113
}
111114

112-
SymbolsCouldNotBeRemoved::SymbolsCouldNotBeRemoved(SymbolNameSet Symbols)
113-
: Symbols(std::move(Symbols)) {
115+
SymbolsCouldNotBeRemoved::SymbolsCouldNotBeRemoved(
116+
std::shared_ptr<SymbolStringPool> SSP, SymbolNameSet Symbols)
117+
: SSP(std::move(SSP)), Symbols(std::move(Symbols)) {
114118
assert(!this->Symbols.empty() && "Can not fail to resolve an empty set");
115119
}
116120

@@ -1333,11 +1337,13 @@ Error JITDylib::remove(const SymbolNameSet &Names) {
13331337

13341338
// If any of the symbols are not defined, return an error.
13351339
if (!Missing.empty())
1336-
return make_error<SymbolsNotFound>(std::move(Missing));
1340+
return make_error<SymbolsNotFound>(ES.getSymbolStringPool(),
1341+
std::move(Missing));
13371342

13381343
// If any of the symbols are currently materializing, return an error.
13391344
if (!Materializing.empty())
1340-
return make_error<SymbolsCouldNotBeRemoved>(std::move(Materializing));
1345+
return make_error<SymbolsCouldNotBeRemoved>(ES.getSymbolStringPool(),
1346+
std::move(Materializing));
13411347

13421348
// Remove the symbols.
13431349
for (auto &SymbolMaterializerItrPair : SymbolsToRemove) {
@@ -2234,7 +2240,8 @@ Error ExecutionSession::IL_updateCandidatesFor(
22342240
// weakly referenced" specific error here to reduce confusion.
22352241
if (SymI->second.getFlags().hasMaterializationSideEffectsOnly() &&
22362242
SymLookupFlags != SymbolLookupFlags::WeaklyReferencedSymbol)
2237-
return make_error<SymbolsNotFound>(SymbolNameVector({Name}));
2243+
return make_error<SymbolsNotFound>(getSymbolStringPool(),
2244+
SymbolNameVector({Name}));
22382245

22392246
// If we matched against this symbol but it is in the error state
22402247
// then bail out and treat it as a failure to materialize.
@@ -2422,7 +2429,7 @@ void ExecutionSession::OL_applyQueryPhase1(
24222429
} else {
24232430
LLVM_DEBUG(dbgs() << "Phase 1 failed with unresolved symbols.\n");
24242431
IPLS->fail(make_error<SymbolsNotFound>(
2425-
IPLS->DefGeneratorCandidates.getSymbolNames()));
2432+
getSymbolStringPool(), IPLS->DefGeneratorCandidates.getSymbolNames()));
24262433
}
24272434
}
24282435

@@ -2492,7 +2499,8 @@ void ExecutionSession::OL_completeLookup(
24922499
dbgs() << "error: "
24932500
"required, but symbol is has-side-effects-only\n";
24942501
});
2495-
return make_error<SymbolsNotFound>(SymbolNameVector({Name}));
2502+
return make_error<SymbolsNotFound>(getSymbolStringPool(),
2503+
SymbolNameVector({Name}));
24962504
}
24972505

24982506
// If we matched against this symbol but it is in the error state
@@ -2606,7 +2614,8 @@ void ExecutionSession::OL_completeLookup(
26062614

26072615
if (!IPLS->LookupSet.empty()) {
26082616
LLVM_DEBUG(dbgs() << "Failing due to unresolved symbols\n");
2609-
return make_error<SymbolsNotFound>(IPLS->LookupSet.getSymbolNames());
2617+
return make_error<SymbolsNotFound>(getSymbolStringPool(),
2618+
IPLS->LookupSet.getSymbolNames());
26102619
}
26112620

26122621
// Record whether the query completed.
@@ -2733,7 +2742,8 @@ void ExecutionSession::OL_completeLookupFlags(
27332742

27342743
if (!IPLS->LookupSet.empty()) {
27352744
LLVM_DEBUG(dbgs() << "Failing due to unresolved symbols\n");
2736-
return make_error<SymbolsNotFound>(IPLS->LookupSet.getSymbolNames());
2745+
return make_error<SymbolsNotFound>(getSymbolStringPool(),
2746+
IPLS->LookupSet.getSymbolNames());
27372747
}
27382748

27392749
LLVM_DEBUG(dbgs() << "Succeded, result = " << Result << "\n");

llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ SelfExecutorProcessControl::lookupSymbols(ArrayRef<LookupRequest> Request) {
9393
// FIXME: Collect all failing symbols before erroring out.
9494
SymbolNameVector MissingSymbols;
9595
MissingSymbols.push_back(Sym);
96-
return make_error<SymbolsNotFound>(std::move(MissingSymbols));
96+
return make_error<SymbolsNotFound>(SSP, std::move(MissingSymbols));
9797
}
9898
R.back().push_back(pointerToJITTargetAddress(Addr));
9999
}

llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,9 @@ class ObjectLinkingLayerJITLinkContext final : public JITLinkContext {
279279

280280
// If there were missing symbols then report the error.
281281
if (!MissingSymbols.empty())
282-
return make_error<MissingSymbolDefinitions>(G.getName(),
283-
std::move(MissingSymbols));
282+
return make_error<MissingSymbolDefinitions>(
283+
Layer.getExecutionSession().getSymbolStringPool(), G.getName(),
284+
std::move(MissingSymbols));
284285

285286
// If there are more definitions than expected, add them to the
286287
// ExtraSymbols vector.
@@ -293,8 +294,9 @@ class ObjectLinkingLayerJITLinkContext final : public JITLinkContext {
293294

294295
// If there were extra definitions then report the error.
295296
if (!ExtraSymbols.empty())
296-
return make_error<UnexpectedSymbolDefinitions>(G.getName(),
297-
std::move(ExtraSymbols));
297+
return make_error<UnexpectedSymbolDefinitions>(
298+
Layer.getExecutionSession().getSymbolStringPool(), G.getName(),
299+
std::move(ExtraSymbols));
298300
}
299301

300302
if (auto Err = MR->notifyResolved(InternedResult))

0 commit comments

Comments
 (0)