aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
diff options
context:
space:
mode:
authorAlex Orlov <aorlov@accesssoftek.com>2021-05-11 13:10:54 +0400
committerAlex Orlov <aorlov@accesssoftek.com>2021-05-11 13:10:54 +0400
commit05d1ae4e18fa565ea522e02d2497ec68d1dbdd80 (patch)
tree7d0f8d57f8b037cab75738b9d935c899c247d6af /llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
parent33399405f4423429ec92c98a116c9ddc486864ec (diff)
downloadllvm-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.cpp19
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;