Fix escaping in asm string literals correctly by having tblgen unescape
authorChris Lattner <sabre@nondot.org>
Fri, 13 Mar 2009 21:33:17 +0000 (21:33 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 Mar 2009 21:33:17 +0000 (21:33 +0000)
them, then the asmprinter emitter reescape them.

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

utils/TableGen/AsmWriterEmitter.cpp
utils/TableGen/TGLexer.cpp

index e7fe8c369bd7174353246628539997c90a70378d..93ef6c86a6b1c8cb3f2548676bc3a5cfafc5ada3 100644 (file)
@@ -130,11 +130,20 @@ AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, unsigned Variant) {
 
     // Emit a constant string fragment.
     if (DollarPos != LastEmitted) {
-      // TODO: this should eventually handle escaping.
-      if (CurVariant == Variant || CurVariant == ~0U)
-        AddLiteralString(std::string(AsmString.begin()+LastEmitted,
-                                     AsmString.begin()+DollarPos));
-      LastEmitted = DollarPos;
+      if (CurVariant == Variant || CurVariant == ~0U) {
+        for (; LastEmitted != DollarPos; ++LastEmitted)
+          switch (AsmString[LastEmitted]) {
+          case '\n': AddLiteralString("\\n"); break;
+          case '\t': AddLiteralString("\\t"); break;
+          case '"': AddLiteralString("\\\""); break;
+          case '\\': AddLiteralString("\\\\"); break;
+          default:
+            AddLiteralString(std::string(1, AsmString[LastEmitted]));
+            break;
+          }
+      } else {
+        LastEmitted = DollarPos;
+      }
     } else if (AsmString[DollarPos] == '\\') {
       if (DollarPos+1 != AsmString.size() &&
           (CurVariant == Variant || CurVariant == ~0U)) {
index 03bf0ceaa6b6c2aeded102edc388b4e9e95dc2e0..79982aa05f52684744f8a4599b04658afedf9166 100644 (file)
@@ -174,11 +174,11 @@ tgtok::TokKind TGLexer::LexString() {
       CurStrVal += *CurPtr++;
       break;
     case 't':
-      CurStrVal += "\\t";
+      CurStrVal += '\t';
       ++CurPtr;
       break;
     case 'n':
-      CurStrVal += "\\n";
+      CurStrVal += '\n';
       ++CurPtr;
       break;