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

Chris Lattner lattner at cs.uiuc.edu
Thu Nov 10 13:40:12 PST 2005



Changes in directory llvm/lib/VMCore:

Mangler.cpp updated: 1.22 -> 1.23
---
Log message:

Allow per-character control over what target assemblers allow in symbol
names.  This also changes the default to allow all of "$_." in addition
to letters and numbers as symbol names.  If you don't want this, use 
markCharUnacceptable to remove one of these or markCharAcceptable to add
to the set.  This corresponds with what GAS accepts by default.

Also, this includes some minor speedups



---
Diffs of the changes:  (+25 -7)

 Mangler.cpp |   32 +++++++++++++++++++++++++-------
 1 files changed, 25 insertions(+), 7 deletions(-)


Index: llvm/lib/VMCore/Mangler.cpp
diff -u llvm/lib/VMCore/Mangler.cpp:1.22 llvm/lib/VMCore/Mangler.cpp:1.23
--- llvm/lib/VMCore/Mangler.cpp:1.22	Thu Nov 10 13:30:07 2005
+++ llvm/lib/VMCore/Mangler.cpp	Thu Nov 10 15:40:01 2005
@@ -22,7 +22,8 @@
 }
 
 static std::string MangleLetter(unsigned char C) {
-  return std::string("_")+HexDigit(C >> 4) + HexDigit(C & 15) + "_";
+  char Result[] = { '_', HexDigit(C >> 4), HexDigit(C & 15), '_', 0 };
+  return Result;
 }
 
 /// makeNameProper - We don't want identifier names non-C-identifier characters
@@ -30,6 +31,7 @@
 ///
 std::string Mangler::makeNameProper(const std::string &X, const char *Prefix) {
   std::string Result;
+  if (X.empty()) return X;  // Empty names are uniqued by the caller.
   
   if (!UseQuotes) {
     // If X does not start with (char)1, add the prefix.
@@ -39,16 +41,16 @@
     else
       ++I;  // Skip over the marker.
     
-    // Mangle the first letter specially, don't allow numbers...
+    // Mangle the first letter specially, don't allow numbers.
     if (*I >= '0' && *I <= '9')
       Result += MangleLetter(*I++);
 
-    for (std::string::const_iterator E = X.end(); I != E; ++I)
-      if ((*I < 'a' || *I > 'z') && (*I < 'A' || *I > 'Z') &&
-          (*I < '0' || *I > '9') && *I != '_' && *I != '$')
+    for (std::string::const_iterator E = X.end(); I != E; ++I) {
+      if (!isCharAcceptable(*I))
         Result += MangleLetter(*I);
       else
         Result += *I;
+    }
   } else {
     bool NeedsQuotes = false;
     
@@ -67,8 +69,7 @@
       if (*I == '"')
         Result += "_QQ_";
       else {
-        if ((*I < 'a' || *I > 'z') && (*I < 'A' || *I > 'Z') &&
-            (*I < '0' || *I > '9') && *I != '_' && *I != '$' && *I != '.')
+        if (!isCharAcceptable(*I))
           NeedsQuotes = true;
         Result += *I;
       }
@@ -147,6 +148,23 @@
 
 Mangler::Mangler(Module &M, const char *prefix)
   : Prefix(prefix), UseQuotes(false), Count(0), TypeCounter(0) {
+  std::fill(AcceptableChars, 
+          AcceptableChars+sizeof(AcceptableChars)/sizeof(AcceptableChars[0]),
+            0);
+
+  // Letters and numbers are acceptable.
+  for (unsigned char X = 'a'; X <= 'z'; ++X)
+    markCharAcceptable(X);
+  for (unsigned char X = 'A'; X <= 'Z'; ++X)
+    markCharAcceptable(X);
+  for (unsigned char X = '0'; X <= '9'; ++X)
+    markCharAcceptable(X);
+  
+  // These chars are acceptable.
+  markCharAcceptable('_');
+  markCharAcceptable('$');
+  markCharAcceptable('.');
+    
   // Calculate which global values have names that will collide when we throw
   // away type information.
   std::map<std::string, GlobalValue*> Names;






More information about the llvm-commits mailing list