[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