OSDN Git Service

Add support for a TODO; instructions in .td files can now have arguments
authorNate Begeman <natebegeman@mac.com>
Thu, 14 Jul 2005 22:50:30 +0000 (22:50 +0000)
committerNate Begeman <natebegeman@mac.com>
Thu, 14 Jul 2005 22:50:30 +0000 (22:50 +0000)
printed as part of the opcode.  This allows something like
cmp${cc}ss in the x86 backed to be printed as cmpltss, cmpless, etc.
depending on what the value of $cc is.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22439 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/AsmWriterEmitter.cpp

index 41ecc40..34aaf15 100644 (file)
@@ -155,12 +155,35 @@ AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, unsigned Variant) {
       LastEmitted = DollarPos+2;
     } else {
       // Get the name of the variable.
-      // TODO: should eventually handle ${foo}bar as $foo
       std::string::size_type VarEnd = DollarPos+1;
+
+      // handle ${foo}bar as $foo by detecting whether the character following
+      // the dollar sign is a curly brace.  If so, advance VarEnd and DollarPos
+      // so the variable name does not contain the leading curly brace.
+      bool hasCurlyBraces = false;
+      if (VarEnd < AsmString.size() && '{' == AsmString[VarEnd]) {
+        hasCurlyBraces = true;
+        ++DollarPos;
+        ++VarEnd;
+      }
+
       while (VarEnd < AsmString.size() && isIdentChar(AsmString[VarEnd]))
         ++VarEnd;
       std::string VarName(AsmString.begin()+DollarPos+1,
                           AsmString.begin()+VarEnd);
+
+      // In order to avoid starting the next string at the terminating curly
+      // brace, advance the end position past it if we found an opening curly
+      // brace.
+      if (hasCurlyBraces) {
+        if (VarEnd >= AsmString.size())
+          throw "Reached end of string before terminating curly brace in '"
+                + CGI.Name + "'";
+        if (AsmString[VarEnd] != '}')
+          throw "Variant name beginning with '{' did not end with '}' in '"
+                + CGI.Name + "'";
+        ++VarEnd;
+      }
       if (VarName.empty())
         throw "Stray '$' in '" + CGI.Name + "' asm string, maybe you want $$?";