forked from OSchip/llvm-project
[ORC] Add more utilities to aid debugging output.
(1) A const accessor for the LLVMContext held by a ThreadSafeContext. (2) A const accessor for the ThreadSafeModules held by an IRMaterializationUnit. (3) A const MaterializationResponsibility reference to IRTransformLayer2's transform function. This makes IRTransformLayer2 useful for JIT debugging (since it can inspect JIT state through the responsibility argument) as well as program transformations. llvm-svn: 343365
This commit is contained in:
parent
d47b5c7bed
commit
3e709d5f78
|
@ -25,8 +25,8 @@ namespace orc {
|
|||
|
||||
class IRTransformLayer2 : public IRLayer {
|
||||
public:
|
||||
using TransformFunction =
|
||||
std::function<Expected<ThreadSafeModule>(ThreadSafeModule)>;
|
||||
using TransformFunction = std::function<Expected<ThreadSafeModule>(
|
||||
ThreadSafeModule, const MaterializationResponsibility &R)>;
|
||||
|
||||
IRTransformLayer2(ExecutionSession &ES, IRLayer &BaseLayer,
|
||||
TransformFunction Transform = identityTransform);
|
||||
|
@ -38,7 +38,9 @@ public:
|
|||
void emit(MaterializationResponsibility R, VModuleKey K,
|
||||
ThreadSafeModule TSM) override;
|
||||
|
||||
static ThreadSafeModule identityTransform(ThreadSafeModule TSM) {
|
||||
static ThreadSafeModule
|
||||
identityTransform(ThreadSafeModule TSM,
|
||||
const MaterializationResponsibility &R) {
|
||||
return TSM;
|
||||
}
|
||||
|
||||
|
|
|
@ -89,6 +89,8 @@ public:
|
|||
/// Return the ModuleIdentifier as the name for this MaterializationUnit.
|
||||
StringRef getName() const override;
|
||||
|
||||
const ThreadSafeModule &getModule() const { return TSM; }
|
||||
|
||||
protected:
|
||||
ThreadSafeModule TSM;
|
||||
SymbolNameToDefinitionMap SymbolToDefinition;
|
||||
|
|
|
@ -66,6 +66,10 @@ public:
|
|||
/// instance, or null if the instance was default constructed.
|
||||
LLVMContext *getContext() { return S ? S->Ctx.get() : nullptr; }
|
||||
|
||||
/// Returns a pointer to the LLVMContext that was used to construct this
|
||||
/// instance, or null if the instance was default constructed.
|
||||
const LLVMContext *getContext() const { return S ? S->Ctx.get() : nullptr; }
|
||||
|
||||
Lock getLock() {
|
||||
assert(S && "Can not lock an empty ThreadSafeContext");
|
||||
return Lock(S);
|
||||
|
|
|
@ -22,7 +22,7 @@ void IRTransformLayer2::emit(MaterializationResponsibility R, VModuleKey K,
|
|||
ThreadSafeModule TSM) {
|
||||
assert(TSM.getModule() && "Module must not be null");
|
||||
|
||||
if (auto TransformedTSM = Transform(std::move(TSM)))
|
||||
if (auto TransformedTSM = Transform(std::move(TSM), R))
|
||||
BaseLayer.emit(std::move(R), std::move(K), std::move(*TransformedTSM));
|
||||
else {
|
||||
R.failMaterialization();
|
||||
|
|
|
@ -702,10 +702,12 @@ int main(int argc, char **argv, char * const *envp) {
|
|||
static orc::IRTransformLayer2::TransformFunction createDebugDumper() {
|
||||
switch (OrcDumpKind) {
|
||||
case DumpKind::NoDump:
|
||||
return [](orc::ThreadSafeModule TSM) { return TSM; };
|
||||
return [](orc::ThreadSafeModule TSM,
|
||||
const orc::MaterializationResponsibility &R) { return TSM; };
|
||||
|
||||
case DumpKind::DumpFuncsToStdOut:
|
||||
return [](orc::ThreadSafeModule TSM) {
|
||||
return [](orc::ThreadSafeModule TSM,
|
||||
const orc::MaterializationResponsibility &R) {
|
||||
printf("[ ");
|
||||
|
||||
for (const auto &F : *TSM.getModule()) {
|
||||
|
@ -724,7 +726,8 @@ static orc::IRTransformLayer2::TransformFunction createDebugDumper() {
|
|||
};
|
||||
|
||||
case DumpKind::DumpModsToStdOut:
|
||||
return [](orc::ThreadSafeModule TSM) {
|
||||
return [](orc::ThreadSafeModule TSM,
|
||||
const orc::MaterializationResponsibility &R) {
|
||||
outs() << "----- Module Start -----\n"
|
||||
<< *TSM.getModule() << "----- Module End -----\n";
|
||||
|
||||
|
@ -732,7 +735,8 @@ static orc::IRTransformLayer2::TransformFunction createDebugDumper() {
|
|||
};
|
||||
|
||||
case DumpKind::DumpModsToDisk:
|
||||
return [](orc::ThreadSafeModule TSM) {
|
||||
return [](orc::ThreadSafeModule TSM,
|
||||
const orc::MaterializationResponsibility &R) {
|
||||
std::error_code EC;
|
||||
raw_fd_ostream Out(TSM.getModule()->getModuleIdentifier() + ".ll", EC,
|
||||
sys::fs::F_Text);
|
||||
|
@ -792,12 +796,13 @@ int runOrcLazyJIT(const char *ProgName) {
|
|||
|
||||
auto Dump = createDebugDumper();
|
||||
|
||||
J->setLazyCompileTransform([&](orc::ThreadSafeModule TSM) {
|
||||
J->setLazyCompileTransform([&](orc::ThreadSafeModule TSM,
|
||||
const orc::MaterializationResponsibility &R) {
|
||||
if (verifyModule(*TSM.getModule(), &dbgs())) {
|
||||
dbgs() << "Bad module: " << *TSM.getModule() << "\n";
|
||||
exit(1);
|
||||
}
|
||||
return Dump(std::move(TSM));
|
||||
return Dump(std::move(TSM), R);
|
||||
});
|
||||
J->getMainJITDylib().setFallbackDefinitionGenerator(
|
||||
orc::DynamicLibraryFallbackGenerator(
|
||||
|
|
Loading…
Reference in New Issue