diff options
author | Lang Hames <lhames@gmail.com> | 2019-11-14 15:58:21 -0800 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2019-11-14 21:27:19 -0800 |
commit | 16f38dda292c6e2963e77f722042a9eb5da56d28 (patch) | |
tree | 412b958c6d721df8ad15a3b014872fc5c8d9292e /llvm/lib/ExecutionEngine/Orc/DebugUtils.cpp | |
parent | bc11830c6a67025186d39fd9de6e49b3b570e2bd (diff) | |
download | llvm-16f38dda292c6e2963e77f722042a9eb5da56d28.zip llvm-16f38dda292c6e2963e77f722042a9eb5da56d28.tar.gz llvm-16f38dda292c6e2963e77f722042a9eb5da56d28.tar.bz2 |
[ORC] Add a utility to support dumping JIT'd objects to disk for debugging.
Adds a DumpObjects utility that can be used to dump JIT'd objects to disk.
Instances of DebugObjects may be used by ObjectTransformLayer as no-op
transforms.
This patch also adds an ObjectTransformLayer to LLJIT and an example of how
to use this utility to dump JIT'd objects in LLJIT.
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/DebugUtils.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/DebugUtils.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/DebugUtils.cpp b/llvm/lib/ExecutionEngine/Orc/DebugUtils.cpp new file mode 100644 index 0000000..4e573da --- /dev/null +++ b/llvm/lib/ExecutionEngine/Orc/DebugUtils.cpp @@ -0,0 +1,68 @@ +//===---------- DebugUtils.cpp - Utilities for debugging ORC JITs ---------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/ExecutionEngine/Orc/DebugUtils.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/raw_ostream.h" + +#define DEBUG_TYPE "orc" + +namespace llvm { +namespace orc { + +DumpObjects::DumpObjects(std::string DumpDir, std::string IdentifierOverride) + : DumpDir(std::move(DumpDir)), + IdentifierOverride(std::move(IdentifierOverride)) { + + /// Discard any trailing separators. + while (!this->DumpDir.empty() && + sys::path::is_separator(this->DumpDir.back())) + this->DumpDir.pop_back(); +} + +Expected<std::unique_ptr<MemoryBuffer>> +DumpObjects::operator()(std::unique_ptr<MemoryBuffer> Obj) { + size_t Idx = 1; + + std::string DumpPathStem; + raw_string_ostream(DumpPathStem) + << DumpDir << (DumpDir.empty() ? "" : "/") << getBufferIdentifier(*Obj); + + std::string DumpPath = DumpPathStem + ".o"; + while (sys::fs::exists(DumpPath)) { + DumpPath.clear(); + raw_string_ostream(DumpPath) << DumpPathStem << "." << (++Idx) << ".o"; + } + + LLVM_DEBUG({ + dbgs() << "Dumping object buffer [ " << (void *)Obj->getBufferStart() + << " -- " << (void *)(Obj->getBufferEnd() - 1) << " ] to " + << DumpPath << "\n"; + }); + + std::error_code EC; + raw_fd_ostream DumpStream(DumpPath, EC); + if (EC) + return errorCodeToError(EC); + DumpStream.write(Obj->getBufferStart(), Obj->getBufferSize()); + + return Obj; +} + +StringRef DumpObjects::getBufferIdentifier(MemoryBuffer &B) { + if (!IdentifierOverride.empty()) + return IdentifierOverride; + StringRef Identifier = B.getBufferIdentifier(); + Identifier.consume_back(".o"); + return Identifier; +} + +} // End namespace orc. +} // End namespace llvm. |