[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC64AsmPrinter.cpp

Misha Brukman brukman at cs.uiuc.edu
Wed Aug 11 18:01:23 PDT 2004



Changes in directory llvm/lib/Target/PowerPC:

PPC64AsmPrinter.cpp updated: 1.1 -> 1.2
---
Log message:

Correctly print out ASCII literal strings on AIX


---
Diffs of the changes:  (+48 -22)

Index: llvm/lib/Target/PowerPC/PPC64AsmPrinter.cpp
diff -u llvm/lib/Target/PowerPC/PPC64AsmPrinter.cpp:1.1 llvm/lib/Target/PowerPC/PPC64AsmPrinter.cpp:1.2
--- llvm/lib/Target/PowerPC/PPC64AsmPrinter.cpp:1.1	Wed Aug 11 18:42:15 2004
+++ llvm/lib/Target/PowerPC/PPC64AsmPrinter.cpp	Wed Aug 11 20:01:13 2004
@@ -115,39 +115,67 @@
   return (X&7)+'0';
 }
 
+// Possible states while outputting ASCII strings
+namespace {
+  enum StringSection {
+    None,
+    Alpha,
+    Numeric
+  };
+}
+
+/// SwitchStringSection - manage the changes required to output bytes as
+/// characters in a string vs. numeric decimal values
+/// 
+static inline void SwitchStringSection(std::ostream &O, StringSection NewSect,
+                                       StringSection &Current) {
+  if (Current == None) {
+    if (NewSect == Alpha)
+      O << "\t.byte \"";
+    else if (NewSect == Numeric)
+      O << "\t.byte ";
+  } else if (Current == Alpha) {
+    if (NewSect == None)
+      O << "\"";
+    else if (NewSect == Numeric) 
+      O << "\"\n"
+        << "\t.byte ";
+  } else if (Current == Numeric) {
+    if (NewSect == Alpha)
+      O << '\n'
+        << "\t.byte \"";
+    else if (NewSect == Numeric)
+      O << ", ";
+  }
+
+  Current = NewSect;
+}
+
 /// getAsCString - Return the specified array as a C compatible
 /// string, only if the predicate isStringCompatible is true.
 ///
 static void printAsCString(std::ostream &O, const ConstantArray *CVA) {
   assert(isStringCompatible(CVA) && "Array is not string compatible!");
 
-  O << "\"";
-  for (unsigned i = 0; i < CVA->getNumOperands(); ++i) {
-    unsigned char C = cast<ConstantInt>(CVA->getOperand(i))->getRawValue();
+  if (CVA->getNumOperands() == 0)
+    return;
 
+  StringSection Current = None;
+  for (unsigned i = 0, e = CVA->getNumOperands(); i != e; ++i) {
+    unsigned char C = cast<ConstantInt>(CVA->getOperand(i))->getRawValue();
     if (C == '"') {
-      O << "\\\"";
-    } else if (C == '\\') {
-      O << "\\\\";
+      SwitchStringSection(O, Alpha, Current);
+      O << "\"\"";
     } else if (isprint(C)) {
+      SwitchStringSection(O, Alpha, Current);
       O << C;
     } else {
-      switch (C) {
-      case '\b': O << "\\b"; break;
-      case '\f': O << "\\f"; break;
-      case '\n': O << "\\n"; break;
-      case '\r': O << "\\r"; break;
-      case '\t': O << "\\t"; break;
-      default:
-        O << '\\';
-        O << toOctal(C >> 6);
-        O << toOctal(C >> 3);
-        O << toOctal(C >> 0);
-        break;
-      }
+      SwitchStringSection(O, Numeric, Current);
+      O << utostr((unsigned)C);
     }
   }
-  O << "\"";
+  SwitchStringSection(O, None, Current);
+  O << '\n';
 }
 
 // Print out the specified constant, without a storage class.  Only the
@@ -227,9 +255,7 @@
 
   if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV)) {
     if (isStringCompatible(CVA)) {
-      O << "\t.byte ";
       printAsCString(O, CVA);
-      O << "\n";
     } else { // Not a string.  Print the values in successive locations
       for (unsigned i=0, e = CVA->getNumOperands(); i != e; i++)
         emitGlobalConstant(CVA->getOperand(i));






More information about the llvm-commits mailing list