[llvm] [llvm-objdump] Add triple support to `mcpu=help` (PR #165661)

Ruoyu Qiu via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 21 02:44:25 PST 2025


https://github.com/cabbaken updated https://github.com/llvm/llvm-project/pull/165661

>From 9f37b38971c60fb2ab0f0f9b8005555f44007c9f Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Thu, 30 Oct 2025 06:47:58 +0000
Subject: [PATCH 1/8] Add triple support to mcpu=help

Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
 .../tools/llvm-objdump/mattr-mcpu-help.test     |  6 ++++++
 llvm/tools/llvm-objdump/llvm-objdump.cpp        | 17 +++++++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test b/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test
index 65c426008fd6a..3475f0396d9b2 100644
--- a/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test
+++ b/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test
@@ -14,3 +14,9 @@ FileHeader:
   Data:            ELFDATA2LSB
   Type:            ET_EXEC
   Machine:         EM_X86_64
+
+# RUN: llvm-objdump --triple=x86_64 --mcpu=help 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=CHECK-WITHOUT-DISASSEMBLING
+
+# CHECK-WITHOUT-DISASSEMBLING: Available CPUs for this target:
+# CHECK-WITHOUT-DISASSEMBLING: Available features for this target:
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 3ec644a472bfc..5fe4420eb4f2d 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3533,6 +3533,19 @@ commaSeparatedValues(const llvm::opt::InputArgList &InputArgs, int ID) {
   return Values;
 }
 
+static int MCPUHelp() {
+  if (!TripleName.empty()) {
+    std::string Error;
+    const Target *DummyTarget = TargetRegistry::lookupTarget(TripleName, Error);
+    if (!DummyTarget) {
+      outs() << Error << '\n';
+      return 2;
+    }
+    DummyTarget->createMCSubtargetInfo(TripleName, MCPU, "");
+  }
+  return 0;
+}
+
 static void parseOtoolOptions(const llvm::opt::InputArgList &InputArgs) {
   MachOOpt = true;
   FullLeadingAddr = true;
@@ -3826,6 +3839,10 @@ int llvm_objdump_main(int argc, char **argv, const llvm::ToolContext &) {
       !DisassembleSymbols.empty())
     Disassemble = true;
 
+  if (!Disassemble && MCPU == "help") {
+    return MCPUHelp();
+  }
+
   if (!ArchiveHeaders && !Disassemble && DwarfDumpType == DIDT_Null &&
       !DynamicRelocations && !FileHeaders && !PrivateHeaders && !RawClangAST &&
       !Relocations && !SectionHeaders && !SectionContents && !SymbolTable &&

>From 1ddbf3c1c523807a7f322d166b5a7cf0388f6253 Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Thu, 30 Oct 2025 09:42:42 +0000
Subject: [PATCH 2/8] Fix deprecated function call

Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
 llvm/tools/llvm-objdump/llvm-objdump.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 5fe4420eb4f2d..5e8d012a08450 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3536,12 +3536,14 @@ commaSeparatedValues(const llvm::opt::InputArgList &InputArgs, int ID) {
 static int MCPUHelp() {
   if (!TripleName.empty()) {
     std::string Error;
-    const Target *DummyTarget = TargetRegistry::lookupTarget(TripleName, Error);
+    Triple DummyTriple(TripleName);
+    const Target *DummyTarget =
+        TargetRegistry::lookupTarget(DummyTriple, Error);
     if (!DummyTarget) {
       outs() << Error << '\n';
       return 2;
     }
-    DummyTarget->createMCSubtargetInfo(TripleName, MCPU, "");
+    DummyTarget->createMCSubtargetInfo(DummyTriple, MCPU, "");
   }
   return 0;
 }

>From 43c26ca43dc3bca130a8d6c42b5cb10033c5b647 Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Fri, 31 Oct 2025 10:27:46 +0000
Subject: [PATCH 3/8] Do some fix

Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
 llvm/test/tools/llvm-objdump/mattr-mcpu-help.test |  2 ++
 llvm/tools/llvm-objdump/llvm-objdump.cpp          | 13 +++++++------
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test b/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test
index 3475f0396d9b2..63aab94203b1f 100644
--- a/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test
+++ b/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test
@@ -20,3 +20,5 @@ FileHeader:
 
 # CHECK-WITHOUT-DISASSEMBLING: Available CPUs for this target:
 # CHECK-WITHOUT-DISASSEMBLING: Available features for this target:
+
+; XFAIL: *
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 5e8d012a08450..31205e07511da 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3533,16 +3533,17 @@ commaSeparatedValues(const llvm::opt::InputArgList &InputArgs, int ID) {
   return Values;
 }
 
-static int MCPUHelp() {
+static int mcpuHelp() {
   if (!TripleName.empty()) {
     std::string Error;
     Triple DummyTriple(TripleName);
     const Target *DummyTarget =
         TargetRegistry::lookupTarget(DummyTriple, Error);
     if (!DummyTarget) {
-      outs() << Error << '\n';
+      reportCmdLineError(Error);
       return 2;
     }
+    // We need to access the Help() through the corresponding MCSubtargetInfo
     DummyTarget->createMCSubtargetInfo(DummyTriple, MCPU, "");
   }
   return 0;
@@ -3841,14 +3842,11 @@ int llvm_objdump_main(int argc, char **argv, const llvm::ToolContext &) {
       !DisassembleSymbols.empty())
     Disassemble = true;
 
-  if (!Disassemble && MCPU == "help") {
-    return MCPUHelp();
-  }
-
   if (!ArchiveHeaders && !Disassemble && DwarfDumpType == DIDT_Null &&
       !DynamicRelocations && !FileHeaders && !PrivateHeaders && !RawClangAST &&
       !Relocations && !SectionHeaders && !SectionContents && !SymbolTable &&
       !DynamicSymbolTable && !UnwindInfo && !FaultMapSection && !Offloading &&
+      MCPU != "help" &&
       !(MachOOpt &&
         (Bind || DataInCode || ChainedFixups || DyldInfo || DylibId ||
          DylibsUsed || ExportsTrie || FirstPrivateHeader ||
@@ -3859,6 +3857,9 @@ int llvm_objdump_main(int argc, char **argv, const llvm::ToolContext &) {
     return 2;
   }
 
+  if (!Disassemble && MCPU == "help")
+    mcpuHelp();
+
   DisasmSymbolSet.insert_range(DisassembleSymbols);
 
   llvm::for_each(InputFilenames, dumpInput);

>From b8a508972189c0b4212fb305cb3b162e44b81b7f Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Fri, 14 Nov 2025 09:59:17 +0000
Subject: [PATCH 4/8] Fix mcpuHelp

Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
 llvm/tools/llvm-objdump/llvm-objdump.cpp | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 31205e07511da..0e083faba5bb5 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3533,20 +3533,17 @@ commaSeparatedValues(const llvm::opt::InputArgList &InputArgs, int ID) {
   return Values;
 }
 
-static int mcpuHelp() {
+static void mcpuHelp() {
   if (!TripleName.empty()) {
     std::string Error;
     Triple DummyTriple(TripleName);
     const Target *DummyTarget =
         TargetRegistry::lookupTarget(DummyTriple, Error);
-    if (!DummyTarget) {
+    if (!DummyTarget)
       reportCmdLineError(Error);
-      return 2;
-    }
-    // We need to access the Help() through the corresponding MCSubtargetInfo
-    DummyTarget->createMCSubtargetInfo(DummyTriple, MCPU, "");
+    // createMCSubtargetInfo prints the mcpu help text when called with "help"
+    DummyTarget->createMCSubtargetInfo(DummyTriple, "help", "");
   }
-  return 0;
 }
 
 static void parseOtoolOptions(const llvm::opt::InputArgList &InputArgs) {

>From b3071681defdbe525c08b9e5bd4b972a5cf958c1 Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Fri, 21 Nov 2025 07:36:22 +0000
Subject: [PATCH 5/8] Correct behavior of mcpu=help

Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
 .../tools/llvm-objdump/mattr-mcpu-help.test   | 25 ++++++++++++--
 llvm/tools/llvm-objdump/llvm-objdump.cpp      | 33 +++++++++++++------
 2 files changed, 45 insertions(+), 13 deletions(-)

diff --git a/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test b/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test
index 63aab94203b1f..9dffa8e4b2ba7 100644
--- a/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test
+++ b/llvm/test/tools/llvm-objdump/mattr-mcpu-help.test
@@ -15,10 +15,29 @@ FileHeader:
   Type:            ET_EXEC
   Machine:         EM_X86_64
 
-# RUN: llvm-objdump --triple=x86_64 --mcpu=help 2>&1 \
+# RUN: cp %t a.out
+# RUN: llvm-objdump -d --mcpu=help 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=CHECK-DEFAULT-FILE
+# RUN: rm a.out
+
+# CHECK-DEFAULT-FILE: Available CPUs for this target:
+# CHECK-DEFAULT-FILE: Available features for this target:
+
+# RUN: llvm-objdump --triple=arm --mcpu=help %t 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=CHECK-TRIPLE-PRIORITY
+
+# CHECK-TRIPLE-PRIORITY: Available CPUs for this target:
+# CHECK-TRIPLE-PRIORITY: Available features for this target:
+# CHECK-TRIPLE-PRIORITY: arm
+
+# RUN: not llvm-objdump --triple=x86_64 --mcpu=help 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=CHECK-WITHOUT-FILE
+
+# CHECK-WITHOUT-FILE: Available CPUs for this target:
+# CHECK-WITHOUT-FILE: Available features for this target:
+
+# RUN: llvm-objdump --mcpu=help %t 2>&1 \
 # RUN:   | FileCheck %s --check-prefix=CHECK-WITHOUT-DISASSEMBLING
 
 # CHECK-WITHOUT-DISASSEMBLING: Available CPUs for this target:
 # CHECK-WITHOUT-DISASSEMBLING: Available features for this target:
-
-; XFAIL: *
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 0e083faba5bb5..8122937af471a 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3534,16 +3534,29 @@ commaSeparatedValues(const llvm::opt::InputArgList &InputArgs, int ID) {
 }
 
 static void mcpuHelp() {
-  if (!TripleName.empty()) {
-    std::string Error;
-    Triple DummyTriple(TripleName);
-    const Target *DummyTarget =
-        TargetRegistry::lookupTarget(DummyTriple, Error);
-    if (!DummyTarget)
-      reportCmdLineError(Error);
-    // createMCSubtargetInfo prints the mcpu help text when called with "help"
-    DummyTarget->createMCSubtargetInfo(DummyTriple, "help", "");
+  std::string Error;
+  Triple DummyTriple;
+
+  if (!TripleName.empty())
+    DummyTriple.setTriple(TripleName);
+  else {
+    // If the target triple is derived from the files, we display help message
+    // when disassembling them.
+    if (Disassemble)
+      return;
+    for (std::string Filename : InputFilenames) {
+      OwningBinary<Binary> OBinary =
+          unwrapOrError(createBinary(Filename), Filename);
+      Binary *Obj = OBinary.getBinary();
+      DummyTriple = dyn_cast<ObjectFile>(Obj)->makeTriple();
+    }
   }
+
+  const Target *DummyTarget = TargetRegistry::lookupTarget(DummyTriple, Error);
+  if (!DummyTarget)
+    reportCmdLineError(Error);
+  // We need to access the Help() through the corresponding MCSubtargetInfo.
+  DummyTarget->createMCSubtargetInfo(DummyTriple, "help", "");
 }
 
 static void parseOtoolOptions(const llvm::opt::InputArgList &InputArgs) {
@@ -3854,7 +3867,7 @@ int llvm_objdump_main(int argc, char **argv, const llvm::ToolContext &) {
     return 2;
   }
 
-  if (!Disassemble && MCPU == "help")
+  if (MCPU == "help")
     mcpuHelp();
 
   DisasmSymbolSet.insert_range(DisassembleSymbols);

>From 04cf6596741bb99915912cbd9295f705976807ca Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Fri, 21 Nov 2025 08:20:45 +0000
Subject: [PATCH 6/8] Add type check

Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
 llvm/tools/llvm-objdump/llvm-objdump.cpp | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 8122937af471a..93fbf3d3113e7 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3547,8 +3547,11 @@ static void mcpuHelp() {
     for (std::string Filename : InputFilenames) {
       OwningBinary<Binary> OBinary =
           unwrapOrError(createBinary(Filename), Filename);
-      Binary *Obj = OBinary.getBinary();
-      DummyTriple = dyn_cast<ObjectFile>(Obj)->makeTriple();
+      Binary *Bin = OBinary.getBinary();
+      if (ObjectFile* Obj = dyn_cast<ObjectFile>(Bin)) {
+        DummyTriple = Obj->makeTriple();
+        break;
+      }
     }
   }
 

>From c246c1c2fc1f51b6e15fc43d461e80038caa08c0 Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Fri, 21 Nov 2025 08:23:54 +0000
Subject: [PATCH 7/8] fix format

---
 llvm/tools/llvm-objdump/llvm-objdump.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 93fbf3d3113e7..c8bc9ab1c7d6c 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3548,7 +3548,7 @@ static void mcpuHelp() {
       OwningBinary<Binary> OBinary =
           unwrapOrError(createBinary(Filename), Filename);
       Binary *Bin = OBinary.getBinary();
-      if (ObjectFile* Obj = dyn_cast<ObjectFile>(Bin)) {
+      if (ObjectFile *Obj = dyn_cast<ObjectFile>(Bin)) {
         DummyTriple = Obj->makeTriple();
         break;
       }

>From a8b26bd6eb8e1a783956205f807633f5f50b9d09 Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Fri, 21 Nov 2025 10:43:34 +0000
Subject: [PATCH 8/8] Add release notes

Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
 llvm/docs/ReleaseNotes.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index 49158fb4217b6..aae2f48529279 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -179,6 +179,8 @@ Changes to the LLVM tools
 * `llvm-readelf` now dumps all hex format values in lower-case mode.
 * Some code paths for supporting Python 2.7 in `llvm-lit` have been removed.
 * Support for `%T` in lit has been removed.
+* `llvm-objdump` now supports using `--mcpu=help` with the `--triple` option
+  without requiring an input file or the `-d` (disassemble) flag.
 
 Changes to LLDB
 ---------------------------------



More information about the llvm-commits mailing list