[llvm-commits] [llvm] r94259 - in /llvm/trunk: lib/CodeGen/AsmPrinter/DIE.h lib/MC/MCAsmStreamer.cpp test/MC/AsmParser/directive_ascii.s

Chris Lattner sabre at nondot.org
Fri Jan 22 16:15:00 PST 2010


Author: lattner
Date: Fri Jan 22 18:15:00 2010
New Revision: 94259

URL: http://llvm.org/viewvc/llvm-project?rev=94259&view=rev
Log:
teach MCAsmStreamer::EmitBytes to use .ascii and .asciz

Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h
    llvm/trunk/lib/MC/MCAsmStreamer.cpp
    llvm/trunk/test/MC/AsmParser/directive_ascii.s

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h?rev=94259&r1=94258&r2=94259&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h Fri Jan 22 18:15:00 2010
@@ -101,7 +101,7 @@
 
     /// Emit - Print the abbreviation using the specified asm printer.
     ///
-    void Emit(const DwarfPrinter *Asm) const;
+    void Emit(const DwarfPrinter *DP) const;
 
 #ifndef NDEBUG
     void print(raw_ostream &O);

Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=94259&r1=94258&r2=94259&view=diff

==============================================================================
--- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Fri Jan 22 18:15:00 2010
@@ -271,13 +271,57 @@
   EmitEOL();
 }
 
+static inline char toOctal(int X) { return (X&7)+'0'; }
+
 void MCAsmStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) {
   assert(CurSection && "Cannot emit contents before setting section!");
-  const char *Directive = MAI.getData8bitsDirective(AddrSpace);
-  for (unsigned i = 0, e = Data.size(); i != e; ++i) {
-    OS << Directive << (unsigned)(unsigned char)Data[i];
+  if (Data.empty()) return;
+  
+  if (Data.size() == 1) {
+    OS << MAI.getData8bitsDirective(AddrSpace);
+    OS << (unsigned)(unsigned char)Data[0];
     EmitEOL();
+    return;
   }
+
+  // If the data ends with 0 and the target supports .asciz, use it, otherwise
+  // use .ascii
+  if (MAI.getAscizDirective() && Data.back() == 0) {
+    OS << MAI.getAscizDirective();
+    Data = Data.substr(0, Data.size()-1);
+  } else {
+    OS << MAI.getAsciiDirective();
+  }
+
+  OS << " \"";
+  for (unsigned i = 0, e = Data.size(); i != e; ++i) {
+    unsigned char C = Data[i];
+    if (C == '"' || C == '\\') {
+      OS << '\\' << (char)C;
+      continue;
+    }
+    
+    if (isprint((unsigned char)C)) {
+      OS << (char)C;
+      continue;
+    }
+    
+    switch (C) {
+    case '\b': OS << "\\b"; break;
+    case '\f': OS << "\\f"; break;
+    case '\n': OS << "\\n"; break;
+    case '\r': OS << "\\r"; break;
+    case '\t': OS << "\\t"; break;
+    default:
+      OS << '\\';
+      OS << toOctal(C >> 6);
+      OS << toOctal(C >> 3);
+      OS << toOctal(C >> 0);
+      break;
+    }
+  }
+  OS << '"';
+  EmitEOL();
 }
 
 /// EmitIntValue - Special case of EmitValue that avoids the client having

Modified: llvm/trunk/test/MC/AsmParser/directive_ascii.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/directive_ascii.s?rev=94259&r1=94258&r2=94259&view=diff

==============================================================================
--- llvm/trunk/test/MC/AsmParser/directive_ascii.s (original)
+++ llvm/trunk/test/MC/AsmParser/directive_ascii.s Fri Jan 22 18:15:00 2010
@@ -23,27 +23,12 @@
         .asciz "B", "C"
         
 # CHECK: TEST4:
-# CHECK: .byte 1
-# CHECK: .byte 1
-# CHECK: .byte 7
-# CHECK: .byte 0
-# CHECK: .byte 56
-# CHECK: .byte 1
-# CHECK: .byte 0
-# CHECK: .byte 49
-# CHECK: .byte 128
-# CHECK: .byte 0
+# CHECK: .asciz "\001\001\007\0008\001\0001\200"
 TEST4:  
         .ascii "\1\01\07\08\001\0001\200\0"
         
 # CHECK: TEST5:
-# CHECK: .byte 8
-# CHECK: .byte 12
-# CHECK: .byte 10
-# CHECK: .byte 13
-# CHECK: .byte 9
-# CHECK: .byte 92
-# CHECK: .byte 34
+# CHECK: .ascii "\b\f\n\r\t\\\""
 TEST5:
         .ascii "\b\f\n\r\t\\\""
         





More information about the llvm-commits mailing list