diff options
author | Chris Lattner <sabre@nondot.org> | 2010-01-25 18:58:59 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-01-25 18:58:59 +0000 |
commit | a6594fc7156c0afbe6fd5a6aab9b099aaf950c53 (patch) | |
tree | 9fc791f856e67f36af15b2103a478ebdc379f484 /lib/MC/MCAsmStreamer.cpp | |
parent | a800f7c464ef9a376057a555129f36d1f8488c3b (diff) | |
download | external_llvm-a6594fc7156c0afbe6fd5a6aab9b099aaf950c53.zip external_llvm-a6594fc7156c0afbe6fd5a6aab9b099aaf950c53.tar.gz external_llvm-a6594fc7156c0afbe6fd5a6aab9b099aaf950c53.tar.bz2 |
mcstreamerize .file and .file. This also fixes an issue where the
normal form of .file would fail if the filename had a weird character
in it.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94437 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCAsmStreamer.cpp')
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 86 |
1 files changed, 56 insertions, 30 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 9d9f46a..f9a3128 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -120,9 +120,12 @@ public: virtual void EmitValueToOffset(const MCExpr *Offset, unsigned char Value = 0); - - virtual void EmitInstruction(const MCInst &Inst); + virtual void EmitFileDirective(StringRef Filename); + virtual void EmitDwarfFileDirective(unsigned FileNo, StringRef Filename); + + virtual void EmitInstruction(const MCInst &Inst); + virtual void Finish(); /// @} @@ -320,6 +323,40 @@ void MCAsmStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol, static inline char toOctal(int X) { return (X&7)+'0'; } +static void PrintQuotedString(StringRef Data, raw_ostream &OS) { + 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 << '"'; +} + + void MCAsmStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) { assert(CurSection && "Cannot emit contents before setting section!"); if (Data.empty()) return; @@ -340,34 +377,8 @@ void MCAsmStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) { 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 << '"'; + OS << ' '; + PrintQuotedString(Data, OS); EmitEOL(); } @@ -492,6 +503,21 @@ void MCAsmStreamer::EmitValueToOffset(const MCExpr *Offset, EmitEOL(); } + +void MCAsmStreamer::EmitFileDirective(StringRef Filename) { + assert(MAI.hasSingleParameterDotFile()); + OS << "\t.file\t"; + PrintQuotedString(Filename, OS); + EmitEOL(); +} + +void MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, StringRef Filename){ + OS << "\t.file\t" << FileNo << ' '; + PrintQuotedString(Filename, OS); + EmitEOL(); +} + + void MCAsmStreamer::EmitInstruction(const MCInst &Inst) { assert(CurSection && "Cannot emit contents before setting section!"); |