temporarily revert reid's asmwriter patch, it is missing the asmparser piece
authorChris Lattner <sabre@nondot.org>
Tue, 22 May 2007 07:00:50 +0000 (07:00 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 22 May 2007 07:00:50 +0000 (07:00 +0000)
that decodes the escape sequences, thus breaking all cases that use them.

This fixes test/Assembler/2007-05-21-Escape.ll

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

lib/VMCore/AsmWriter.cpp

index 1d97d5c54f3f48695231da75229dc7bb87cae14c..536b541dfa195c9bea77fb481339ff5b2b44abd2 100644 (file)
@@ -33,7 +33,6 @@
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/Streams.h"
 #include <algorithm>
-#include <cctype>
 using namespace llvm;
 
 namespace llvm {
@@ -179,39 +178,17 @@ static SlotMachine *createSlotMachine(const Value *V) {
 
 /// NameNeedsQuotes - Return true if the specified llvm name should be wrapped
 /// with ""'s.
-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.
+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"
   for (unsigned i = 0, e = Name.size(); i != e; ++i) {
     char C = Name[i];
     assert(C != '"' && "Illegal character in LLVM value name!");
-    if (isalnum(C) || C == '-' || C == '.' || C == '_')
-      result += C;
-    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 += '"';
+    if ((C < 'a' || C > 'z') && (C < 'A' || C > 'Z') && (C < '0' || C > '9') &&
+        C != '-' && C != '.' && C != '_')
+      return true;
   }
-  return result;
+  return false;
 }
 
 enum PrefixType {
@@ -225,11 +202,20 @@ enum PrefixType {
 /// 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 '@' + QuoteNameIfNeeded(Name);
-  case LabelPrefix:  return QuoteNameIfNeeded(Name);
-  case LocalPrefix:  return '%' + QuoteNameIfNeeded(Name);
+  case GlobalPrefix: return '@' + Name;
+  case LabelPrefix:  return Name;
+  case LocalPrefix:  return '%' + Name;
   }      
 }