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

Reid Spencer reid at x10sys.com
Sat May 19 00:25:39 PDT 2007



Changes in directory llvm/lib/VMCore:

AsmWriter.cpp updated: 1.282 -> 1.283
---
Log message:

Adjust how LLVM names are produced:
1. Always use % for local and @ for global.
2. Replace NameNeedsQuotes with QuoteNameIfNeeded so that any adjustments
   to the name can be done in one pass.
3. Implement generation of hex escapes so we don't get "wonky" characters
   in the output.


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

 AsmWriter.cpp |   52 +++++++++++++++++++++++++++++++++-------------------
 1 files changed, 33 insertions(+), 19 deletions(-)


Index: llvm/lib/VMCore/AsmWriter.cpp
diff -u llvm/lib/VMCore/AsmWriter.cpp:1.282 llvm/lib/VMCore/AsmWriter.cpp:1.283
--- llvm/lib/VMCore/AsmWriter.cpp:1.282	Wed May  2 20:11:54 2007
+++ llvm/lib/VMCore/AsmWriter.cpp	Sat May 19 02:25:21 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,39 @@
 
 /// 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 (isprint(C)) {
+      needsQuotes = true;
+      result += C;
+    } else {
+      needsQuotes = true;
+      result += "\\";
+      char hex1 = C & 0x0F;
+      if (hex1 < 10)
+        result += hex1 + '0';
+      else 
+        result += hex1 - 10 + 'A';
+      char hex2 = (C >> 4) & 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 +225,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