add support for .asciz, and enable it by default. If your target assemblerdoesn...
authorChris Lattner <sabre@nondot.org>
Thu, 10 Nov 2005 18:06:33 +0000 (18:06 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 10 Nov 2005 18:06:33 +0000 (18:06 +0000)
This compiles C strings to:

l1__2E_str_1:                           ; '.str_1'
        .asciz  "foo"

instead of:

l1__2E_str_1:                           ; '.str_1'
        .ascii  "foo\000"

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

lib/CodeGen/AsmPrinter.cpp

index d907d67b5a2839daa9a27d554721bace32dcc6f7..ae569bd15ae7bb4ea0c7f43bf5f0fbdb3268887b 100644 (file)
@@ -141,14 +141,15 @@ static inline char toOctal(int X) {
   return (X&7)+'0';
 }
 
-/// getAsCString - Return the specified array as a C compatible string, only if
+/// printAsCString - Print the specified array as a C compatible string, only if
 /// the predicate isString is true.
 ///
-static void printAsCString(std::ostream &O, const ConstantArray *CVA) {
+static void printAsCString(std::ostream &O, const ConstantArray *CVA,
+                           unsigned LastElt) {
   assert(CVA->isString() && "Array is not string compatible!");
 
   O << "\"";
-  for (unsigned i = 0; i != CVA->getNumOperands(); ++i) {
+  for (unsigned i = 0; i != LastElt; ++i) {
     unsigned char C =
         (unsigned char)cast<ConstantInt>(CVA->getOperand(i))->getRawValue();
 
@@ -187,8 +188,15 @@ void AsmPrinter::emitGlobalConstant(const Constant *CV) {
     return;
   } else if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV)) {
     if (CVA->isString()) {
-      O << AsciiDirective;
-      printAsCString(O, CVA);
+      unsigned NumElts = CVA->getNumOperands();
+      if (AscizDirective && NumElts && 
+          cast<ConstantInt>(CVA->getOperand(NumElts-1))->getRawValue() == 0) {
+        O << AscizDirective;
+        printAsCString(O, CVA, NumElts-1);
+      } else {
+        O << AsciiDirective;
+        printAsCString(O, CVA, NumElts);
+      }
       O << "\n";
     } else { // Not a string.  Print the values in successive locations
       for (unsigned i = 0, e = CVA->getNumOperands(); i != e; ++i)