teach MCAsmStreamer::EmitBytes to use .ascii and .asciz

llvm-svn: 94259
This commit is contained in:
Chris Lattner 2010-01-23 00:15:00 +00:00
parent aa98ed9a07
commit ded9af63bb
3 changed files with 50 additions and 21 deletions

View File

@ -101,7 +101,7 @@ namespace llvm {
/// Emit - Print the abbreviation using the specified asm printer. /// Emit - Print the abbreviation using the specified asm printer.
/// ///
void Emit(const DwarfPrinter *Asm) const; void Emit(const DwarfPrinter *DP) const;
#ifndef NDEBUG #ifndef NDEBUG
void print(raw_ostream &O); void print(raw_ostream &O);

View File

@ -271,13 +271,57 @@ void MCAsmStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol,
EmitEOL(); EmitEOL();
} }
static inline char toOctal(int X) { return (X&7)+'0'; }
void MCAsmStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) { void MCAsmStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) {
assert(CurSection && "Cannot emit contents before setting section!"); assert(CurSection && "Cannot emit contents before setting section!");
const char *Directive = MAI.getData8bitsDirective(AddrSpace); if (Data.empty()) return;
for (unsigned i = 0, e = Data.size(); i != e; ++i) {
OS << Directive << (unsigned)(unsigned char)Data[i]; if (Data.size() == 1) {
OS << MAI.getData8bitsDirective(AddrSpace);
OS << (unsigned)(unsigned char)Data[0];
EmitEOL(); 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 /// EmitIntValue - Special case of EmitValue that avoids the client having

View File

@ -23,27 +23,12 @@ TEST3:
.asciz "B", "C" .asciz "B", "C"
# CHECK: TEST4: # CHECK: TEST4:
# CHECK: .byte 1 # CHECK: .asciz "\001\001\007\0008\001\0001\200"
# 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
TEST4: TEST4:
.ascii "\1\01\07\08\001\0001\200\0" .ascii "\1\01\07\08\001\0001\200\0"
# CHECK: TEST5: # CHECK: TEST5:
# CHECK: .byte 8 # CHECK: .ascii "\b\f\n\r\t\\\""
# CHECK: .byte 12
# CHECK: .byte 10
# CHECK: .byte 13
# CHECK: .byte 9
# CHECK: .byte 92
# CHECK: .byte 34
TEST5: TEST5:
.ascii "\b\f\n\r\t\\\"" .ascii "\b\f\n\r\t\\\""