aboutsummaryrefslogtreecommitdiff
path: root/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h')
-rw-r--r--llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h145
1 files changed, 123 insertions, 22 deletions
diff --git a/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h b/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h
index 3d7e06992182..4bb11bf62593 100644
--- a/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h
+++ b/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h
@@ -14,46 +14,147 @@
#ifndef LLVM_DEBUGINFO_SYMBOLIZE_DIPRINTER_H
#define LLVM_DEBUGINFO_SYMBOLIZE_DIPRINTER_H
-#include <string>
+#include "llvm/ADT/Optional.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/JSON.h"
+#include <memory>
+#include <vector>
namespace llvm {
struct DILineInfo;
class DIInliningInfo;
struct DIGlobal;
struct DILocal;
+class ErrorInfoBase;
class raw_ostream;
namespace symbolize {
+class SourceCode;
+
+struct Request {
+ StringRef ModuleName;
+ Optional<uint64_t> Address;
+};
+
class DIPrinter {
public:
- enum class OutputStyle { LLVM, GNU };
+ DIPrinter() {}
+ virtual ~DIPrinter() {}
-private:
- raw_ostream &OS;
- bool PrintFunctionNames;
- bool PrintPretty;
- int PrintSourceContext;
+ virtual void print(const Request &Request, const DILineInfo &Info) = 0;
+ virtual void print(const Request &Request, const DIInliningInfo &Info) = 0;
+ virtual void print(const Request &Request, const DIGlobal &Global) = 0;
+ virtual void print(const Request &Request,
+ const std::vector<DILocal> &Locals) = 0;
+
+ virtual void printInvalidCommand(const Request &Request,
+ StringRef Command) = 0;
+
+ virtual bool printError(const Request &Request,
+ const ErrorInfoBase &ErrorInfo,
+ StringRef ErrorBanner) = 0;
+
+ virtual void listBegin() = 0;
+ virtual void listEnd() = 0;
+};
+
+struct PrinterConfig {
+ bool PrintAddress;
+ bool PrintFunctions;
+ bool Pretty;
bool Verbose;
- OutputStyle Style;
+ int SourceContextLines;
+};
+
+class PlainPrinterBase : public DIPrinter {
+protected:
+ raw_ostream &OS;
+ raw_ostream &ES;
+ PrinterConfig Config;
void print(const DILineInfo &Info, bool Inlined);
- void printContext(const std::string &FileName, int64_t Line);
+ void printFunctionName(StringRef FunctionName, bool Inlined);
+ virtual void printSimpleLocation(StringRef Filename,
+ const DILineInfo &Info) = 0;
+ void printContext(SourceCode SourceCode);
+ void printVerbose(StringRef Filename, const DILineInfo &Info);
+ virtual void printStartAddress(const DILineInfo &Info) {}
+ virtual void printFooter() {}
+
+private:
+ void printHeader(uint64_t Address);
+
+public:
+ PlainPrinterBase(raw_ostream &OS, raw_ostream &ES, PrinterConfig &Config)
+ : DIPrinter(), OS(OS), ES(ES), Config(Config) {}
+
+ void print(const Request &Request, const DILineInfo &Info) override;
+ void print(const Request &Request, const DIInliningInfo &Info) override;
+ void print(const Request &Request, const DIGlobal &Global) override;
+ void print(const Request &Request,
+ const std::vector<DILocal> &Locals) override;
+
+ void printInvalidCommand(const Request &Request, StringRef Command) override;
+
+ bool printError(const Request &Request, const ErrorInfoBase &ErrorInfo,
+ StringRef ErrorBanner) override;
+
+ void listBegin() override {}
+ void listEnd() override {}
+};
+
+class LLVMPrinter : public PlainPrinterBase {
+private:
+ void printSimpleLocation(StringRef Filename, const DILineInfo &Info) override;
+ void printStartAddress(const DILineInfo &Info) override;
+ void printFooter() override;
+
+public:
+ LLVMPrinter(raw_ostream &OS, raw_ostream &ES, PrinterConfig &Config)
+ : PlainPrinterBase(OS, ES, Config) {}
+};
+
+class GNUPrinter : public PlainPrinterBase {
+private:
+ void printSimpleLocation(StringRef Filename, const DILineInfo &Info) override;
+
+public:
+ GNUPrinter(raw_ostream &OS, raw_ostream &ES, PrinterConfig &Config)
+ : PlainPrinterBase(OS, ES, Config) {}
+};
+
+class JSONPrinter : public DIPrinter {
+private:
+ raw_ostream &OS;
+ PrinterConfig Config;
+ std::unique_ptr<json::Array> ObjectList;
+
+ void printJSON(const json::Value &V) {
+ json::OStream JOS(OS, Config.Pretty ? 2 : 0);
+ JOS.value(V);
+ OS << '\n';
+ }
public:
- DIPrinter(raw_ostream &OS, bool PrintFunctionNames = true,
- bool PrintPretty = false, int PrintSourceContext = 0,
- bool Verbose = false, OutputStyle Style = OutputStyle::LLVM)
- : OS(OS), PrintFunctionNames(PrintFunctionNames),
- PrintPretty(PrintPretty), PrintSourceContext(PrintSourceContext),
- Verbose(Verbose), Style(Style) {}
-
- DIPrinter &operator<<(const DILineInfo &Info);
- DIPrinter &operator<<(const DIInliningInfo &Info);
- DIPrinter &operator<<(const DIGlobal &Global);
- DIPrinter &operator<<(const DILocal &Local);
+ JSONPrinter(raw_ostream &OS, PrinterConfig &Config)
+ : DIPrinter(), OS(OS), Config(Config) {}
+
+ void print(const Request &Request, const DILineInfo &Info) override;
+ void print(const Request &Request, const DIInliningInfo &Info) override;
+ void print(const Request &Request, const DIGlobal &Global) override;
+ void print(const Request &Request,
+ const std::vector<DILocal> &Locals) override;
+
+ void printInvalidCommand(const Request &Request, StringRef Command) override;
+
+ bool printError(const Request &Request, const ErrorInfoBase &ErrorInfo,
+ StringRef ErrorBanner) override;
+
+ void listBegin() override;
+ void listEnd() override;
};
-}
-}
+} // namespace symbolize
+} // namespace llvm
#endif