[llvm-commits] [llvm] r172073 - /llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp

Tim Northover Tim.Northover at arm.com
Thu Jan 10 07:17:36 PST 2013


Author: tnorthover
Date: Thu Jan 10 09:17:36 2013
New Revision: 172073

URL: http://llvm.org/viewvc/llvm-project?rev=172073&view=rev
Log:
Make TableGen mangle operand method names before putting in enum.

The purpose of this patch is to allow PredicateMethods to be set to something
like "isUImm<8>", calling a C++ template method to reduce code duplication. For
this to work, the PredicateMethod must be mangled into a valid C++ identifier
for insertion into an enum.

Modified:
    llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp

Modified: llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp?rev=172073&r1=172072&r2=172073&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp Thu Jan 10 09:17:36 2013
@@ -1658,6 +1658,16 @@
   }
 }
 
+// Modify a string so that it is suitable for use as an enum tag.
+static std::string mangle(const std::string &Name) {
+  std::string MangledName = Name;
+  for (unsigned i = 0; i < MangledName.size(); ++i) {
+    if (!isalnum(MangledName[i]) && MangledName[i] != '_')
+      MangledName[i] = '_';
+  }
+  return MangledName;
+}
+
 static unsigned getConverterOperandID(const std::string &Name,
                                       SetVector<std::string> &Table,
                                       bool &IsNew) {
@@ -1754,7 +1764,7 @@
 
       // Remember this converter for the kind enum.
       unsigned KindID = OperandConversionKinds.size();
-      OperandConversionKinds.insert("CVT_" + AsmMatchConverter);
+      OperandConversionKinds.insert("CVT_" + mangle(AsmMatchConverter));
 
       // Add the converter row for this instruction.
       ConversionTable.push_back(std::vector<uint8_t>());
@@ -1762,7 +1772,7 @@
       ConversionTable.back().push_back(CVT_Done);
 
       // Add the handler to the conversion driver function.
-      CvtOS << "    case CVT_" << AsmMatchConverter << ":\n"
+      CvtOS << "    case CVT_" << mangle(AsmMatchConverter) << ":\n"
             << "      " << AsmMatchConverter << "(Inst, Operands);\n"
             << "      break;\n";
 
@@ -1800,6 +1810,7 @@
         // the index of its entry in the vector).
         std::string Name = "CVT_" + (Op.Class->isRegisterClass() ? "Reg" :
                                      Op.Class->RenderMethod);
+        Name = mangle(Name);
 
         bool IsNewConverter = false;
         unsigned ID = getConverterOperandID(Name, OperandConversionKinds,





More information about the llvm-commits mailing list