From 1a475f7de359eaf0a5204b7c0ac68d1d0ec07ff1 Mon Sep 17 00:00:00 2001 From: Kevin Frei Date: Wed, 14 Feb 2024 09:03:47 -0800 Subject: [PATCH 1/5] GSym aggregated output to JSON file --- llvm/tools/llvm-gsymutil/Opts.td | 3 +++ llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp | 23 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/llvm/tools/llvm-gsymutil/Opts.td b/llvm/tools/llvm-gsymutil/Opts.td index 740291479f932..00e81a9f85aa7 100644 --- a/llvm/tools/llvm-gsymutil/Opts.td +++ b/llvm/tools/llvm-gsymutil/Opts.td @@ -35,3 +35,6 @@ defm address : Eq<"address", "Lookup an address in a GSYM file">; def addresses_from_stdin : FF<"addresses-from-stdin", "Lookup addresses in a GSYM file that are read from stdin\nEach input line is expected to be of the following format: ">; +defm aggregate_error_file : + Eq<"aggregate-error-file", + "Output any aggregated errors into the file specified in JSON format.">; diff --git a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp index 2de9c76fd68c0..1068ac4e39b26 100644 --- a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp +++ b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/DebugInfo/DIContext.h" #include "llvm/DebugInfo/DWARF/DWARFContext.h" #include "llvm/Object/Archive.h" @@ -87,6 +88,7 @@ static std::vector InputFilenames; static std::string ConvertFilename; static std::vector ArchFilters; static std::string OutputFilename; +static std::string AggregateJsonFile; static bool Verify; static unsigned NumThreads; static uint64_t SegmentSize; @@ -138,6 +140,9 @@ static void parseArgs(int argc, char **argv) { if (const llvm::opt::Arg *A = Args.getLastArg(OPT_out_file_EQ)) OutputFilename = A->getValue(); + if (const llvm::opt::Arg *A = Args.getLastArg(OPT_aggregate_error_file_EQ)) + AggregateJsonFile = A->getValue(); + Verify = Args.hasArg(OPT_verify); if (const llvm::opt::Arg *A = Args.getLastArg(OPT_num_threads_EQ)) { @@ -515,10 +520,28 @@ int llvm_gsymutil_main(int argc, char **argv, const llvm::ToolContext &) { // Call error() if we have an error and it will exit with a status of 1 if (auto Err = convertFileToGSYM(Aggregation)) error("DWARF conversion failed: ", std::move(Err)); + // Report the errors from aggregator: Aggregation.EnumerateResults([&](StringRef category, unsigned count) { OS << category << " occurred " << count << " time(s)\n"; }); + if (!AggregateJsonFile.empty()) { + std::error_code EC; + raw_fd_ostream JsonStream(AggregateJsonFile, EC, + sys::fs::OF_Text | sys::fs::OF_None); + if (EC) { + OS << "error opening aggregate error json file '" << AggregateJsonFile + << "' for writing: " << EC.message() << '\n'; + return 1; + } + JsonStream << "{\"errors\":[\n"; + Aggregation.EnumerateResults([&](StringRef category, unsigned count) { + JsonStream << "\"category\":\""; + llvm::printEscapedString(category, JsonStream); + JsonStream << "\",\"count\":" << count; + }); + JsonStream << "]}\n"; + } return 0; } From 445b89fb9a22bf125d579121b196c83a81667ef4 Mon Sep 17 00:00:00 2001 From: Kevin Frei Date: Wed, 14 Feb 2024 09:52:34 -0800 Subject: [PATCH 2/5] Fixed JSON output to be...JSON. --- llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp index 1068ac4e39b26..608c75e7e2fef 100644 --- a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp +++ b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp @@ -527,20 +527,23 @@ int llvm_gsymutil_main(int argc, char **argv, const llvm::ToolContext &) { }); if (!AggregateJsonFile.empty()) { std::error_code EC; - raw_fd_ostream JsonStream(AggregateJsonFile, EC, - sys::fs::OF_Text | sys::fs::OF_None); + raw_fd_ostream JsonStream(AggregateJsonFile, EC, sys::fs::OF_Text); if (EC) { OS << "error opening aggregate error json file '" << AggregateJsonFile << "' for writing: " << EC.message() << '\n'; return 1; } JsonStream << "{\"errors\":[\n"; + bool prev = false; Aggregation.EnumerateResults([&](StringRef category, unsigned count) { - JsonStream << "\"category\":\""; + if (prev) + JsonStream << ",\n"; + JsonStream << "{\"category\":\""; llvm::printEscapedString(category, JsonStream); - JsonStream << "\",\"count\":" << count; + JsonStream << "\",\"count\":" << count << "}"; + prev = true; }); - JsonStream << "]}\n"; + JsonStream << "\n]}\n"; } return 0; } From bbe8f357688653cac68f64079a7be5d554d1f148 Mon Sep 17 00:00:00 2001 From: Kevin Frei Date: Wed, 14 Feb 2024 16:06:04 -0800 Subject: [PATCH 3/5] Updated with Clayborg's feedback --- llvm/tools/llvm-gsymutil/Opts.td | 6 ++--- llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp | 31 +++++++++++----------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/llvm/tools/llvm-gsymutil/Opts.td b/llvm/tools/llvm-gsymutil/Opts.td index 00e81a9f85aa7..3aabc8029ccbe 100644 --- a/llvm/tools/llvm-gsymutil/Opts.td +++ b/llvm/tools/llvm-gsymutil/Opts.td @@ -35,6 +35,6 @@ defm address : Eq<"address", "Lookup an address in a GSYM file">; def addresses_from_stdin : FF<"addresses-from-stdin", "Lookup addresses in a GSYM file that are read from stdin\nEach input line is expected to be of the following format: ">; -defm aggregate_error_file : - Eq<"aggregate-error-file", - "Output any aggregated errors into the file specified in JSON format.">; +defm json_summary_file : + Eq<"json-summary-file", + "Output a categorized summary of errors into the JSON file specified.">; diff --git a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp index 608c75e7e2fef..727d578bcad5e 100644 --- a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp +++ b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp @@ -19,6 +19,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/Format.h" +#include "llvm/Support/JSON.h" #include "llvm/Support/LLVMDriver.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" @@ -88,7 +89,7 @@ static std::vector InputFilenames; static std::string ConvertFilename; static std::vector ArchFilters; static std::string OutputFilename; -static std::string AggregateJsonFile; +static std::string JsonSummaryFile; static bool Verify; static unsigned NumThreads; static uint64_t SegmentSize; @@ -140,8 +141,8 @@ static void parseArgs(int argc, char **argv) { if (const llvm::opt::Arg *A = Args.getLastArg(OPT_out_file_EQ)) OutputFilename = A->getValue(); - if (const llvm::opt::Arg *A = Args.getLastArg(OPT_aggregate_error_file_EQ)) - AggregateJsonFile = A->getValue(); + if (const llvm::opt::Arg *A = Args.getLastArg(OPT_json_summary_file_EQ)) + JsonSummaryFile = A->getValue(); Verify = Args.hasArg(OPT_verify); @@ -525,25 +526,25 @@ int llvm_gsymutil_main(int argc, char **argv, const llvm::ToolContext &) { Aggregation.EnumerateResults([&](StringRef category, unsigned count) { OS << category << " occurred " << count << " time(s)\n"; }); - if (!AggregateJsonFile.empty()) { + if (!JsonSummaryFile.empty()) { std::error_code EC; - raw_fd_ostream JsonStream(AggregateJsonFile, EC, sys::fs::OF_Text); + raw_fd_ostream JsonStream(JsonSummaryFile, EC, sys::fs::OF_Text); if (EC) { - OS << "error opening aggregate error json file '" << AggregateJsonFile + OS << "error opening aggregate error json file '" << JsonSummaryFile << "' for writing: " << EC.message() << '\n'; return 1; } - JsonStream << "{\"errors\":[\n"; - bool prev = false; + + llvm::json::Object Categories; Aggregation.EnumerateResults([&](StringRef category, unsigned count) { - if (prev) - JsonStream << ",\n"; - JsonStream << "{\"category\":\""; - llvm::printEscapedString(category, JsonStream); - JsonStream << "\",\"count\":" << count << "}"; - prev = true; + llvm::json::Object Val; + Val.try_emplace("count", count); + Categories.try_emplace(category, std::move(Val)); }); - JsonStream << "\n]}\n"; + llvm::json::Object RootNode; + RootNode.try_emplace("error-categories", std::move(Categories)); + + JsonStream << llvm::json::Value(std::move(RootNode)); } return 0; } From fd624a20ffe7700bca6325d9bdf68caafd7994ee Mon Sep 17 00:00:00 2001 From: Kevin Frei Date: Thu, 15 Feb 2024 09:07:58 -0800 Subject: [PATCH 4/5] Removed a header leftover from earlier draft --- llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp index 727d578bcad5e..2256d7e9f2866 100644 --- a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp +++ b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp @@ -7,7 +7,6 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/STLExtras.h" -#include "llvm/ADT/StringExtras.h" #include "llvm/DebugInfo/DIContext.h" #include "llvm/DebugInfo/DWARF/DWARFContext.h" #include "llvm/Object/Archive.h" From d203cd5c7b7cfe4f8ee6e1cf686c6ad5ea351bec Mon Sep 17 00:00:00 2001 From: Kevin Frei Date: Thu, 15 Feb 2024 13:38:38 -0800 Subject: [PATCH 5/5] Updated with Clayborg's feedback from the dwarfdump changes --- llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp index 2256d7e9f2866..00a24cdb33fe1 100644 --- a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp +++ b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp @@ -535,13 +535,16 @@ int llvm_gsymutil_main(int argc, char **argv, const llvm::ToolContext &) { } llvm::json::Object Categories; - Aggregation.EnumerateResults([&](StringRef category, unsigned count) { + uint64_t ErrorCount = 0; + Aggregation.EnumerateResults([&](StringRef Category, unsigned Count) { llvm::json::Object Val; - Val.try_emplace("count", count); - Categories.try_emplace(category, std::move(Val)); + Val.try_emplace("count", Count); + Categories.try_emplace(Category, std::move(Val)); + ErrorCount += Count; }); llvm::json::Object RootNode; RootNode.try_emplace("error-categories", std::move(Categories)); + RootNode.try_emplace("error-count", ErrorCount); JsonStream << llvm::json::Value(std::move(RootNode)); }