1//===----- DebugUtils.h - Utilities for debugging ORC JITs ------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Utilities for debugging ORC-based JITs.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_EXECUTIONENGINE_ORC_DEBUGUTILS_H
14#define LLVM_EXECUTIONENGINE_ORC_DEBUGUTILS_H
15
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ExecutionEngine/Orc/Core.h"
18#include "llvm/ExecutionEngine/Orc/SymbolStringPool.h"
19#include "llvm/Support/Error.h"
20#include "llvm/Support/raw_ostream.h"
21#include <memory>
22#include <string>
23
24namespace llvm {
25
26class MemoryBuffer;
27
28namespace orc {
29
30// --raw_ostream operators for ORC types--
31
32/// Render a SymbolStringPtr.
33raw_ostream &operator<<(raw_ostream &OS, const SymbolStringPtr &Sym);
34
35/// Render a SymbolNameSet.
36raw_ostream &operator<<(raw_ostream &OS, const SymbolNameSet &Symbols);
37
38/// Render a SymbolNameVector.
39raw_ostream &operator<<(raw_ostream &OS, const SymbolNameVector &Symbols);
40
41/// Render an array of SymbolStringPtrs.
42raw_ostream &operator<<(raw_ostream &OS, ArrayRef<SymbolStringPtr> Symbols);
43
44/// Render JITSymbolFlags.
45raw_ostream &operator<<(raw_ostream &OS, const JITSymbolFlags &Flags);
46
47/// Render a SymbolFlagsMap entry.
48raw_ostream &operator<<(raw_ostream &OS, const SymbolFlagsMap::value_type &KV);
49
50/// Render a SymbolMap entry.
51raw_ostream &operator<<(raw_ostream &OS, const SymbolMap::value_type &KV);
52
53/// Render a SymbolFlagsMap.
54raw_ostream &operator<<(raw_ostream &OS, const SymbolFlagsMap &SymbolFlags);
55
56/// Render a SymbolMap.
57raw_ostream &operator<<(raw_ostream &OS, const SymbolMap &Symbols);
58
59/// Render a SymbolDependenceMap entry.
60raw_ostream &operator<<(raw_ostream &OS,
61 const SymbolDependenceMap::value_type &KV);
62
63/// Render a SymbolDependendeMap.
64raw_ostream &operator<<(raw_ostream &OS, const SymbolDependenceMap &Deps);
65
66/// Render a MaterializationUnit.
67raw_ostream &operator<<(raw_ostream &OS, const MaterializationUnit &MU);
68
69//// Render a JITDylibLookupFlags instance.
70raw_ostream &operator<<(raw_ostream &OS,
71 const JITDylibLookupFlags &JDLookupFlags);
72
73/// Rendar a SymbolLookupFlags instance.
74raw_ostream &operator<<(raw_ostream &OS, const SymbolLookupFlags &LookupFlags);
75
76/// Render a JITDylibLookupFlags instance.
77raw_ostream &operator<<(raw_ostream &OS, const LookupKind &K);
78
79/// Render a SymbolLookupSet entry.
80raw_ostream &operator<<(raw_ostream &OS, const SymbolLookupSet::value_type &KV);
81
82/// Render a SymbolLookupSet.
83raw_ostream &operator<<(raw_ostream &OS, const SymbolLookupSet &LookupSet);
84
85/// Render a JITDylibSearchOrder.
86raw_ostream &operator<<(raw_ostream &OS,
87 const JITDylibSearchOrder &SearchOrder);
88
89/// Render a SymbolAliasMap.
90raw_ostream &operator<<(raw_ostream &OS, const SymbolAliasMap &Aliases);
91
92/// Render a SymbolState.
93raw_ostream &operator<<(raw_ostream &OS, const SymbolState &S);
94
95/// Render a LookupKind.
96raw_ostream &operator<<(raw_ostream &OS, const LookupKind &K);
97
98/// A function object that can be used as an ObjectTransformLayer transform
99/// to dump object files to disk at a specified path.
100class DumpObjects {
101public:
102 /// Construct a DumpObjects transform that will dump objects to disk.
103 ///
104 /// @param DumpDir specifies the path to write dumped objects to. DumpDir may
105 /// be empty, in which case files will be dumped to the working directory. If
106 /// DumpDir is non-empty then any trailing separators will be discarded.
107 ///
108 /// @param IdentifierOverride specifies a file name stem to use when dumping
109 /// objects. If empty, each MemoryBuffer's identifier will be used (with a .o
110 /// suffix added if not already present). If an identifier override is
111 /// supplied it will be used instead (since all buffers will use the same
112 /// identifier, the resulting files will be named <ident>.o, <ident>.2.o,
113 /// <ident>.3.o, and so on). IdentifierOverride should not contain an
114 /// extension, as a .o suffix will be added by DumpObjects.
115 DumpObjects(std::string DumpDir = "", std::string IdentifierOverride = "");
116
117 /// Dumps the given buffer to disk.
118 Expected<std::unique_ptr<MemoryBuffer>>
119 operator()(std::unique_ptr<MemoryBuffer> Obj);
120
121private:
122 StringRef getBufferIdentifier(MemoryBuffer &B);
123 std::string DumpDir;
124 std::string IdentifierOverride;
125};
126
127} // End namespace orc
128} // End namespace llvm
129
130#endif // LLVM_EXECUTIONENGINE_ORC_DEBUGUTILS_H
131