From 88abcde3b47dcd9b64e8b0cd6558481d692609eb Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Thu, 10 Jan 2013 15:17:36 +0000 Subject: 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@172073 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/AsmMatcherEmitter.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp index bc0cf43..f0fb970 100644 --- a/utils/TableGen/AsmMatcherEmitter.cpp +++ b/utils/TableGen/AsmMatcherEmitter.cpp @@ -1658,6 +1658,16 @@ void MatchableInfo::buildAliasResultOperands() { } } +// 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 &Table, bool &IsNew) { @@ -1754,7 +1764,7 @@ static void emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName, // 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()); @@ -1762,7 +1772,7 @@ static void emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName, 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 @@ static void emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName, // 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, -- cgit v1.1