From: Chris Lattner Date: Sun, 13 Sep 2009 18:11:09 +0000 (+0000) Subject: fix MCSymbol printing on darwin to exactly match the mangler (handling of \n and... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=4afcedfad11555e2c755a31eb04c0e5bdbb2a4a1;p=oota-llvm.git fix MCSymbol printing on darwin to exactly match the mangler (handling of \n and " in a symbol name). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81683 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/MCSymbol.cpp b/lib/MC/MCSymbol.cpp index 64cc15af1b1..832f8fbcbb4 100644 --- a/lib/MC/MCSymbol.cpp +++ b/lib/MC/MCSymbol.cpp @@ -65,6 +65,23 @@ static void PrintMangledName(raw_ostream &OS, StringRef Str) { } } +/// PrintMangledQuotedName - On systems that support quoted symbols, we still +/// have to escape some (obscure) characters like " and \n which would break the +/// assembler's lexing. +static void PrintMangledQuotedName(raw_ostream &OS, StringRef Str) { + OS << '"'; + + for (unsigned i = 0, e = Str.size(); i != e; ++i) { + if (Str[i] == '"') + OS << "_QQ_"; + else if (Str[i] == '\n') + OS << "_NL_"; + else + OS << Str[i]; + } + OS << '"'; +} + void MCSymbol::print(raw_ostream &OS, const MCAsmInfo *MAI) const { if (MAI == 0 || !NameNeedsEscaping(getName(), *MAI)) { @@ -72,14 +89,17 @@ void MCSymbol::print(raw_ostream &OS, const MCAsmInfo *MAI) const { return; } - // On darwin and other systems that allow quoted names, just do that. - if (MAI->doesAllowQuotesInName()) { - OS << '"' << getName() << '"'; - return; - } - - // Otherwise, we have to mangle the name. - PrintMangledName(OS, getName()); + // On systems that do not allow quoted names, print with mangling. + if (!MAI->doesAllowQuotesInName()) + return PrintMangledName(OS, getName()); + + // If the string contains a double quote or newline, we still have to mangle + // it. + if (getName().find('"') != std::string::npos || + getName().find('\n') != std::string::npos) + return PrintMangledQuotedName(OS, getName()); + + OS << '"' << getName() << '"'; } void MCSymbol::dump() const {