1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

[JITLink] Allow JITLinkContext::notifyResolved to return an Error.

This allows clients to detect invalid transformations applied by JITLink passes
(e.g. inserting or removing symbols in unexpected ways) and terminate linking
with an error.

This change is used to simplify the error propagation logic in
ObjectLinkingLayer.
This commit is contained in:
Lang Hames 2020-07-29 20:46:56 -07:00
parent 39a288b179
commit eeb8251d74
3 changed files with 20 additions and 21 deletions

View File

@ -1279,7 +1279,11 @@ public:
/// their final memory locations in the target process. At this point the
/// LinkGraph can be inspected to build a symbol table, however the block
/// content will not generally have been copied to the target location yet.
virtual void notifyResolved(LinkGraph &G) = 0;
///
/// If the client detects an error in the LinkGraph state (e.g. unexpected or
/// missing symbols) they may return an error here. The error will be
/// propagated to notifyFailed and the linker will bail out.
virtual Error notifyResolved(LinkGraph &G) = 0;
/// Called by JITLink to notify the context that the object has been
/// finalized (i.e. emitted to memory and memory permissions set). If all of

View File

@ -67,7 +67,9 @@ void JITLinkerBase::linkPhase1(std::unique_ptr<JITLinkerBase> Self) {
// Notify client that the defined symbols have been assigned addresses.
LLVM_DEBUG(
{ dbgs() << "Resolving symbols defined in " << G->getName() << "\n"; });
Ctx->notifyResolved(*G);
if (auto Err = Ctx->notifyResolved(*G))
return Ctx->notifyFailed(std::move(Err));
auto ExternalSymbols = getExternalSymbolNames();

View File

@ -97,7 +97,7 @@ public:
});
}
void notifyResolved(LinkGraph &G) override {
Error notifyResolved(LinkGraph &G) override {
auto &ES = Layer.getExecutionSession();
SymbolFlagsMap ExtraSymbolsToClaim;
@ -143,7 +143,7 @@ public:
if (!ExtraSymbolsToClaim.empty())
if (auto Err = MR.defineMaterializing(ExtraSymbolsToClaim))
return notifyFailed(std::move(Err));
return Err;
{
@ -169,12 +169,9 @@ public:
}
// If there were missing symbols then report the error.
if (!MissingSymbols.empty()) {
ES.reportError(make_error<MissingSymbolDefinitions>(
G.getName(), std::move(MissingSymbols)));
MR.failMaterialization();
return;
}
if (!MissingSymbols.empty())
return make_error<MissingSymbolDefinitions>(G.getName(),
std::move(MissingSymbols));
// If there are more definitions than expected, add them to the
// ExtraSymbols vector.
@ -186,20 +183,16 @@ public:
}
// If there were extra definitions then report the error.
if (!ExtraSymbols.empty()) {
ES.reportError(make_error<UnexpectedSymbolDefinitions>(
G.getName(), std::move(ExtraSymbols)));
MR.failMaterialization();
return;
}
if (!ExtraSymbols.empty())
return make_error<UnexpectedSymbolDefinitions>(G.getName(),
std::move(ExtraSymbols));
}
if (auto Err = MR.notifyResolved(InternedResult)) {
Layer.getExecutionSession().reportError(std::move(Err));
MR.failMaterialization();
return;
}
if (auto Err = MR.notifyResolved(InternedResult))
return Err;
Layer.notifyLoaded(MR);
return Error::success();
}
void notifyFinalized(