[llvm-readobj] Improve JSON output
authorPaul Kirth <paulkirth@google.com>
Thu, 6 Oct 2022 23:13:26 +0000 (23:13 +0000)
committerPaul Kirth <paulkirth@google.com>
Mon, 17 Oct 2022 16:42:57 +0000 (16:42 +0000)
The current implementation outputs JSON in the following way:

[{'<filename>':{'FileSummary':{},...}}]

Using the filename as a key makes processing the JSON data awkward, and
should be avoided. This patch removes that outer key, since the
'FileSummary' data also includes a 'File' field, and so we lose no data.

Reviewed By: jhenderson, leonardchan

Differential Revision: https://reviews.llvm.org/D134843

llvm/docs/ReleaseNotes.rst
llvm/test/tools/llvm-readobj/ELF/file-summary-json.test
llvm/test/tools/llvm-readobj/ELF/pretty-print.test
llvm/tools/llvm-readobj/ELFDumper.cpp

index 1c1d5d5..95ccc06 100644 (file)
@@ -178,6 +178,14 @@ During this release ...
 Changes to the LLVM tools
 ---------------------------------
 
+* ``llvm-readobj --elf-output-style=JSON`` no longer prefixes each JSON object
+  with the file name. Previously, each object file's output looked like
+  ``"main.o":{"FileSummary":{"File":"main.o"},...}`` but is now
+  ``{"FileSummary":{"File":"main.o"},...}``. This allows each JSON object to be
+  parsed in the same way, since each object no longer has a unique key. Tools
+  that consume ``llvm-readobj``'s JSON output should update their parsers
+  accordingly.
+
 Changes to LLDB
 ---------------------------------
 
index 7af0a01..458b94e 100644 (file)
 
 #      SINGLE:[
 # SINGLE-NEXT:  {
-# SINGLE-NEXT:    "{{.*}}/obj": {
-# SINGLE-NEXT:      "FileSummary": {
-# SINGLE-NEXT:        "File": "{{.*}}/obj",
-# SINGLE-NEXT:        "Format": "elf64-x86-64",
-# SINGLE-NEXT:        "Arch": "x86_64",
-# SINGLE-NEXT:        "AddressSize": "64bit",
-# SINGLE-NEXT:        "LoadName": "<Not found>"
-# SINGLE-NEXT:      }
+# SINGLE-NEXT:    "FileSummary": {
+# SINGLE-NEXT:      "File": "{{.*}}/obj",
+# SINGLE-NEXT:      "Format": "elf64-x86-64",
+# SINGLE-NEXT:      "Arch": "x86_64",
+# SINGLE-NEXT:      "AddressSize": "64bit",
+# SINGLE-NEXT:      "LoadName": "<Not found>"
 # SINGLE-NEXT:    }
 # SINGLE-NEXT:  }
 # SINGLE-NEXT:]
 
 #      MULTI:[
 # MULTI-NEXT:  {
-# MULTI-NEXT:    "{{.*}}/obj": {
-# MULTI-NEXT:      "FileSummary": {
-# MULTI-NEXT:        "File": "{{.*}}/obj",
-# MULTI-NEXT:        "Format": "elf64-x86-64",
-# MULTI-NEXT:        "Arch": "x86_64",
-# MULTI-NEXT:        "AddressSize": "64bit",
-# MULTI-NEXT:        "LoadName": "<Not found>"
-# MULTI-NEXT:      }
+# MULTI-NEXT:    "FileSummary": {
+# MULTI-NEXT:      "File": "{{.*}}/obj",
+# MULTI-NEXT:      "Format": "elf64-x86-64",
+# MULTI-NEXT:      "Arch": "x86_64",
+# MULTI-NEXT:      "AddressSize": "64bit",
+# MULTI-NEXT:      "LoadName": "<Not found>"
 # MULTI-NEXT:    }
 # MULTI-NEXT:  },
 # MULTI-NEXT:  {
-# MULTI-NEXT:    "{{.*}}/obj": {
-# MULTI-NEXT:      "FileSummary": {
-# MULTI-NEXT:        "File": "{{.*}}/obj",
-# MULTI-NEXT:        "Format": "elf64-x86-64",
-# MULTI-NEXT:        "Arch": "x86_64",
-# MULTI-NEXT:        "AddressSize": "64bit",
-# MULTI-NEXT:        "LoadName": "<Not found>"
-# MULTI-NEXT:      }
+# MULTI-NEXT:    "FileSummary": {
+# MULTI-NEXT:      "File": "{{.*}}/obj",
+# MULTI-NEXT:      "Format": "elf64-x86-64",
+# MULTI-NEXT:      "Arch": "x86_64",
+# MULTI-NEXT:      "AddressSize": "64bit",
+# MULTI-NEXT:      "LoadName": "<Not found>"
 # MULTI-NEXT:    }
 # MULTI-NEXT:  }
 # MULTI-NEXT:]
 
 #      ARCH-SINGLE:[
 # ARCH-SINGLE-NEXT:  {
-# ARCH-SINGLE-NEXT:    "{{.*}}.archive-single(obj)": {
-# ARCH-SINGLE-NEXT:      "FileSummary": {
-# ARCH-SINGLE-NEXT:        "File": "{{.*}}.archive-single(obj)",
-# ARCH-SINGLE-NEXT:        "Format": "elf64-x86-64",
-# ARCH-SINGLE-NEXT:        "Arch": "x86_64",
-# ARCH-SINGLE-NEXT:        "AddressSize": "64bit",
-# ARCH-SINGLE-NEXT:        "LoadName": "<Not found>"
-# ARCH-SINGLE-NEXT:      }
+# ARCH-SINGLE-NEXT:    "FileSummary": {
+# ARCH-SINGLE-NEXT:      "File": "{{.*}}.archive-single(obj)",
+# ARCH-SINGLE-NEXT:      "Format": "elf64-x86-64",
+# ARCH-SINGLE-NEXT:      "Arch": "x86_64",
+# ARCH-SINGLE-NEXT:      "AddressSize": "64bit",
+# ARCH-SINGLE-NEXT:      "LoadName": "<Not found>"
 # ARCH-SINGLE-NEXT:    }
 # ARCH-SINGLE-NEXT:  }
 # ARCH-SINGLE-NEXT:]
 
 #      ARCH-MULTI:[
 # ARCH-MULTI-NEXT:  {
-# ARCH-MULTI-NEXT:    "{{.*}}.archive-multiple(obj)": {
-# ARCH-MULTI-NEXT:      "FileSummary": {
-# ARCH-MULTI-NEXT:        "File": "{{.*}}.archive-multiple(obj)",
-# ARCH-MULTI-NEXT:        "Format": "elf64-x86-64",
-# ARCH-MULTI-NEXT:        "Arch": "x86_64",
-# ARCH-MULTI-NEXT:        "AddressSize": "64bit",
-# ARCH-MULTI-NEXT:        "LoadName": "<Not found>"
-# ARCH-MULTI-NEXT:      }
+# ARCH-MULTI-NEXT:    "FileSummary": {
+# ARCH-MULTI-NEXT:      "File": "{{.*}}.archive-multiple(obj)",
+# ARCH-MULTI-NEXT:      "Format": "elf64-x86-64",
+# ARCH-MULTI-NEXT:      "Arch": "x86_64",
+# ARCH-MULTI-NEXT:      "AddressSize": "64bit",
+# ARCH-MULTI-NEXT:      "LoadName": "<Not found>"
 # ARCH-MULTI-NEXT:    }
 # ARCH-MULTI-NEXT:  },
 # ARCH-MULTI-NEXT:  {
-# ARCH-MULTI-NEXT:    "{{.*}}.archive-multiple(obj)": {
-# ARCH-MULTI-NEXT:      "FileSummary": {
-# ARCH-MULTI-NEXT:        "File": "{{.*}}.archive-multiple(obj)",
-# ARCH-MULTI-NEXT:        "Format": "elf64-x86-64",
-# ARCH-MULTI-NEXT:        "Arch": "x86_64",
-# ARCH-MULTI-NEXT:        "AddressSize": "64bit",
-# ARCH-MULTI-NEXT:        "LoadName": "<Not found>"
-# ARCH-MULTI-NEXT:      }
+# ARCH-MULTI-NEXT:    "FileSummary": {
+# ARCH-MULTI-NEXT:      "File": "{{.*}}.archive-multiple(obj)",
+# ARCH-MULTI-NEXT:      "Format": "elf64-x86-64",
+# ARCH-MULTI-NEXT:      "Arch": "x86_64",
+# ARCH-MULTI-NEXT:      "AddressSize": "64bit",
+# ARCH-MULTI-NEXT:      "LoadName": "<Not found>"
 # ARCH-MULTI-NEXT:    }
 # ARCH-MULTI-NEXT:  }
 # ARCH-MULTI-NEXT:]
index 0f27db3..f729bfd 100644 (file)
@@ -9,7 +9,6 @@
 
 #      NO-PRETTY:[
 # NO-PRETTY-SAME:{
-# NO-PRETTY-SAME:"{{.*}}.pretty":{
 # NO-PRETTY-SAME:"FileSummary":{
 # NO-PRETTY-SAME:"File":"{{.*}}.pretty",
 # NO-PRETTY-SAME:"Format":"elf64-x86-64",
@@ -18,7 +17,6 @@
 # NO-PRETTY-SAME:"LoadName":"<Not found>"
 # NO-PRETTY-SAME:}
 # NO-PRETTY-SAME:}
-# NO-PRETTY-SAME:}
 # NO-PRETTY-SAME:]
 
 ## Test JSON with pretty-print on.
 
 #      PRETTY:[
 # PRETTY-NEXT:  {
-# PRETTY-NEXT:    "{{.*}}.pretty": {
-# PRETTY-NEXT:      "FileSummary": {
-# PRETTY-NEXT:        "File": "{{.*}}.pretty",
-# PRETTY-NEXT:        "Format": "elf64-x86-64",
-# PRETTY-NEXT:        "Arch": "x86_64",
-# PRETTY-NEXT:        "AddressSize": "64bit",
-# PRETTY-NEXT:        "LoadName": "<Not found>"
-# PRETTY-NEXT:      }
+# PRETTY-NEXT:    "FileSummary": {
+# PRETTY-NEXT:      "File": "{{.*}}.pretty",
+# PRETTY-NEXT:      "Format": "elf64-x86-64",
+# PRETTY-NEXT:      "Arch": "x86_64",
+# PRETTY-NEXT:      "AddressSize": "64bit",
+# PRETTY-NEXT:      "LoadName": "<Not found>"
 # PRETTY-NEXT:    }
 # PRETTY-NEXT:  }
 # PRETTY-NEXT:]
index e6f87ed..7738efa 100644 (file)
@@ -7508,7 +7508,7 @@ template <class ELFT>
 void JSONELFDumper<ELFT>::printFileSummary(StringRef FileStr, ObjectFile &Obj,
                                            ArrayRef<std::string> InputFilenames,
                                            const Archive *A) {
-  FileScope = std::make_unique<DictScope>(this->W, FileStr);
+  FileScope = std::make_unique<DictScope>(this->W);
   DictScope D(this->W, "FileSummary");
   this->W.printString("File", FileStr);
   this->W.printString("Format", Obj.getFileFormatName());