Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 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 | |||
24 | namespace llvm { |
||
25 | |||
26 | class MemoryBuffer; |
||
27 | |||
28 | namespace orc { |
||
29 | |||
30 | // --raw_ostream operators for ORC types-- |
||
31 | |||
32 | /// Render a SymbolStringPtr. |
||
33 | raw_ostream &operator<<(raw_ostream &OS, const SymbolStringPtr &Sym); |
||
34 | |||
35 | /// Render a SymbolNameSet. |
||
36 | raw_ostream &operator<<(raw_ostream &OS, const SymbolNameSet &Symbols); |
||
37 | |||
38 | /// Render a SymbolNameVector. |
||
39 | raw_ostream &operator<<(raw_ostream &OS, const SymbolNameVector &Symbols); |
||
40 | |||
41 | /// Render an array of SymbolStringPtrs. |
||
42 | raw_ostream &operator<<(raw_ostream &OS, ArrayRef<SymbolStringPtr> Symbols); |
||
43 | |||
44 | /// Render JITSymbolFlags. |
||
45 | raw_ostream &operator<<(raw_ostream &OS, const JITSymbolFlags &Flags); |
||
46 | |||
47 | /// Render a SymbolFlagsMap entry. |
||
48 | raw_ostream &operator<<(raw_ostream &OS, const SymbolFlagsMap::value_type &KV); |
||
49 | |||
50 | /// Render a SymbolMap entry. |
||
51 | raw_ostream &operator<<(raw_ostream &OS, const SymbolMap::value_type &KV); |
||
52 | |||
53 | /// Render a SymbolFlagsMap. |
||
54 | raw_ostream &operator<<(raw_ostream &OS, const SymbolFlagsMap &SymbolFlags); |
||
55 | |||
56 | /// Render a SymbolMap. |
||
57 | raw_ostream &operator<<(raw_ostream &OS, const SymbolMap &Symbols); |
||
58 | |||
59 | /// Render a SymbolDependenceMap entry. |
||
60 | raw_ostream &operator<<(raw_ostream &OS, |
||
61 | const SymbolDependenceMap::value_type &KV); |
||
62 | |||
63 | /// Render a SymbolDependendeMap. |
||
64 | raw_ostream &operator<<(raw_ostream &OS, const SymbolDependenceMap &Deps); |
||
65 | |||
66 | /// Render a MaterializationUnit. |
||
67 | raw_ostream &operator<<(raw_ostream &OS, const MaterializationUnit &MU); |
||
68 | |||
69 | //// Render a JITDylibLookupFlags instance. |
||
70 | raw_ostream &operator<<(raw_ostream &OS, |
||
71 | const JITDylibLookupFlags &JDLookupFlags); |
||
72 | |||
73 | /// Rendar a SymbolLookupFlags instance. |
||
74 | raw_ostream &operator<<(raw_ostream &OS, const SymbolLookupFlags &LookupFlags); |
||
75 | |||
76 | /// Render a SymbolLookupSet entry. |
||
77 | raw_ostream &operator<<(raw_ostream &OS, const SymbolLookupSet::value_type &KV); |
||
78 | |||
79 | /// Render a SymbolLookupSet. |
||
80 | raw_ostream &operator<<(raw_ostream &OS, const SymbolLookupSet &LookupSet); |
||
81 | |||
82 | /// Render a JITDylibSearchOrder. |
||
83 | raw_ostream &operator<<(raw_ostream &OS, |
||
84 | const JITDylibSearchOrder &SearchOrder); |
||
85 | |||
86 | /// Render a SymbolAliasMap. |
||
87 | raw_ostream &operator<<(raw_ostream &OS, const SymbolAliasMap &Aliases); |
||
88 | |||
89 | /// Render a SymbolState. |
||
90 | raw_ostream &operator<<(raw_ostream &OS, const SymbolState &S); |
||
91 | |||
92 | /// Render a LookupKind. |
||
93 | raw_ostream &operator<<(raw_ostream &OS, const LookupKind &K); |
||
94 | |||
95 | /// Dump a SymbolStringPool. Useful for debugging dangling-pointer crashes. |
||
96 | raw_ostream &operator<<(raw_ostream &OS, const SymbolStringPool &SSP); |
||
97 | |||
98 | /// A function object that can be used as an ObjectTransformLayer transform |
||
99 | /// to dump object files to disk at a specified path. |
||
100 | class DumpObjects { |
||
101 | public: |
||
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 | |||
121 | private: |
||
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 |