diff options
Diffstat (limited to 'llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h')
-rw-r--r-- | llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h | 145 |
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 |