diff options
author | Alex Orlov <aorlov@accesssoftek.com> | 2021-05-11 13:10:54 +0400 |
---|---|---|
committer | Alex Orlov <aorlov@accesssoftek.com> | 2021-05-11 13:10:54 +0400 |
commit | 05d1ae4e18fa565ea522e02d2497ec68d1dbdd80 (patch) | |
tree | 7d0f8d57f8b037cab75738b9d935c899c247d6af /llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | |
parent | 33399405f4423429ec92c98a116c9ddc486864ec (diff) | |
download | llvm-05d1ae4e18fa565ea522e02d2497ec68d1dbdd80.zip llvm-05d1ae4e18fa565ea522e02d2497ec68d1dbdd80.tar.gz llvm-05d1ae4e18fa565ea522e02d2497ec68d1dbdd80.tar.bz2 |
* Add support for JSON output style to llvm-symbolizer
This patch adds JSON output style to llvm-symbolizer to better support CLI automation by providing a machine readable output.
Reviewed By: jhenderson
Differential Revision: https://reviews.llvm.org/D96883
Diffstat (limited to 'llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp')
-rw-r--r-- | llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp index da84a57..cc816c0 100644 --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -91,7 +91,7 @@ static void print(const Request &Request, Expected<T> &ResOrErr, Printer.print(Request, T()); } -enum class OutputStyle { LLVM, GNU }; +enum class OutputStyle { LLVM, GNU, JSON }; enum class Command { Code, @@ -154,10 +154,7 @@ static void symbolizeInput(const opt::InputArgList &Args, uint64_t AdjustVMA, uint64_t Offset = 0; if (!parseCommand(Args.getLastArgValue(OPT_obj_EQ), IsAddr2Line, StringRef(InputString), Cmd, ModuleName, Offset)) { - Printer.printInvalidCommand( - {ModuleName, Offset}, - StringError(InputString, - std::make_error_code(std::errc::invalid_argument))); + Printer.printInvalidCommand({ModuleName, None}, InputString); return; } @@ -320,14 +317,20 @@ int main(int argc, char **argv) { auto Style = IsAddr2Line ? OutputStyle::GNU : OutputStyle::LLVM; if (const opt::Arg *A = Args.getLastArg(OPT_output_style_EQ)) { - Style = strcmp(A->getValue(), "GNU") == 0 ? OutputStyle::GNU - : OutputStyle::LLVM; + if (strcmp(A->getValue(), "GNU") == 0) + Style = OutputStyle::GNU; + else if (strcmp(A->getValue(), "JSON") == 0) + Style = OutputStyle::JSON; + else + Style = OutputStyle::LLVM; } LLVMSymbolizer Symbolizer(Opts); std::unique_ptr<DIPrinter> Printer; if (Style == OutputStyle::GNU) Printer = std::make_unique<GNUPrinter>(outs(), errs(), Config); + else if (Style == OutputStyle::JSON) + Printer = std::make_unique<JSONPrinter>(outs(), Config); else Printer = std::make_unique<LLVMPrinter>(outs(), errs(), Config); @@ -346,9 +349,11 @@ int main(int argc, char **argv) { outs().flush(); } } else { + Printer->listBegin(); for (StringRef Address : InputAddresses) symbolizeInput(Args, AdjustVMA, IsAddr2Line, Style, Address, Symbolizer, *Printer); + Printer->listEnd(); } return 0; |