[llvm] [NFC][MC][CodeEmitterGen] Extract error reporting into a helper function (PR #159778)

Rahul Joshi via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 23 07:39:30 PDT 2025


https://github.com/jurahul updated https://github.com/llvm/llvm-project/pull/159778

>From 7c1feb93645ff9dc373c9db5c16cafca297ef07e Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Fri, 19 Sep 2025 06:35:45 -0700
Subject: [PATCH 1/5] [NFC][MC][CodeEmitterGen] Extract error eporting into a
 helper function

---
 llvm/include/llvm/MC/MCCodeEmitter.h          |  8 +++++++-
 llvm/lib/MC/MCCodeEmitter.cpp                 | 14 ++++++++++++++
 .../MCTargetDesc/AArch64MCCodeEmitter.cpp     |  1 -
 .../ARM/MCTargetDesc/ARMMCCodeEmitter.cpp     |  1 -
 .../MCTargetDesc/HexagonMCCodeEmitter.cpp     |  1 -
 .../Mips/MCTargetDesc/MipsMCCodeEmitter.cpp   |  1 -
 .../PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp |  1 -
 .../Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp |  1 -
 .../MCTargetDesc/SystemZMCCodeEmitter.cpp     |  1 -
 .../VE/MCTargetDesc/VEMCCodeEmitter.cpp       |  1 -
 llvm/utils/TableGen/CodeEmitterGen.cpp        | 19 ++++---------------
 .../TableGen/Common/VarLenCodeEmitterGen.cpp  |  5 +----
 12 files changed, 26 insertions(+), 28 deletions(-)

diff --git a/llvm/include/llvm/MC/MCCodeEmitter.h b/llvm/include/llvm/MC/MCCodeEmitter.h
index 1c454c3795c2c..5369bd2d330f6 100644
--- a/llvm/include/llvm/MC/MCCodeEmitter.h
+++ b/llvm/include/llvm/MC/MCCodeEmitter.h
@@ -10,13 +10,13 @@
 #define LLVM_MC_MCCODEEMITTER_H
 
 #include "llvm/Support/Compiler.h"
+#include <optional>
 
 namespace llvm {
 
 class MCFixup;
 class MCInst;
 class MCSubtargetInfo;
-class raw_ostream;
 template<typename T> class SmallVectorImpl;
 
 /// MCCodeEmitter - Generic instruction encoding interface.
@@ -36,6 +36,12 @@ class LLVM_ABI MCCodeEmitter {
   virtual void encodeInstruction(const MCInst &Inst, SmallVectorImpl<char> &CB,
                                  SmallVectorImpl<MCFixup> &Fixups,
                                  const MCSubtargetInfo &STI) const = 0;
+
+protected:
+  // Helper function used by CodeEmitterGen for error reporting.
+  [[noreturn]] static void
+  ReportFatalError(const MCInst &Inst,
+                   std::optional<unsigned> OpNum = std::nullopt);
 };
 
 } // end namespace llvm
diff --git a/llvm/lib/MC/MCCodeEmitter.cpp b/llvm/lib/MC/MCCodeEmitter.cpp
index 0d114f12d58c5..fad7cab6bed72 100644
--- a/llvm/lib/MC/MCCodeEmitter.cpp
+++ b/llvm/lib/MC/MCCodeEmitter.cpp
@@ -7,9 +7,23 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/MC/MCCodeEmitter.h"
+#include "llvm/MC/MCInst.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/raw_ostream.h"
+#include <string>
 
 using namespace llvm;
 
 MCCodeEmitter::MCCodeEmitter() = default;
 
 MCCodeEmitter::~MCCodeEmitter() = default;
+
+void MCCodeEmitter::ReportFatalError(const MCInst &Inst,
+                                     std::optional<unsigned> OpNum) {
+  std::string msg;
+  raw_string_ostream Msg(msg);
+  Msg << "Unsupported instruction " << Inst;
+  if (OpNum)
+    Msg << ", OpNum = " << *OpNum;
+  report_fatal_error(msg.c_str());
+}
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp
index 6e5a69030dbc6..21ff55e9d9a7f 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp
@@ -25,7 +25,6 @@
 #include "llvm/MC/MCSubtargetInfo.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/EndianStream.h"
-#include "llvm/Support/ErrorHandling.h"
 #include <cassert>
 #include <cstdint>
 
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
index c56b589519533..4a87c638f5fc3 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
@@ -30,7 +30,6 @@
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/EndianStream.h"
-#include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/MathExtras.h"
 #include "llvm/TargetParser/Triple.h"
 #include <cassert>
diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCodeEmitter.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCodeEmitter.cpp
index dfe0fa973c9b3..021dceb0e0789 100644
--- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCodeEmitter.cpp
+++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCodeEmitter.cpp
@@ -25,7 +25,6 @@
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/EndianStream.h"
-#include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cassert>
 #include <cstddef>
diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp
index a8369f2b28fb7..bbfd0872cc4cd 100644
--- a/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp
+++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp
@@ -28,7 +28,6 @@
 #include "llvm/MC/MCSubtargetInfo.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/EndianStream.h"
-#include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/raw_ostream.h"
 #include <cassert>
 #include <cstdint>
diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp
index 8ed7c68f54e7f..48c31c91e9338 100644
--- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp
+++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp
@@ -22,7 +22,6 @@
 #include "llvm/MC/MCRegisterInfo.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/EndianStream.h"
-#include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/MathExtras.h"
 #include "llvm/TargetParser/Triple.h"
 #include <cassert>
diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
index cfa3511436b97..cb02e33b8e5dd 100644
--- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
+++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCCodeEmitter.cpp
@@ -28,7 +28,6 @@
 #include "llvm/MC/MCSymbol.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/EndianStream.h"
-#include "llvm/Support/ErrorHandling.h"
 #include <cassert>
 #include <cstdint>
 
diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCCodeEmitter.cpp b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCCodeEmitter.cpp
index 59d1db784c688..383c96e8cca73 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCCodeEmitter.cpp
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCCodeEmitter.cpp
@@ -21,7 +21,6 @@
 #include "llvm/MC/MCInstrInfo.h"
 #include "llvm/MC/MCRegisterInfo.h"
 #include "llvm/MC/MCSubtargetInfo.h"
-#include "llvm/Support/ErrorHandling.h"
 #include <cassert>
 #include <cstdint>
 
diff --git a/llvm/lib/Target/VE/MCTargetDesc/VEMCCodeEmitter.cpp b/llvm/lib/Target/VE/MCTargetDesc/VEMCCodeEmitter.cpp
index 711937c488275..ab719390e3245 100644
--- a/llvm/lib/Target/VE/MCTargetDesc/VEMCCodeEmitter.cpp
+++ b/llvm/lib/Target/VE/MCTargetDesc/VEMCCodeEmitter.cpp
@@ -25,7 +25,6 @@
 #include "llvm/MC/MCSubtargetInfo.h"
 #include "llvm/MC/MCSymbol.h"
 #include "llvm/Support/EndianStream.h"
-#include "llvm/Support/ErrorHandling.h"
 #include <cassert>
 #include <cstdint>
 
diff --git a/llvm/utils/TableGen/CodeEmitterGen.cpp b/llvm/utils/TableGen/CodeEmitterGen.cpp
index a61ba54d3ffd2..3877f4070c8b1 100644
--- a/llvm/utils/TableGen/CodeEmitterGen.cpp
+++ b/llvm/utils/TableGen/CodeEmitterGen.cpp
@@ -471,12 +471,8 @@ void CodeEmitterGen::run(raw_ostream &O) {
     << ";\n";
   O << R"(
   const unsigned opcode = MI.getOpcode();
-  if (opcode < FirstSupportedOpcode) {
-    std::string msg;
-    raw_string_ostream Msg(msg);
-    Msg << "Unsupported instruction: " << MI;
-    report_fatal_error(Msg.str().c_str());
-  }
+  if (opcode < FirstSupportedOpcode)
+    ReportFatalError(MI);
   unsigned TableIndex = opcode - FirstSupportedOpcode;
 )";
 
@@ -502,10 +498,7 @@ void CodeEmitterGen::run(raw_ostream &O) {
 
   // Default case: unhandled opcode.
   O << "  default:\n"
-    << "    std::string msg;\n"
-    << "    raw_string_ostream Msg(msg);\n"
-    << "    Msg << \"Not supported instr: \" << MI;\n"
-    << "    report_fatal_error(Msg.str().c_str());\n"
+    << "    ReportFatalError(MI);\n"
     << "  }\n";
   if (UseAPInt)
     O << "  Inst = Value;\n";
@@ -522,11 +515,7 @@ void CodeEmitterGen::run(raw_ostream &O) {
     << "  switch (MI.getOpcode()) {\n";
   emitCaseMap(O, BitOffsetCaseMap);
   O << "  }\n"
-    << "  std::string msg;\n"
-    << "  raw_string_ostream Msg(msg);\n"
-    << "  Msg << \"Not supported instr[opcode]: \" << MI << \"[\" << OpNum "
-       "<< \"]\";\n"
-    << "  report_fatal_error(Msg.str().c_str());\n"
+    << "  ReportFatalError(MI, OpNum);\n"
     << "}\n\n"
     << "#endif // GET_OPERAND_BIT_OFFSET\n\n";
 }
diff --git a/llvm/utils/TableGen/Common/VarLenCodeEmitterGen.cpp b/llvm/utils/TableGen/Common/VarLenCodeEmitterGen.cpp
index b617a3dbca586..c069316a58497 100644
--- a/llvm/utils/TableGen/Common/VarLenCodeEmitterGen.cpp
+++ b/llvm/utils/TableGen/Common/VarLenCodeEmitterGen.cpp
@@ -320,10 +320,7 @@ void VarLenCodeEmitterGen::run(raw_ostream &OS) {
   }
   // Default case: unhandled opcode
   OS << "  default:\n"
-     << "    std::string msg;\n"
-     << "    raw_string_ostream Msg(msg);\n"
-     << "    Msg << \"Not supported instr: \" << MI;\n"
-     << "    report_fatal_error(Msg.str().c_str());\n"
+     << "    ReportFatalError(MI);\n"
      << "  }\n";
   OS << "}\n\n";
 }

>From 34700b49b31283e1fa12011eb6a8ff71d4cf1d9d Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Fri, 19 Sep 2025 10:51:26 -0700
Subject: [PATCH 2/5] Review feedback

---
 llvm/include/llvm/MC/MCCodeEmitter.h          |  6 +++---
 llvm/lib/MC/MCCodeEmitter.cpp                 | 21 ++++++++++++-------
 llvm/utils/TableGen/CodeEmitterGen.cpp        |  6 +++---
 .../TableGen/Common/VarLenCodeEmitterGen.cpp  |  2 +-
 4 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/llvm/include/llvm/MC/MCCodeEmitter.h b/llvm/include/llvm/MC/MCCodeEmitter.h
index 5369bd2d330f6..5d2e6efa5187d 100644
--- a/llvm/include/llvm/MC/MCCodeEmitter.h
+++ b/llvm/include/llvm/MC/MCCodeEmitter.h
@@ -39,9 +39,9 @@ class LLVM_ABI MCCodeEmitter {
 
 protected:
   // Helper function used by CodeEmitterGen for error reporting.
-  [[noreturn]] static void
-  ReportFatalError(const MCInst &Inst,
-                   std::optional<unsigned> OpNum = std::nullopt);
+  [[noreturn]] static void reportUnsupportedInst(const MCInst &Inst);
+  [[noreturn]] static void reportUnsupportedOperand(const MCInst &Inst,
+                                                    unsigned OpNum);
 };
 
 } // end namespace llvm
