[llvm] [llvm-readobj] Add a reusable LLVMReadobjDriver library (PR #222917)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 11 03:56:31 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-binary-utilities
Author: Anutosh Bhat (anutosh491)
<details>
<summary>Changes</summary>
Please read: [RFC: Embeddable LLVM tool drivers for long-lived hosts](https://discourse.llvm.org/t/rfc-embeddable-llvm-tool-drivers-for-long-lived-hosts/91754)
This follows the same direction as the recent `LLVMLlcDriver` and `LLVMOptDriver` changes. See https://github.com/llvm/llvm-project/pull/221896 & https://github.com/llvm/llvm-project/pull/222840
`llvm-readobj` already exposes its implementation through `llvm_readobj_main`, but the implementation is currently compiled directly into the standalone executable. This patch moves that implementation into a reusable `LLVMReadobjDriver` library and keeps the generated command-line wrapper as a thin executable linked against it.
The immediate consumer is [WasmBolt](https://github.com/anutosh491/WasmBolt)(try [here](https://anutosh21.github.io/WasmBolt/)), which runs LLVM tools repeatedly inside one long-lived WebAssembly process. I have tested the real `llvm-readobj` implementation in the browser with file headers, sections, symbols and relocations on WebAssembly object files.
<img width="500" height="300" alt="image" src="https://github.com/user-attachments/assets/d93d15f2-6ceb-4af9-954a-d0d954421885" />
---
Full diff: https://github.com/llvm/llvm-project/pull/222917.diff
25 Files Affected:
- (modified) llvm/tools/llvm-readobj/CMakeLists.txt (+3-17)
- (renamed) llvm/tools/llvm-readobj/lib/ARMEHABIPrinter.h ()
- (renamed) llvm/tools/llvm-readobj/lib/ARMWinEHPrinter.cpp ()
- (renamed) llvm/tools/llvm-readobj/lib/ARMWinEHPrinter.h ()
- (added) llvm/tools/llvm-readobj/lib/CMakeLists.txt (+21)
- (renamed) llvm/tools/llvm-readobj/lib/COFFDumper.cpp ()
- (renamed) llvm/tools/llvm-readobj/lib/COFFImportDumper.cpp ()
- (renamed) llvm/tools/llvm-readobj/lib/DwarfCFIEHPrinter.h ()
- (renamed) llvm/tools/llvm-readobj/lib/ELFDumper.cpp ()
- (renamed) llvm/tools/llvm-readobj/lib/MachODumper.cpp ()
- (renamed) llvm/tools/llvm-readobj/lib/ObjDumper.cpp ()
- (renamed) llvm/tools/llvm-readobj/lib/ObjDumper.h ()
- (renamed) llvm/tools/llvm-readobj/lib/Opts.td ()
- (renamed) llvm/tools/llvm-readobj/lib/StackMapPrinter.h ()
- (renamed) llvm/tools/llvm-readobj/lib/WasmDumper.cpp ()
- (renamed) llvm/tools/llvm-readobj/lib/Win64EHDumper.cpp ()
- (renamed) llvm/tools/llvm-readobj/lib/Win64EHDumper.h ()
- (renamed) llvm/tools/llvm-readobj/lib/WindowsResourceDumper.cpp ()
- (renamed) llvm/tools/llvm-readobj/lib/WindowsResourceDumper.h ()
- (renamed) llvm/tools/llvm-readobj/lib/XCOFFDumper.cpp ()
- (renamed) llvm/tools/llvm-readobj/lib/llvm-readobj.cpp ()
- (renamed) llvm/tools/llvm-readobj/lib/llvm-readobj.h ()
- (modified) llvm/utils/gn/secondary/llvm/tools/llvm-readobj/BUILD.gn (+1-31)
- (added) llvm/utils/gn/secondary/llvm/tools/llvm-readobj/lib/BUILD.gn (+35)
- (modified) utils/bazel/llvm-project-overlay/llvm/BUILD.bazel (+5-5)
``````````diff
diff --git a/llvm/tools/llvm-readobj/CMakeLists.txt b/llvm/tools/llvm-readobj/CMakeLists.txt
index 0051f87b3c103..488cc1864c994 100644
--- a/llvm/tools/llvm-readobj/CMakeLists.txt
+++ b/llvm/tools/llvm-readobj/CMakeLists.txt
@@ -9,27 +9,13 @@ set(LLVM_LINK_COMPONENTS
TargetParser
)
-set(LLVM_TARGET_DEFINITIONS Opts.td)
-tablegen(LLVM Opts.inc -gen-opt-parser-defs)
-add_public_tablegen_target(ReadobjOptsTableGen)
-
add_llvm_tool(llvm-readobj
- ARMWinEHPrinter.cpp
- COFFDumper.cpp
- COFFImportDumper.cpp
- ELFDumper.cpp
- llvm-readobj.cpp
- MachODumper.cpp
- ObjDumper.cpp
- WasmDumper.cpp
- Win64EHDumper.cpp
- WindowsResourceDumper.cpp
- XCOFFDumper.cpp
- DEPENDS
- ReadobjOptsTableGen
GENERATE_DRIVER
)
+add_subdirectory(lib)
+target_link_libraries(llvm-readobj PRIVATE LLVMReadobjDriver)
+
setup_host_tool(llvm-readobj LLVM_READOBJ llvm_readobj_exe llvm_readobj_target)
add_llvm_tool_symlink(llvm-readelf llvm-readobj)
diff --git a/llvm/tools/llvm-readobj/ARMEHABIPrinter.h b/llvm/tools/llvm-readobj/lib/ARMEHABIPrinter.h
similarity index 100%
rename from llvm/tools/llvm-readobj/ARMEHABIPrinter.h
rename to llvm/tools/llvm-readobj/lib/ARMEHABIPrinter.h
diff --git a/llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp b/llvm/tools/llvm-readobj/lib/ARMWinEHPrinter.cpp
similarity index 100%
rename from llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp
rename to llvm/tools/llvm-readobj/lib/ARMWinEHPrinter.cpp
diff --git a/llvm/tools/llvm-readobj/ARMWinEHPrinter.h b/llvm/tools/llvm-readobj/lib/ARMWinEHPrinter.h
similarity index 100%
rename from llvm/tools/llvm-readobj/ARMWinEHPrinter.h
rename to llvm/tools/llvm-readobj/lib/ARMWinEHPrinter.h
diff --git a/llvm/tools/llvm-readobj/lib/CMakeLists.txt b/llvm/tools/llvm-readobj/lib/CMakeLists.txt
new file mode 100644
index 0000000000000..a779934e61a8c
--- /dev/null
+++ b/llvm/tools/llvm-readobj/lib/CMakeLists.txt
@@ -0,0 +1,21 @@
+set(LLVM_TARGET_DEFINITIONS Opts.td)
+tablegen(LLVM Opts.inc -gen-opt-parser-defs)
+add_public_tablegen_target(ReadobjOptsTableGen)
+
+add_llvm_library(LLVMReadobjDriver
+ STATIC
+ ARMWinEHPrinter.cpp
+ COFFDumper.cpp
+ COFFImportDumper.cpp
+ ELFDumper.cpp
+ llvm-readobj.cpp
+ MachODumper.cpp
+ ObjDumper.cpp
+ WasmDumper.cpp
+ Win64EHDumper.cpp
+ WindowsResourceDumper.cpp
+ XCOFFDumper.cpp
+
+ DEPENDS
+ ReadobjOptsTableGen
+ )
diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/lib/COFFDumper.cpp
similarity index 100%
rename from llvm/tools/llvm-readobj/COFFDumper.cpp
rename to llvm/tools/llvm-readobj/lib/COFFDumper.cpp
diff --git a/llvm/tools/llvm-readobj/COFFImportDumper.cpp b/llvm/tools/llvm-readobj/lib/COFFImportDumper.cpp
similarity index 100%
rename from llvm/tools/llvm-readobj/COFFImportDumper.cpp
rename to llvm/tools/llvm-readobj/lib/COFFImportDumper.cpp
diff --git a/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h b/llvm/tools/llvm-readobj/lib/DwarfCFIEHPrinter.h
similarity index 100%
rename from llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h
rename to llvm/tools/llvm-readobj/lib/DwarfCFIEHPrinter.h
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/lib/ELFDumper.cpp
similarity index 100%
rename from llvm/tools/llvm-readobj/ELFDumper.cpp
rename to llvm/tools/llvm-readobj/lib/ELFDumper.cpp
diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/lib/MachODumper.cpp
similarity index 100%
rename from llvm/tools/llvm-readobj/MachODumper.cpp
rename to llvm/tools/llvm-readobj/lib/MachODumper.cpp
diff --git a/llvm/tools/llvm-readobj/ObjDumper.cpp b/llvm/tools/llvm-readobj/lib/ObjDumper.cpp
similarity index 100%
rename from llvm/tools/llvm-readobj/ObjDumper.cpp
rename to llvm/tools/llvm-readobj/lib/ObjDumper.cpp
diff --git a/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/lib/ObjDumper.h
similarity index 100%
rename from llvm/tools/llvm-readobj/ObjDumper.h
rename to llvm/tools/llvm-readobj/lib/ObjDumper.h
diff --git a/llvm/tools/llvm-readobj/Opts.td b/llvm/tools/llvm-readobj/lib/Opts.td
similarity index 100%
rename from llvm/tools/llvm-readobj/Opts.td
rename to llvm/tools/llvm-readobj/lib/Opts.td
diff --git a/llvm/tools/llvm-readobj/StackMapPrinter.h b/llvm/tools/llvm-readobj/lib/StackMapPrinter.h
similarity index 100%
rename from llvm/tools/llvm-readobj/StackMapPrinter.h
rename to llvm/tools/llvm-readobj/lib/StackMapPrinter.h
diff --git a/llvm/tools/llvm-readobj/WasmDumper.cpp b/llvm/tools/llvm-readobj/lib/WasmDumper.cpp
similarity index 100%
rename from llvm/tools/llvm-readobj/WasmDumper.cpp
rename to llvm/tools/llvm-readobj/lib/WasmDumper.cpp
diff --git a/llvm/tools/llvm-readobj/Win64EHDumper.cpp b/llvm/tools/llvm-readobj/lib/Win64EHDumper.cpp
similarity index 100%
rename from llvm/tools/llvm-readobj/Win64EHDumper.cpp
rename to llvm/tools/llvm-readobj/lib/Win64EHDumper.cpp
diff --git a/llvm/tools/llvm-readobj/Win64EHDumper.h b/llvm/tools/llvm-readobj/lib/Win64EHDumper.h
similarity index 100%
rename from llvm/tools/llvm-readobj/Win64EHDumper.h
rename to llvm/tools/llvm-readobj/lib/Win64EHDumper.h
diff --git a/llvm/tools/llvm-readobj/WindowsResourceDumper.cpp b/llvm/tools/llvm-readobj/lib/WindowsResourceDumper.cpp
similarity index 100%
rename from llvm/tools/llvm-readobj/WindowsResourceDumper.cpp
rename to llvm/tools/llvm-readobj/lib/WindowsResourceDumper.cpp
diff --git a/llvm/tools/llvm-readobj/WindowsResourceDumper.h b/llvm/tools/llvm-readobj/lib/WindowsResourceDumper.h
similarity index 100%
rename from llvm/tools/llvm-readobj/WindowsResourceDumper.h
rename to llvm/tools/llvm-readobj/lib/WindowsResourceDumper.h
diff --git a/llvm/tools/llvm-readobj/XCOFFDumper.cpp b/llvm/tools/llvm-readobj/lib/XCOFFDumper.cpp
similarity index 100%
rename from llvm/tools/llvm-readobj/XCOFFDumper.cpp
rename to llvm/tools/llvm-readobj/lib/XCOFFDumper.cpp
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/lib/llvm-readobj.cpp
similarity index 100%
rename from llvm/tools/llvm-readobj/llvm-readobj.cpp
rename to llvm/tools/llvm-readobj/lib/llvm-readobj.cpp
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.h b/llvm/tools/llvm-readobj/lib/llvm-readobj.h
similarity index 100%
rename from llvm/tools/llvm-readobj/llvm-readobj.h
rename to llvm/tools/llvm-readobj/lib/llvm-readobj.h
diff --git a/llvm/utils/gn/secondary/llvm/tools/llvm-readobj/BUILD.gn b/llvm/utils/gn/secondary/llvm/tools/llvm-readobj/BUILD.gn
index 2fd748e40bebc..f7b93a4c0c6b0 100644
--- a/llvm/utils/gn/secondary/llvm/tools/llvm-readobj/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/tools/llvm-readobj/BUILD.gn
@@ -1,13 +1,7 @@
import("//llvm/tools/binutils_symlinks.gni")
-import("//llvm/utils/TableGen/tablegen.gni")
import("//llvm/utils/gn/build/driver_executable.gni")
import("//llvm/utils/gn/build/symlink_or_copy.gni")
-tablegen("Opts") {
- visibility = [ ":llvm-readobj" ]
- args = [ "-gen-opt-parser-defs" ]
-}
-
symlinks = [ "llvm-readelf" ]
if (llvm_install_binutils_symlinks) {
symlinks += [ "readelf" ]
@@ -29,29 +23,5 @@ group("symlinks") {
}
driver_executable("llvm-readobj") {
- deps = [
- ":Opts",
- "//llvm/lib/BinaryFormat",
- "//llvm/lib/DebugInfo/CodeView",
- "//llvm/lib/DebugInfo/DWARF",
- "//llvm/lib/DebugInfo/MSF",
- "//llvm/lib/DebugInfo/PDB",
- "//llvm/lib/Object",
- "//llvm/lib/Option",
- "//llvm/lib/Support",
- "//llvm/lib/TargetParser",
- ]
- sources = [
- "ARMWinEHPrinter.cpp",
- "COFFDumper.cpp",
- "COFFImportDumper.cpp",
- "ELFDumper.cpp",
- "MachODumper.cpp",
- "ObjDumper.cpp",
- "WasmDumper.cpp",
- "Win64EHDumper.cpp",
- "WindowsResourceDumper.cpp",
- "XCOFFDumper.cpp",
- "llvm-readobj.cpp",
- ]
+ deps = [ "lib" ]
}
diff --git a/llvm/utils/gn/secondary/llvm/tools/llvm-readobj/lib/BUILD.gn b/llvm/utils/gn/secondary/llvm/tools/llvm-readobj/lib/BUILD.gn
new file mode 100644
index 0000000000000..e34ad76f1f18c
--- /dev/null
+++ b/llvm/utils/gn/secondary/llvm/tools/llvm-readobj/lib/BUILD.gn
@@ -0,0 +1,35 @@
+import("//llvm/utils/TableGen/tablegen.gni")
+
+tablegen("Opts") {
+ visibility = [ ":lib" ]
+ args = [ "-gen-opt-parser-defs" ]
+}
+
+static_library("lib") {
+ output_name = "LLVMReadobjDriver"
+ deps = [
+ ":Opts",
+ "//llvm/lib/BinaryFormat",
+ "//llvm/lib/DebugInfo/CodeView",
+ "//llvm/lib/DebugInfo/DWARF",
+ "//llvm/lib/DebugInfo/MSF",
+ "//llvm/lib/DebugInfo/PDB",
+ "//llvm/lib/Object",
+ "//llvm/lib/Option",
+ "//llvm/lib/Support",
+ "//llvm/lib/TargetParser",
+ ]
+ sources = [
+ "ARMWinEHPrinter.cpp",
+ "COFFDumper.cpp",
+ "COFFImportDumper.cpp",
+ "ELFDumper.cpp",
+ "MachODumper.cpp",
+ "ObjDumper.cpp",
+ "WasmDumper.cpp",
+ "Win64EHDumper.cpp",
+ "WindowsResourceDumper.cpp",
+ "XCOFFDumper.cpp",
+ "llvm-readobj.cpp",
+ ]
+}
diff --git a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
index 225c77c6775c1..2cda2d1082cdc 100644
--- a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
@@ -6315,18 +6315,18 @@ binary_alias(
gentbl_cc_library(
name = "ReadobjOptsTableGen",
- strip_include_prefix = "tools/llvm-readobj",
- tbl_outs = {"tools/llvm-readobj/Opts.inc": ["-gen-opt-parser-defs"]},
+ strip_include_prefix = "tools/llvm-readobj/lib",
+ tbl_outs = {"tools/llvm-readobj/lib/Opts.inc": ["-gen-opt-parser-defs"]},
tblgen = ":llvm-tblgen",
- td_file = "tools/llvm-readobj/Opts.td",
+ td_file = "tools/llvm-readobj/lib/Opts.td",
deps = [":OptParserTdFiles"],
)
cc_library(
name = "llvm-readobj-lib",
srcs = glob([
- "tools/llvm-readobj/*.cpp",
- "tools/llvm-readobj/*.h",
+ "tools/llvm-readobj/lib/*.cpp",
+ "tools/llvm-readobj/lib/*.h",
]),
copts = llvm_copts,
deps = [
``````````
</details>
https://github.com/llvm/llvm-project/pull/222917
More information about the llvm-commits
mailing list