diff options
author | Chris Lattner <sabre@nondot.org> | 2009-09-13 18:11:09 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-09-13 18:11:09 +0000 |
commit | 4afcedfad11555e2c755a31eb04c0e5bdbb2a4a1 (patch) | |
tree | f69dfbdaae04f7fe5a2e388cc096ad1a80d85416 /lib/MC/MCSymbol.cpp | |
parent | e19f9783231d7881efbcf2876c11f7914cf516f1 (diff) |
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
Diffstat (limited to 'lib/MC/MCSymbol.cpp')
-rw-r--r-- | lib/MC/MCSymbol.cpp | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/lib/MC/MCSymbol.cpp b/lib/MC/MCSymbol.cpp index 64cc15af1b..832f8fbcbb 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 { |