LLVM 22.0.0git
DIPrinter.h
Go to the documentation of this file.
1//===- llvm/DebugInfo/Symbolize/DIPrinter.h ---------------------*- 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// This file declares the DIPrinter class, which is responsible for printing
10// structures defined in DebugInfo/DIContext.h
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_DEBUGINFO_SYMBOLIZE_DIPRINTER_H
15#define LLVM_DEBUGINFO_SYMBOLIZE_DIPRINTER_H
16
17#include "llvm/ADT/StringRef.h"
19#include "llvm/Support/JSON.h"
20#include <memory>
21#include <vector>
22
23namespace llvm {
24struct DILineInfo;
25class DIInliningInfo;
26struct DIGlobal;
27struct DILocal;
28class ErrorInfoBase;
29class raw_ostream;
30
31namespace symbolize {
32
33class SourceCode;
34
35struct Request {
37 std::optional<uint64_t> Address;
39};
40
41class DIPrinter {
42public:
43 DIPrinter() = default;
44 virtual ~DIPrinter() = default;
45
46 virtual void print(const Request &Request, const DILineInfo &Info) = 0;
47 virtual void print(const Request &Request, const DIInliningInfo &Info) = 0;
48 virtual void print(const Request &Request, const DIGlobal &Global) = 0;
49 virtual void print(const Request &Request,
50 const std::vector<DILocal> &Locals) = 0;
51 virtual void print(const Request &Request,
52 const std::vector<DILineInfo> &Locations) = 0;
53
54 virtual bool printError(const Request &Request,
55 const ErrorInfoBase &ErrorInfo) = 0;
56
57 virtual void listBegin() = 0;
58 virtual void listEnd() = 0;
59};
60
64 bool Pretty;
65 bool Verbose;
67};
68
69using ErrorHandler = std::function<void(const ErrorInfoBase &, StringRef)>;
70
72protected:
76
77 void print(const DILineInfo &Info, bool Inlined);
78 void printFunctionName(StringRef FunctionName, bool Inlined);
79 virtual void printSimpleLocation(StringRef Filename,
80 const DILineInfo &Info) = 0;
81 void printContext(SourceCode SourceCode);
82 void printVerbose(StringRef Filename, const DILineInfo &Info);
83 virtual void printStartAddress(const DILineInfo &Info) {}
84 virtual void printFooter() {}
85
86private:
87 void printHeader(std::optional<uint64_t> Address);
88
89public:
91 : OS(OS), ErrHandler(EH), Config(Config) {}
92
93 void print(const Request &Request, const DILineInfo &Info) override;
94 void print(const Request &Request, const DIInliningInfo &Info) override;
95 void print(const Request &Request, const DIGlobal &Global) override;
96 void print(const Request &Request,
97 const std::vector<DILocal> &Locals) override;
98 void print(const Request &Request,
99 const std::vector<DILineInfo> &Locations) override;
100
101 bool printError(const Request &Request,
102 const ErrorInfoBase &ErrorInfo) override;
103
104 void listBegin() override {}
105 void listEnd() override {}
106};
107
109private:
110 void printSimpleLocation(StringRef Filename, const DILineInfo &Info) override;
111 void printStartAddress(const DILineInfo &Info) override;
112 void printFooter() override;
113
114public:
116 : PlainPrinterBase(OS, EH, Config) {}
117};
118
120private:
121 void printSimpleLocation(StringRef Filename, const DILineInfo &Info) override;
122
123public:
125 : PlainPrinterBase(OS, EH, Config) {}
126};
127
129private:
132 std::unique_ptr<json::Array> ObjectList;
133
134 void printJSON(const json::Value &V) {
135 json::OStream JOS(OS, Config.Pretty ? 2 : 0);
136 JOS.value(V);
137 OS << '\n';
138 }
139
140public:
142 : OS(OS), Config(Config) {}
143
144 void print(const Request &Request, const DILineInfo &Info) override;
145 void print(const Request &Request, const DIInliningInfo &Info) override;
146 void print(const Request &Request, const DIGlobal &Global) override;
147 void print(const Request &Request,
148 const std::vector<DILocal> &Locals) override;
149 void print(const Request &Request,
150 const std::vector<DILineInfo> &Locations) override;
151
152 bool printError(const Request &Request,
153 const ErrorInfoBase &ErrorInfo) override;
154
155 void listBegin() override;
156 void listEnd() override;
157};
158} // namespace symbolize
159} // namespace llvm
160
161#endif
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
#define LLVM_ABI
Definition: Compiler.h:213
RelaxConfig Config
Definition: ELF_riscv.cpp:506
This file supports working with JSON data.
raw_pwrite_stream & OS
A format-neutral container for inlined code description.
Definition: DIContext.h:94
Base class for error info classes.
Definition: Error.h:44
Base class for user error types.
Definition: Error.h:354
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
json::OStream allows writing well-formed JSON without materializing all structures as json::Value ahe...
Definition: JSON.h:996
LLVM_ABI void value(const Value &V)
Emit a self-contained value (number, string, vector<string> etc).
Definition: JSON.cpp:756
A Value is an JSON value of unknown type.
Definition: JSON.h:288
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
virtual void print(const Request &Request, const std::vector< DILocal > &Locals)=0
virtual void listBegin()=0
virtual void print(const Request &Request, const DIGlobal &Global)=0
virtual void listEnd()=0
virtual void print(const Request &Request, const DILineInfo &Info)=0
virtual ~DIPrinter()=default
virtual void print(const Request &Request, const DIInliningInfo &Info)=0
virtual bool printError(const Request &Request, const ErrorInfoBase &ErrorInfo)=0
virtual void print(const Request &Request, const std::vector< DILineInfo > &Locations)=0
GNUPrinter(raw_ostream &OS, ErrorHandler EH, PrinterConfig &Config)
Definition: DIPrinter.h:124
JSONPrinter(raw_ostream &OS, PrinterConfig &Config)
Definition: DIPrinter.h:141
LLVMPrinter(raw_ostream &OS, ErrorHandler EH, PrinterConfig &Config)
Definition: DIPrinter.h:115
virtual void printStartAddress(const DILineInfo &Info)
Definition: DIPrinter.h:83
PlainPrinterBase(raw_ostream &OS, ErrorHandler EH, PrinterConfig &Config)
Definition: DIPrinter.h:90
virtual void printSimpleLocation(StringRef Filename, const DILineInfo &Info)=0
std::function< void(const ErrorInfoBase &, StringRef)> ErrorHandler
Definition: DIPrinter.h:69
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Global
Append to llvm.global_dtors.
Container for description of a global variable.
Definition: DIContext.h:120
A format-neutral container for source line information.
Definition: DIContext.h:32
std::optional< uint64_t > Address
Definition: DIPrinter.h:37