[llvm-commits] CVS: llvm/lib/VMCore/AsmWriter.cpp

Reid Spencer reid at x10sys.com
Tue May 22 12:27:53 PDT 2007



Changes in directory llvm/lib/VMCore:

AsmWriter.cpp updated: 1.285 -> 1.286
---
Log message:

Reinstate the patch for escaping non-printing characters and allow for
\\ to escape \. All these cases are now handled by the AsmParser.


---
Diffs of the changes:  (+36 -19)

 AsmWriter.cpp |   55 ++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 36 insertions(+), 19 deletions(-)


Index: llvm/lib/VMCore/AsmWriter.cpp
diff -u llvm/lib/VMCore/AsmWriter.cpp:1.285 llvm/lib/VMCore/AsmWriter.cpp:1.286
--- llvm/lib/VMCore/AsmWriter.cpp:1.285	Tue May 22 02:00:50 2007
+++ llvm/lib/VMCore/AsmWriter.cpp	Tue May 22 14:27:35 2007
@@ -33,6 +33,7 @@
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/Streams.h"
 #include <algorithm>
+#include <cctype>
 using namespace llvm;
 
 namespace llvm {
@@ -178,17 +179,42 @@
 
 /// NameNeedsQuotes - Return true if the specified llvm name should be wrapped
 /// with ""'s.
-static bool NameNeedsQuotes(const std::string &Name) {
-  if (Name[0] >= '0' && Name[0] <= '9') return true;
-  // Scan to see if we have any characters that are not on the "white list"
+static std::string QuoteNameIfNeeded(const std::string &Name) {
+  std::string result;
+  bool needsQuotes = Name[0] >= '0' && Name[0] <= '9';
+  // Scan the name to see if it needs quotes and to replace funky chars with
+  // their octal equivalent.
   for (unsigned i = 0, e = Name.size(); i != e; ++i) {
     char C = Name[i];
     assert(C != '"' && "Illegal character in LLVM value name!");
-    if ((C < 'a' || C > 'z') && (C < 'A' || C > 'Z') && (C < '0' || C > '9') &&
-        C != '-' && C != '.' && C != '_')
-      return true;
+    if (isalnum(C) || C == '-' || C == '.' || C == '_')
+      result += C;
+    else if (C == '\\')  {
+      needsQuotes = true;
+      result += "\\\\";
+    } else if (isprint(C)) {
+      needsQuotes = true;
+      result += C;
+    } else {
+      needsQuotes = true;
+      result += "\\";
+      char hex1 = (C >> 4) & 0x0F;
+      if (hex1 < 10)
+        result += hex1 + '0';
+      else 
+        result += hex1 - 10 + 'A';
+      char hex2 = C & 0x0F;
+      if (hex2 < 10)
+        result += hex2 + '0';
+      else 
+        result += hex2 - 10 + 'A';
+    }
+  }
+  if (needsQuotes) {
+    result.insert(0,"\"");
+    result += '"';
   }
-  return false;
+  return result;
 }
 
 enum PrefixType {
@@ -202,20 +228,11 @@
 /// surrounded with ""'s (if it has special chars in it).
 static std::string getLLVMName(const std::string &Name, PrefixType Prefix) {
   assert(!Name.empty() && "Cannot get empty name!");
-
-  // First character cannot start with a number...
-  if (NameNeedsQuotes(Name)) {
-    if (Prefix == GlobalPrefix)
-      return "@\"" + Name + "\"";
-    return "\"" + Name + "\"";
-  }
-
-  // If we get here, then the identifier is legal to use as a "VarID".
   switch (Prefix) {
   default: assert(0 && "Bad prefix!");
-  case GlobalPrefix: return '@' + Name;
-  case LabelPrefix:  return Name;
-  case LocalPrefix:  return '%' + Name;
+  case GlobalPrefix: return '@' + QuoteNameIfNeeded(Name);
+  case LabelPrefix:  return QuoteNameIfNeeded(Name);
+  case LocalPrefix:  return '%' + QuoteNameIfNeeded(Name);
   }      
 }
 






More information about the llvm-commits mailing list