diff --git a/llvm/lib/MC/MCCodeEmitter.cpp b/llvm/lib/MC/MCCodeEmitter.cpp
index fad7cab6bed72..c14b27fb679cc 100644
--- a/llvm/lib/MC/MCCodeEmitter.cpp
+++ b/llvm/lib/MC/MCCodeEmitter.cpp
@@ -18,12 +18,17 @@ MCCodeEmitter::MCCodeEmitter() = default;
 
 MCCodeEmitter::~MCCodeEmitter() = default;
 
-void MCCodeEmitter::ReportFatalError(const MCInst &Inst,
-                                     std::optional<unsigned> OpNum) {
-  std::string msg;
-  raw_string_ostream Msg(msg);
-  Msg << "Unsupported instruction " << Inst;
-  if (OpNum)
-    Msg << ", OpNum = " << *OpNum;
-  report_fatal_error(msg.c_str());
+void MCCodeEmitter::reportUnsupportedInst(const MCInst &Inst) {
+  std::string Msg;
+  raw_string_ostream OS(Msg);
+  OS << "Unsupported instruction : " << Inst;
+  report_fatal_error(Msg.c_str());
+}
+
+void MCCodeEmitter::reportUnsupportedOperand(const MCInst &Inst,
+                                             unsigned OpNum) {
+  std::string Msg;
+  raw_string_ostream OS(Msg);
+  OS << "Unsupported instruction/operand : \"" << Inst << "\"[" << OpNum << "]";
+  report_fatal_error(Msg.c_str());
 }
diff --git a/llvm/utils/TableGen/CodeEmitterGen.cpp b/llvm/utils/TableGen/CodeEmitterGen.cpp
index 3877f4070c8b1..31833f134ca6c 100644
--- a/llvm/utils/TableGen/CodeEmitterGen.cpp
+++ b/llvm/utils/TableGen/CodeEmitterGen.cpp
@@ -472,7 +472,7 @@ void CodeEmitterGen::run(raw_ostream &O) {
   O << R"(
   const unsigned opcode = MI.getOpcode();
   if (opcode < FirstSupportedOpcode)
-    ReportFatalError(MI);
+    reportUnsupportedInst(MI);
   unsigned TableIndex = opcode - FirstSupportedOpcode;
 )";
 
@@ -498,7 +498,7 @@ void CodeEmitterGen::run(raw_ostream &O) {
 
   // Default case: unhandled opcode.
   O << "  default:\n"
-    << "    ReportFatalError(MI);\n"
+    << "    reportUnsupportedInst(MI);\n"
     << "  }\n";
   if (UseAPInt)
     O << "  Inst = Value;\n";
@@ -515,7 +515,7 @@ void CodeEmitterGen::run(raw_ostream &O) {
     << "  switch (MI.getOpcode()) {\n";
   emitCaseMap(O, BitOffsetCaseMap);
   O << "  }\n"
-    << "  ReportFatalError(MI, OpNum);\n"
+    << "  reportUnsupportedOperand(MI, OpNum);\n"
     << "}\n\n"
     << "#endif // GET_OPERAND_BIT_OFFSET\n\n";
 }
diff --git a/llvm/utils/TableGen/Common/VarLenCodeEmitterGen.cpp b/llvm/utils/TableGen/Common/VarLenCodeEmitterGen.cpp
index c069316a58497..3a2ef55656067 100644
--- a/llvm/utils/TableGen/Common/VarLenCodeEmitterGen.cpp
+++ b/llvm/utils/TableGen/Common/VarLenCodeEmitterGen.cpp
@@ -320,7 +320,7 @@ void VarLenCodeEmitterGen::run(raw_ostream &OS) {
   }
   // Default case: unhandled opcode
   OS << "  default:\n"
-     << "    ReportFatalError(MI);\n"
+     << "    reportUnsupportedInst(MI);\n"
      << "  }\n";
   OS << "}\n\n";
 }

>From 36a5b1026562e3bea52710c87e1543cd1d328ba1 Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Fri, 19 Sep 2025 10:54:32 -0700
Subject: [PATCH 3/5] Remove unused header

---
 llvm/include/llvm/MC/MCCodeEmitter.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/llvm/include/llvm/MC/MCCodeEmitter.h b/llvm/include/llvm/MC/MCCodeEmitter.h
index 5d2e6efa5187d..5f288e9e45c4b 100644
--- a/llvm/include/llvm/MC/MCCodeEmitter.h
+++ b/llvm/include/llvm/MC/MCCodeEmitter.h
@@ -10,7 +10,6 @@
 #define LLVM_MC_MCCODEEMITTER_H
 
 #include "llvm/Support/Compiler.h"
-#include <optional>
 
 namespace llvm {
 

>From fcb1b70f1397558a95a798c239cf87266dbccde4 Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Fri, 19 Sep 2025 11:02:15 -0700
Subject: [PATCH 4/5] Use reportFatalInternalError

---
 llvm/lib/MC/MCCodeEmitter.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/MC/MCCodeEmitter.cpp b/llvm/lib/MC/MCCodeEmitter.cpp
index c14b27fb679cc..48030d452b957 100644
--- a/llvm/lib/MC/MCCodeEmitter.cpp
+++ b/llvm/lib/MC/MCCodeEmitter.cpp
@@ -22,7 +22,7 @@ void MCCodeEmitter::reportUnsupportedInst(const MCInst &Inst) {
   std::string Msg;
   raw_string_ostream OS(Msg);
   OS << "Unsupported instruction : " << Inst;
-  report_fatal_error(Msg.c_str());
+  reportFatalInternalError(Msg.c_str());
 }
 
 void MCCodeEmitter::reportUnsupportedOperand(const MCInst &Inst,
@@ -30,5 +30,5 @@ void MCCodeEmitter::reportUnsupportedOperand(const MCInst &Inst,
   std::string Msg;
   raw_string_ostream OS(Msg);
   OS << "Unsupported instruction/operand : \"" << Inst << "\"[" << OpNum << "]";
-  report_fatal_error(Msg.c_str());
+  reportFatalInternalError(Msg.c_str());
 }

>From 0fb6c9cc436d94314ca47524ea9607b94e269dbc Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Fri, 19 Sep 2025 11:14:28 -0700
Subject: [PATCH 5/5] Review feedback

---
 llvm/lib/MC/MCCodeEmitter.cpp          | 2 +-
 llvm/utils/TableGen/CodeEmitterGen.cpp | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/MC/MCCodeEmitter.cpp b/llvm/lib/MC/MCCodeEmitter.cpp
index 48030d452b957..76a8406cee7bd 100644
--- a/llvm/lib/MC/MCCodeEmitter.cpp
+++ b/llvm/lib/MC/MCCodeEmitter.cpp
@@ -29,6 +29,6 @@ void MCCodeEmitter::reportUnsupportedOperand(const MCInst &Inst,
                                              unsigned OpNum) {
   std::string Msg;
   raw_string_ostream OS(Msg);
-  OS << "Unsupported instruction/operand : \"" << Inst << "\"[" << OpNum << "]";
+  OS << "Unsupported instruction operand : \"" << Inst << "\"[" << OpNum << "]";
   reportFatalInternalError(Msg.c_str());
 }
diff --git a/llvm/utils/TableGen/CodeEmitterGen.cpp b/llvm/utils/TableGen/CodeEmitterGen.cpp
index 31833f134ca6c..f2fd889746bac 100644
--- a/llvm/utils/TableGen/CodeEmitterGen.cpp
+++ b/llvm/utils/TableGen/CodeEmitterGen.cpp
@@ -514,7 +514,9 @@ void CodeEmitterGen::run(raw_ostream &O) {
     << "    const MCSubtargetInfo &STI) const {\n"
     << "  switch (MI.getOpcode()) {\n";
   emitCaseMap(O, BitOffsetCaseMap);
-  O << "  }\n"
+  O << "  default:\n"
+    << "    reportUnsupportedInst(MI);\n"
+    << "  }\n"
     << "  reportUnsupportedOperand(MI, OpNum);\n"
     << "}\n\n"
     << "#endif // GET_OPERAND_BIT_OFFSET\n\n";



More information about the llvm-commits mailing list