forked from OSchip/llvm-project
teach MCAsmStreamer::EmitBytes to use .ascii and .asciz
llvm-svn: 94259
This commit is contained in:
parent
aa98ed9a07
commit
ded9af63bb
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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\\\""
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue