[llvm] [llvm-readobj] Emit valid JSON for Verdef Predecessors (PR #200069)

Shawn Zhong via llvm-commits llvm-commits at lists.llvm.org
Wed May 27 14:54:14 PDT 2026


https://github.com/ShawnZhong created https://github.com/llvm/llvm-project/pull/200069

Previously, `llvm-readobj` generated invalid JSON with Verdef Predecessors: 

```
yaml2obj llvm/test/tools/llvm-readobj/ELF/versioninfo.test 
| llvm-readobj --elf-output-style=JSON --pretty-print -V - 
| grep Predecessors
```

```
          "Name": "VERSION1"Predecessors: []
          "Name": "VERSION1"Predecessors: []
          "Name": "VERSION1"Predecessors: []
          "Name": "VERSION1"Predecessors: []
          "Name": "VERSION1"Predecessors: []
          "Name": "VERSION2"Predecessors: [VERSION1, VERSION3]
```

>From 3442f43667b8c3be66fe6adf96aeb377152a9ebc Mon Sep 17 00:00:00 2001
From: ShawnZhong <github at shawnzhong.com>
Date: Wed, 27 May 2026 16:36:45 -0500
Subject: [PATCH 1/2] [llvm-readobj][test] Add JSON test for Verdef
 Predecessors

---
 llvm/test/tools/llvm-readobj/ELF/versioninfo.test | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/llvm/test/tools/llvm-readobj/ELF/versioninfo.test b/llvm/test/tools/llvm-readobj/ELF/versioninfo.test
index 842d6a275b505..e4c1f50bc7da2 100644
--- a/llvm/test/tools/llvm-readobj/ELF/versioninfo.test
+++ b/llvm/test/tools/llvm-readobj/ELF/versioninfo.test
@@ -5,6 +5,8 @@
 # RUN: yaml2obj %s --docnum=1 -o %t1
 # RUN: llvm-readobj -V %t1 | FileCheck %s --check-prefix=LLVM
 # RUN: llvm-readelf -V %t1 | FileCheck %s --check-prefix=GNU
+# RUN: llvm-readobj --elf-output-style=JSON --pretty-print -V %t1 \
+# RUN:   | FileCheck %s --check-prefix=JSON
 
 --- !ELF
 FileHeader:
@@ -273,3 +275,15 @@ DynamicSymbols:
 # GNU-NEXT:    0x0050:   Name: v2  Flags: <unknown>  Version: 5
 # GNU-NEXT:    0x0060: Version: 1  File: verneed2.so.0  Cnt: 1
 # GNU-NEXT:    0x0070:   Name: v3  Flags: none  Version: 6
+
+## --elf-output-style=JSON must emit well-formed JSON for Predecessors.
+# JSON:      "VersionDefinitions": [
+# JSON:        "Definition": {
+# JSON:          "Name": "VERSION1",
+# JSON-NEXT:     "Predecessors": []
+# JSON:        "Definition": {
+# JSON:          "Name": "VERSION2",
+# JSON-NEXT:     "Predecessors": [
+# JSON-NEXT:       "VERSION1",
+# JSON-NEXT:       "VERSION3"
+# JSON-NEXT:     ]

>From 49d1bae898a623a08c14ed16bec0c9b266dd9fec Mon Sep 17 00:00:00 2001
From: ShawnZhong <github at shawnzhong.com>
Date: Wed, 27 May 2026 16:37:00 -0500
Subject: [PATCH 2/2] [llvm-readobj] Emit valid JSON for Verdef Predecessors

---
 llvm/tools/llvm-readobj/ELFDumper.cpp | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 0169e7fb0fff8..9b2c9f12f98dd 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -8074,9 +8074,10 @@ void LLVMELFDumper<ELFT>::printVersionDefinitionSection(const Elf_Shdr *Sec) {
     W.printNumber("Index", D.Ndx);
     W.printNumber("Hash", D.Hash);
     W.printString("Name", D.Name);
-    W.printList(
-        "Predecessors", D.AuxV,
-        [](raw_ostream &OS, const VerdAux &Aux) { OS << Aux.Name.c_str(); });
+    std::vector<std::string> Predecessors;
+    for (const VerdAux &Aux : D.AuxV)
+      Predecessors.push_back(Aux.Name);
+    W.printList("Predecessors", Predecessors);
   }
 }
 



More information about the llvm-commits mailing list