diff options
-rw-r--r-- | lib/MC/MCSymbol.cpp | 17 | ||||
-rw-r--r-- | lib/Target/Mangler.cpp | 36 | ||||
-rw-r--r-- | test/CodeGen/X86/newline-and-quote.ll | 6 |
3 files changed, 21 insertions, 38 deletions
diff --git a/lib/MC/MCSymbol.cpp b/lib/MC/MCSymbol.cpp index b973c57..2416525 100644 --- a/lib/MC/MCSymbol.cpp +++ b/lib/MC/MCSymbol.cpp @@ -68,12 +68,23 @@ void MCSymbol::print(raw_ostream &OS) const { // The name for this MCSymbol is required to be a valid target name. However, // some targets support quoting names with funny characters. If the name // contains a funny character, then print it quoted. - if (!NameNeedsQuoting(getName())) { - OS << getName(); + StringRef Name = getName(); + if (!NameNeedsQuoting(Name)) { + OS << Name; return; } - OS << '"' << getName() << '"'; + OS << '"'; + for (unsigned I = 0, E = Name.size(); I != E; ++I) { + char C = Name[I]; + if (C == '\n') + OS << "\\n"; + else if (C == '"') + OS << "\\\""; + else + OS << C; + } + OS << '"'; } #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) diff --git a/lib/Target/Mangler.cpp b/lib/Target/Mangler.cpp index 0fc1f23..38be25c 100644 --- a/lib/Target/Mangler.cpp +++ b/lib/Target/Mangler.cpp @@ -23,31 +23,6 @@ #include "llvm/Support/raw_ostream.h" using namespace llvm; -static char HexDigit(int V) { - return V < 10 ? V+'0' : V+'A'-10; -} - -static void MangleLetter(SmallVectorImpl<char> &OutName, unsigned char C) { - OutName.push_back('_'); - OutName.push_back(HexDigit(C >> 4)); - OutName.push_back(HexDigit(C & 15)); - OutName.push_back('_'); -} - -/// appendMangledQuotedName - 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 appendMangledQuotedName(SmallVectorImpl<char> &OutName, - StringRef Str) { - for (unsigned i = 0, e = Str.size(); i != e; ++i) { - if (Str[i] == '"' || Str[i] == '\n') - MangleLetter(OutName, Str[i]); - else - OutName.push_back(Str[i]); - } -} - - /// getNameWithPrefix - Fill OutName with the name of the appropriate prefix /// and the specified name as the global variable name. GVName must not be /// empty. @@ -85,16 +60,7 @@ void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName, } // If this is a simple string that doesn't need escaping, just append it. - // Quotes can be used unless the string contains a quote or newline. - if (Name.find_first_of("\n\"") == StringRef::npos) { - OutName.append(Name.begin(), Name.end()); - return; - } - - // Okay, the system allows quoted strings. We can quote most anything, the - // only characters that need escaping are " and \n. - assert(Name.find_first_of("\n\"") != StringRef::npos); - return appendMangledQuotedName(OutName, Name); + OutName.append(Name.begin(), Name.end()); } /// AddFastCallStdCallSuffix - Microsoft fastcall and stdcall functions require diff --git a/test/CodeGen/X86/newline-and-quote.ll b/test/CodeGen/X86/newline-and-quote.ll new file mode 100644 index 0000000..9206e9f --- /dev/null +++ b/test/CodeGen/X86/newline-and-quote.ll @@ -0,0 +1,6 @@ +; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s +@"foo\22bar" = global i32 42 +; CHECK: .globl "foo\"bar" + +@"foo\0abar" = global i32 42 +; CHECK: .globl "foo\nbar" |