//===---------- 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> DumpObjects::operator()(std::unique_ptr 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 [ " << (const void *)Obj->getBufferStart() << " -- " << (const 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 std::move(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.