diff options
author | Kevin Frei <kevinfrei@users.noreply.github.com> | 2024-02-01 08:47:11 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-01 08:47:11 -0800 |
commit | bfdd78233fba4623366bbef5631ff0ebab29c42e (patch) | |
tree | 89004a2fbf26c9095d34a1133b7b50dfe17cf5bb /llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp | |
parent | 09b4649ea5cefc4f93d9c936d38863df5c6568ed (diff) | |
download | llvm-bfdd78233fba4623366bbef5631ff0ebab29c42e.zip llvm-bfdd78233fba4623366bbef5631ff0ebab29c42e.tar.gz llvm-bfdd78233fba4623366bbef5631ff0ebab29c42e.tar.bz2 |
Aggregate errors from llvm-dwarfdump --verify (#79648)
The amount and format of output from `llvm-dwarfdump --verify` makes it
quite difficult to know if a change to a tool that produces or modifies
DWARF is causing new problems, or is fixing existing problems. This diff
adds a categorized summary of issues found by the DWARF verifier, on by
default, at the bottom of the error output.
The change includes a new `--error-display` option with 4 settings:
* `--error-display=quiet`: Only display if errors occurred, but no
details or summary are printed.
* `--error-display=summary`: Only display the aggregated summary of
errors with no error detail.
* `--error-display=details`: Only display the detailed error messages
with no summary (previous behavior)
* `--error-display=full`: Display both the detailed error messages and
the aggregated summary of errors (the default)
I changed a handful of tests that were failing due to new output, adding
the flag to use the old behavior for all but a couple. For those two I
added the new aggregated output to the expected output of the test.
The `OutputCategoryAggregator` is a pretty simple little class that
@clayborg suggested to allow code to only be run to dump detail if it's
enabled, while still collating counts of the category. Knowing that the
lambda passed in is only conditionally executed is pretty important
(handling errors has to be done *outside* the lambda). I'm happy to move
this somewhere else (and change/improve it) to be more broadly useful if
folks would like.
---------
Co-authored-by: Kevin Frei <freik@meta.com>
Diffstat (limited to 'llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp')
-rw-r--r-- | llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp index 941df4e..559e7a6 100644 --- a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -124,6 +124,14 @@ public: namespace { using namespace cl; +enum ErrorDetailLevel { + OnlyDetailsNoSummary, + NoDetailsOnlySummary, + NoDetailsOrSummary, + BothDetailsAndSummary, + Unspecified +}; + OptionCategory DwarfDumpCategory("Specific Options"); static list<std::string> InputFilenames(Positional, desc("<input object files or .dSYM bundles>"), @@ -276,6 +284,17 @@ static cl::opt<bool> cat(DwarfDumpCategory)); static opt<bool> Verify("verify", desc("Verify the DWARF debug info."), cat(DwarfDumpCategory)); +static opt<ErrorDetailLevel> ErrorDetails( + "error-display", init(Unspecified), + values(clEnumValN(NoDetailsOrSummary, "quiet", + "Only display whether errors occurred."), + clEnumValN(NoDetailsOnlySummary, "summary", + "Display only a summary of the errors found."), + clEnumValN(OnlyDetailsNoSummary, "details", + "Display each error in detail but no summary."), + clEnumValN(BothDetailsAndSummary, "full", + "Display each error as well as a summary. [default]")), + cat(DwarfDumpCategory)); static opt<bool> Quiet("quiet", desc("Use with -verify to not emit to STDOUT."), cat(DwarfDumpCategory)); static opt<bool> DumpUUID("uuid", desc("Show the UUID for each architecture."), @@ -326,7 +345,10 @@ static DIDumpOptions getDumpOpts(DWARFContext &C) { DumpOpts.RecoverableErrorHandler = C.getRecoverableErrorHandler(); // In -verify mode, print DIEs without children in error messages. if (Verify) { - DumpOpts.Verbose = true; + DumpOpts.Verbose = ErrorDetails != NoDetailsOnlySummary && + ErrorDetails != NoDetailsOrSummary; + DumpOpts.ShowAggregateErrors = ErrorDetails != OnlyDetailsNoSummary && + ErrorDetails != NoDetailsOnlySummary; return DumpOpts.noImplicitRecursion(); } return DumpOpts; @@ -812,6 +834,8 @@ int main(int argc, char **argv) { "-verbose is currently not supported"; return 1; } + if (!Verify && ErrorDetails != Unspecified) + WithColor::warning() << "-error-detail has no affect without -verify"; std::error_code EC; ToolOutputFile OutputFile(OutputFilename, EC, sys::fs::OF_TextWithCRLF); |