[clang] cc69bc4 - [clang][Interp][NFC] Print Function name in unreachable type failures

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 1 23:38:43 PDT 2023


Author: Timm Bäder
Date: 2023-06-02T08:38:13+02:00
New Revision: cc69bc4254ba9cb4316ca2b304fbb3230e38ed63

URL: https://github.com/llvm/llvm-project/commit/cc69bc4254ba9cb4316ca2b304fbb3230e38ed63
DIFF: https://github.com/llvm/llvm-project/commit/cc69bc4254ba9cb4316ca2b304fbb3230e38ed63.diff

LOG: [clang][Interp][NFC] Print Function name in unreachable type failures

and pass Record* pointers around as const.

Added: 
    

Modified: 
    clang/utils/TableGen/ClangOpcodesEmitter.cpp

Removed: 
    


################################################################################
diff  --git a/clang/utils/TableGen/ClangOpcodesEmitter.cpp b/clang/utils/TableGen/ClangOpcodesEmitter.cpp
index aa012233c46ee..db88c990d5f9b 100644
--- a/clang/utils/TableGen/ClangOpcodesEmitter.cpp
+++ b/clang/utils/TableGen/ClangOpcodesEmitter.cpp
@@ -21,7 +21,7 @@ using namespace llvm;
 namespace {
 class ClangOpcodesEmitter {
   RecordKeeper &Records;
-  Record Root;
+  const Record Root;
   unsigned NumTypes;
 
 public:
@@ -34,33 +34,32 @@ class ClangOpcodesEmitter {
 private:
   /// Emits the opcode name for the opcode enum.
   /// The name is obtained by concatenating the name with the list of types.
-  void EmitEnum(raw_ostream &OS, StringRef N, Record *R);
+  void EmitEnum(raw_ostream &OS, StringRef N, const Record *R);
 
   /// Emits the switch case and the invocation in the interpreter.
-  void EmitInterp(raw_ostream &OS, StringRef N, Record *R);
+  void EmitInterp(raw_ostream &OS, StringRef N, const Record *R);
 
   /// Emits the disassembler.
-  void EmitDisasm(raw_ostream &OS, StringRef N, Record *R);
+  void EmitDisasm(raw_ostream &OS, StringRef N, const Record *R);
 
   /// Emits the byte code emitter method.
-  void EmitEmitter(raw_ostream &OS, StringRef N, Record *R);
+  void EmitEmitter(raw_ostream &OS, StringRef N, const Record *R);
 
   /// Emits the prototype.
-  void EmitProto(raw_ostream &OS, StringRef N, Record *R);
+  void EmitProto(raw_ostream &OS, StringRef N, const Record *R);
 
   /// Emits the prototype to dispatch from a type.
-  void EmitGroup(raw_ostream &OS, StringRef N, Record *R);
+  void EmitGroup(raw_ostream &OS, StringRef N, const Record *R);
 
   /// Emits the evaluator method.
-  void EmitEval(raw_ostream &OS, StringRef N, Record *R);
+  void EmitEval(raw_ostream &OS, StringRef N, const Record *R);
 
-  void PrintTypes(raw_ostream &OS, ArrayRef<Record *> Types);
+  void PrintTypes(raw_ostream &OS, ArrayRef<const Record *> Types);
 };
 
-void Enumerate(const Record *R,
-               StringRef N,
-               std::function<void(ArrayRef<Record *>, Twine)> &&F) {
-  llvm::SmallVector<Record *, 2> TypePath;
+void Enumerate(const Record *R, StringRef N,
+               std::function<void(ArrayRef<const Record *>, Twine)> &&F) {
+  llvm::SmallVector<const Record *, 2> TypePath;
   auto *Types = R->getValueAsListInit("Types");
 
   std::function<void(size_t, const Twine &)> Rec;
@@ -102,67 +101,72 @@ void ClangOpcodesEmitter::run(raw_ostream &OS) {
   }
 }
 
-void ClangOpcodesEmitter::EmitEnum(raw_ostream &OS, StringRef N, Record *R) {
+void ClangOpcodesEmitter::EmitEnum(raw_ostream &OS, StringRef N,
+                                   const Record *R) {
   OS << "#ifdef GET_OPCODE_NAMES\n";
-  Enumerate(R, N, [&OS](ArrayRef<Record *>, const Twine &ID) {
+  Enumerate(R, N, [&OS](ArrayRef<const Record *>, const Twine &ID) {
     OS << "OP_" << ID << ",\n";
   });
   OS << "#endif\n";
 }
 
-void ClangOpcodesEmitter::EmitInterp(raw_ostream &OS, StringRef N, Record *R) {
+void ClangOpcodesEmitter::EmitInterp(raw_ostream &OS, StringRef N,
+                                     const Record *R) {
   OS << "#ifdef GET_INTERP\n";
 
-  Enumerate(R, N, [this, R, &OS, &N](ArrayRef<Record *> TS, const Twine &ID) {
-    bool CanReturn = R->getValueAsBit("CanReturn");
-    bool ChangesPC = R->getValueAsBit("ChangesPC");
-    auto Args = R->getValueAsListOfDefs("Args");
-
-    OS << "case OP_" << ID << ": {\n";
-
-    if (CanReturn)
-      OS << "  bool DoReturn = (S.Current == StartFrame);\n";
-
-    // Emit calls to read arguments.
-    for (size_t I = 0, N = Args.size(); I < N; ++I) {
-      OS << "  auto V" << I;
-      OS << " = ";
-      OS << "ReadArg<" << Args[I]->getValueAsString("Name") << ">(S, PC);\n";
-    }
-
-    // Emit a call to the template method and pass arguments.
-    OS << "  if (!" << N;
-    PrintTypes(OS, TS);
-    OS << "(S";
-    if (ChangesPC)
-      OS << ", PC";
-    else
-      OS << ", OpPC";
-    if (CanReturn)
-      OS << ", Result";
-    for (size_t I = 0, N = Args.size(); I < N; ++I)
-      OS << ", V" << I;
-    OS << "))\n";
-    OS << "    return false;\n";
-
-    // Bail out if interpreter returned.
-    if (CanReturn) {
-      OS << "  if (!S.Current || S.Current->isRoot())\n";
-      OS << "    return true;\n";
-
-      OS << "  if (DoReturn)\n";
-      OS << "    return true;\n";
-    }
-
-    OS << "  continue;\n";
-    OS << "}\n";
-  });
+  Enumerate(R, N,
+            [this, R, &OS, &N](ArrayRef<const Record *> TS, const Twine &ID) {
+              bool CanReturn = R->getValueAsBit("CanReturn");
+              bool ChangesPC = R->getValueAsBit("ChangesPC");
+              auto Args = R->getValueAsListOfDefs("Args");
+
+              OS << "case OP_" << ID << ": {\n";
+
+              if (CanReturn)
+                OS << "  bool DoReturn = (S.Current == StartFrame);\n";
+
+              // Emit calls to read arguments.
+              for (size_t I = 0, N = Args.size(); I < N; ++I) {
+                OS << "  auto V" << I;
+                OS << " = ";
+                OS << "ReadArg<" << Args[I]->getValueAsString("Name")
+                   << ">(S, PC);\n";
+              }
+
+              // Emit a call to the template method and pass arguments.
+              OS << "  if (!" << N;
+              PrintTypes(OS, TS);
+              OS << "(S";
+              if (ChangesPC)
+                OS << ", PC";
+              else
+                OS << ", OpPC";
+              if (CanReturn)
+                OS << ", Result";
+              for (size_t I = 0, N = Args.size(); I < N; ++I)
+                OS << ", V" << I;
+              OS << "))\n";
+              OS << "    return false;\n";
+
+              // Bail out if interpreter returned.
+              if (CanReturn) {
+                OS << "  if (!S.Current || S.Current->isRoot())\n";
+                OS << "    return true;\n";
+
+                OS << "  if (DoReturn)\n";
+                OS << "    return true;\n";
+              }
+
+              OS << "  continue;\n";
+              OS << "}\n";
+            });
   OS << "#endif\n";
 }
 
-void ClangOpcodesEmitter::EmitDisasm(raw_ostream &OS, StringRef N, Record *R) {
+void ClangOpcodesEmitter::EmitDisasm(raw_ostream &OS, StringRef N,
+                                     const Record *R) {
   OS << "#ifdef GET_DISASM\n";
-  Enumerate(R, N, [R, &OS](ArrayRef<Record *>, const Twine &ID) {
+  Enumerate(R, N, [R, &OS](ArrayRef<const Record *>, const Twine &ID) {
     OS << "case OP_" << ID << ":\n";
     OS << "  PrintName(\"" << ID << "\");\n";
     OS << "  OS << \"\\t\"";
@@ -178,12 +182,13 @@ void ClangOpcodesEmitter::EmitDisasm(raw_ostream &OS, StringRef N, Record *R) {
   OS << "#endif\n";
 }
 
-void ClangOpcodesEmitter::EmitEmitter(raw_ostream &OS, StringRef N, Record *R) {
+void ClangOpcodesEmitter::EmitEmitter(raw_ostream &OS, StringRef N,
+                                      const Record *R) {
   if (R->getValueAsBit("HasCustomLink"))
     return;
 
   OS << "#ifdef GET_LINK_IMPL\n";
-  Enumerate(R, N, [R, &OS](ArrayRef<Record *>, const Twine &ID) {
+  Enumerate(R, N, [R, &OS](ArrayRef<const Record *>, const Twine &ID) {
     auto Args = R->getValueAsListOfDefs("Args");
 
     // Emit the list of arguments.
@@ -208,10 +213,11 @@ void ClangOpcodesEmitter::EmitEmitter(raw_ostream &OS, StringRef N, Record *R) {
   OS << "#endif\n";
 }
 
-void ClangOpcodesEmitter::EmitProto(raw_ostream &OS, StringRef N, Record *R) {
+void ClangOpcodesEmitter::EmitProto(raw_ostream &OS, StringRef N,
+                                    const Record *R) {
   OS << "#if defined(GET_EVAL_PROTO) || defined(GET_LINK_PROTO)\n";
   auto Args = R->getValueAsListOfDefs("Args");
-  Enumerate(R, N, [&OS, &Args](ArrayRef<Record *> TS, const Twine &ID) {
+  Enumerate(R, N, [&OS, &Args](ArrayRef<const Record *> TS, const Twine &ID) {
     OS << "bool emit" << ID << "(";
     for (auto *Arg : Args)
       OS << Arg->getValueAsString("Name") << ", ";
@@ -239,16 +245,19 @@ void ClangOpcodesEmitter::EmitProto(raw_ostream &OS, StringRef N, Record *R) {
   OS << "#endif\n";
 }
 
-void ClangOpcodesEmitter::EmitGroup(raw_ostream &OS, StringRef N, Record *R) {
+void ClangOpcodesEmitter::EmitGroup(raw_ostream &OS, StringRef N,
+                                    const Record *R) {
   if (!R->getValueAsBit("HasGroup"))
     return;
 
   auto *Types = R->getValueAsListInit("Types");
   auto Args = R->getValueAsListOfDefs("Args");
 
+  Twine EmitFuncName = "emit" + N;
+
   // Emit the prototype of the group emitter in the header.
   OS << "#if defined(GET_EVAL_PROTO) || defined(GET_LINK_PROTO)\n";
-  OS << "bool emit" << N << "(";
+  OS << "bool " << EmitFuncName << "(";
   for (size_t I = 0, N = Types->size(); I < N; ++I)
     OS << "PrimType, ";
   for (auto *Arg : Args)
@@ -264,7 +273,7 @@ void ClangOpcodesEmitter::EmitGroup(raw_ostream &OS, StringRef N, Record *R) {
   OS << "#else\n";
   OS << "ByteCodeEmitter\n";
   OS << "#endif\n";
-  OS << "::emit" << N << "(";
+  OS << "::" << EmitFuncName << "(";
   for (size_t I = 0, N = Types->size(); I < N; ++I)
     OS << "PrimType T" << I << ", ";
   for (size_t I = 0, N = Args.size(); I < N; ++I)
@@ -272,8 +281,9 @@ void ClangOpcodesEmitter::EmitGroup(raw_ostream &OS, StringRef N, Record *R) {
   OS << "const SourceInfo &I) {\n";
 
   std::function<void(size_t, const Twine &)> Rec;
-  llvm::SmallVector<Record *, 2> TS;
-  Rec = [this, &Rec, &OS, Types, &Args, R, &TS, N](size_t I, const Twine &ID) {
+  llvm::SmallVector<const Record *, 2> TS;
+  Rec = [this, &Rec, &OS, Types, &Args, R, &TS, N,
+         EmitFuncName](size_t I, const Twine &ID) {
     if (I >= Types->size()) {
       // Print a call to the emitter method.
       // Custom evaluator methods dispatch to template methods.
@@ -309,7 +319,8 @@ void ClangOpcodesEmitter::EmitGroup(raw_ostream &OS, StringRef N, Record *R) {
       }
       // Emit a default case if not all types are present.
       if (Cases.size() < NumTypes)
-        OS << "  default: llvm_unreachable(\"invalid type\");\n";
+        OS << "  default: llvm_unreachable(\"invalid type: " << EmitFuncName
+           << "\");\n";
       OS << "  }\n";
       OS << "  llvm_unreachable(\"invalid enum value\");\n";
     } else {
@@ -322,34 +333,37 @@ void ClangOpcodesEmitter::EmitGroup(raw_ostream &OS, StringRef N, Record *R) {
   OS << "#endif\n";
 }
 
-void ClangOpcodesEmitter::EmitEval(raw_ostream &OS, StringRef N, Record *R) {
+void ClangOpcodesEmitter::EmitEval(raw_ostream &OS, StringRef N,
+                                   const Record *R) {
   if (R->getValueAsBit("HasCustomEval"))
     return;
 
   OS << "#ifdef GET_EVAL_IMPL\n";
-  Enumerate(R, N, [this, R, &N, &OS](ArrayRef<Record *> TS, const Twine &ID) {
-    auto Args = R->getValueAsListOfDefs("Args");
-
-    OS << "bool EvalEmitter::emit" << ID << "(";
-    for (size_t I = 0, N = Args.size(); I < N; ++I)
-      OS << Args[I]->getValueAsString("Name") << " A" << I << ", ";
-    OS << "const SourceInfo &L) {\n";
-    OS << "  if (!isActive()) return true;\n";
-    OS << "  CurrentSource = L;\n";
-
-    OS << "  return " << N;
-    PrintTypes(OS, TS);
-    OS << "(S, OpPC";
-    for (size_t I = 0, N = Args.size(); I < N; ++I)
-      OS << ", A" << I;
-    OS << ");\n";
-    OS << "}\n";
-  });
+  Enumerate(R, N,
+            [this, R, &N, &OS](ArrayRef<const Record *> TS, const Twine &ID) {
+              auto Args = R->getValueAsListOfDefs("Args");
+
+              OS << "bool EvalEmitter::emit" << ID << "(";
+              for (size_t I = 0, N = Args.size(); I < N; ++I)
+                OS << Args[I]->getValueAsString("Name") << " A" << I << ", ";
+              OS << "const SourceInfo &L) {\n";
+              OS << "  if (!isActive()) return true;\n";
+              OS << "  CurrentSource = L;\n";
+
+              OS << "  return " << N;
+              PrintTypes(OS, TS);
+              OS << "(S, OpPC";
+              for (size_t I = 0, N = Args.size(); I < N; ++I)
+                OS << ", A" << I;
+              OS << ");\n";
+              OS << "}\n";
+            });
 
   OS << "#endif\n";
 }
 
-void ClangOpcodesEmitter::PrintTypes(raw_ostream &OS, ArrayRef<Record *> Types) {
+void ClangOpcodesEmitter::PrintTypes(raw_ostream &OS,
+                                     ArrayRef<const Record *> Types) {
   if (Types.empty())
     return;
   OS << "<";


        


More information about the cfe-commits mailing list