diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-11-13 14:01:59 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-11-13 14:01:59 +0000 |
commit | de9a1a2055851a0f0a88e459cd23a246a90efd45 (patch) | |
tree | dd4e2b5072fd4a527b5c39f3f64d8f07032a6c45 | |
parent | 7af43e0ad01a5f85f9066b69faba990a72f89536 (diff) | |
download | external_llvm-de9a1a2055851a0f0a88e459cd23a246a90efd45.tar.gz external_llvm-de9a1a2055851a0f0a88e459cd23a246a90efd45.tar.bz2 external_llvm-de9a1a2055851a0f0a88e459cd23a246a90efd45.zip |
Remove AllowQuotesInName and friends from MCAsmInfo.
Accepting quotes is a property of an assembler, not of an object file. For
example, ELF can support any names for sections and symbols, but the gnu
assembler only accepts quotes in some contexts and llvm-mc in a few more.
LLVM should not produce different symbols based on a guess about which assembler
will be reading the code it is printing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194575 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/MC/MCAsmInfo.h | 21 | ||||
-rw-r--r-- | lib/MC/MCAsmInfo.cpp | 3 | ||||
-rw-r--r-- | lib/MC/MCAsmInfoCOFF.cpp | 1 | ||||
-rw-r--r-- | lib/MC/MCAsmInfoDarwin.cpp | 1 | ||||
-rw-r--r-- | lib/MC/MCSectionELF.cpp | 53 | ||||
-rw-r--r-- | lib/Target/MSP430/MCTargetDesc/MSP430MCAsmInfo.cpp | 1 | ||||
-rw-r--r-- | lib/Target/Mangler.cpp | 67 | ||||
-rw-r--r-- | lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp | 2 | ||||
-rw-r--r-- | lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.cpp | 3 | ||||
-rw-r--r-- | test/CodeGen/X86/GC/ocaml-gc.ll | 20 | ||||
-rw-r--r-- | test/CodeGen/X86/global-sections.ll | 8 |
11 files changed, 48 insertions, 132 deletions
diff --git a/include/llvm/MC/MCAsmInfo.h b/include/llvm/MC/MCAsmInfo.h index 3da3a31b5f..7a99394621 100644 --- a/include/llvm/MC/MCAsmInfo.h +++ b/include/llvm/MC/MCAsmInfo.h @@ -144,18 +144,6 @@ namespace llvm { /// AssemblerDialect - Which dialect of an assembler variant to use. unsigned AssemblerDialect; // Defaults to 0 - /// AllowQuotesInName - This is true if the assembler allows for complex - /// symbol names to be surrounded in quotes. This defaults to false. - bool AllowQuotesInName; - - /// AllowNameToStartWithDigit - This is true if the assembler allows symbol - /// names to start with a digit (e.g., "0x0021"). This defaults to false. - bool AllowNameToStartWithDigit; - - /// AllowPeriodsInName - This is true if the assembler allows periods in - /// symbol names. This defaults to true. - bool AllowPeriodsInName; - /// \brief This is true if the assembler allows @ characters in symbol /// names. Defaults to false. bool AllowAtInName; @@ -467,15 +455,6 @@ namespace llvm { unsigned getAssemblerDialect() const { return AssemblerDialect; } - bool doesAllowQuotesInName() const { - return AllowQuotesInName; - } - bool doesAllowNameToStartWithDigit() const { - return AllowNameToStartWithDigit; - } - bool doesAllowPeriodsInName() const { - return AllowPeriodsInName; - } bool doesAllowAtInName() const { return AllowAtInName; } diff --git a/lib/MC/MCAsmInfo.cpp b/lib/MC/MCAsmInfo.cpp index fd822b589a..28f1c95164 100644 --- a/lib/MC/MCAsmInfo.cpp +++ b/lib/MC/MCAsmInfo.cpp @@ -50,9 +50,6 @@ MCAsmInfo::MCAsmInfo() { Code32Directive = ".code32"; Code64Directive = ".code64"; AssemblerDialect = 0; - AllowQuotesInName = false; - AllowNameToStartWithDigit = false; - AllowPeriodsInName = true; AllowAtInName = false; UseDataRegionDirectives = false; ZeroDirective = "\t.zero\t"; diff --git a/lib/MC/MCAsmInfoCOFF.cpp b/lib/MC/MCAsmInfoCOFF.cpp index 33350d99a6..9d9f98e72b 100644 --- a/lib/MC/MCAsmInfoCOFF.cpp +++ b/lib/MC/MCAsmInfoCOFF.cpp @@ -43,7 +43,6 @@ MCAsmInfoCOFF::MCAsmInfoCOFF() { void MCAsmInfoMicrosoft::anchor() { } MCAsmInfoMicrosoft::MCAsmInfoMicrosoft() { - AllowQuotesInName = true; } void MCAsmInfoGNUCOFF::anchor() { } diff --git a/lib/MC/MCAsmInfoDarwin.cpp b/lib/MC/MCAsmInfoDarwin.cpp index d362a985d2..704c8161f8 100644 --- a/lib/MC/MCAsmInfoDarwin.cpp +++ b/lib/MC/MCAsmInfoDarwin.cpp @@ -26,7 +26,6 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() { GlobalPrefix = "_"; PrivateGlobalPrefix = "L"; LinkerPrivateGlobalPrefix = "l"; - AllowQuotesInName = true; HasSingleParameterDotFile = false; HasSubsectionsViaSymbols = true; diff --git a/lib/MC/MCSectionELF.cpp b/lib/MC/MCSectionELF.cpp index ff9c4d351a..09eb3e7829 100644 --- a/lib/MC/MCSectionELF.cpp +++ b/lib/MC/MCSectionELF.cpp @@ -32,6 +32,29 @@ bool MCSectionELF::ShouldOmitSectionDirective(StringRef Name, return false; } +static void printName(raw_ostream &OS, StringRef Name) { + if (Name.find_first_not_of("0123456789_." + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == Name.npos) { + OS << Name; + return; + } + OS << '"'; + for (const char *B = Name.begin(), *E = Name.end(); B < E; ++B) { + if (*B == '"') // Unquoted " + OS << "\\\""; + else if (*B != '\\') // Neither " or backslash + OS << *B; + else if (B + 1 == E) // Trailing backslash + OS << "\\\\"; + else { + OS << B[0] << B[1]; // Quoted character + ++B; + } + } + OS << '"'; +} + void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS, const MCExpr *Subsection) const { @@ -44,27 +67,8 @@ void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, return; } - StringRef name = getSectionName(); - if (name.find_first_not_of("0123456789_." - "abcdefghijklmnopqrstuvwxyz" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == name.npos) { - OS << "\t.section\t" << name; - } else { - OS << "\t.section\t\""; - for (const char *b = name.begin(), *e = name.end(); b < e; ++b) { - if (*b == '"') // Unquoted " - OS << "\\\""; - else if (*b != '\\') // Neither " or backslash - OS << *b; - else if (b + 1 == e) // Trailing backslash - OS << "\\\\"; - else { - OS << b[0] << b[1]; // Quoted character - ++b; - } - } - OS << '"'; - } + OS << "\t.section\t"; + printName(OS, getSectionName()); // Handle the weird solaris syntax if desired. if (MAI.usesSunStyleELFSectionSwitchSyntax() && @@ -135,8 +139,11 @@ void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, OS << "," << EntrySize; } - if (Flags & ELF::SHF_GROUP) - OS << "," << Group->getName() << ",comdat"; + if (Flags & ELF::SHF_GROUP) { + OS << ","; + printName(OS, Group->getName()); + OS << ",comdat"; + } OS << '\n'; if (Subsection) diff --git a/lib/Target/MSP430/MCTargetDesc/MSP430MCAsmInfo.cpp b/lib/Target/MSP430/MCTargetDesc/MSP430MCAsmInfo.cpp index 991bf56005..acf2ab869d 100644 --- a/lib/Target/MSP430/MCTargetDesc/MSP430MCAsmInfo.cpp +++ b/lib/Target/MSP430/MCTargetDesc/MSP430MCAsmInfo.cpp @@ -24,6 +24,5 @@ MSP430MCAsmInfo::MSP430MCAsmInfo(StringRef TT) { CommentString = ";"; AlignmentIsInBytes = false; - AllowNameToStartWithDigit = true; UsesELFSectionDirectiveForBSS = true; } diff --git a/lib/Target/Mangler.cpp b/lib/Target/Mangler.cpp index 20f70a375e..0fc1f2356f 100644 --- a/lib/Target/Mangler.cpp +++ b/lib/Target/Mangler.cpp @@ -23,17 +23,6 @@ #include "llvm/Support/raw_ostream.h" using namespace llvm; -static bool isAcceptableChar(char C, bool AllowPeriod) { - if ((C < 'a' || C > 'z') && - (C < 'A' || C > 'Z') && - (C < '0' || C > '9') && - C != '_' && C != '$' && C != '@' && - !(AllowPeriod && C == '.') && - !(C & 0x80)) - return false; - return true; -} - static char HexDigit(int V) { return V < 10 ? V+'0' : V+'A'-10; } @@ -45,46 +34,6 @@ static void MangleLetter(SmallVectorImpl<char> &OutName, unsigned char C) { OutName.push_back('_'); } -/// NameNeedsEscaping - Return true if the identifier \p Str needs quotes -/// for this assembler. -static bool NameNeedsEscaping(StringRef Str, const MCAsmInfo *MAI) { - assert(!Str.empty() && "Cannot create an empty MCSymbol"); - - // If the first character is a number and the target does not allow this, we - // need quotes. - if (!MAI->doesAllowNameToStartWithDigit() && Str[0] >= '0' && Str[0] <= '9') - return true; - - // If any of the characters in the string is an unacceptable character, force - // quotes. - bool AllowPeriod = MAI->doesAllowPeriodsInName(); - for (unsigned i = 0, e = Str.size(); i != e; ++i) - if (!isAcceptableChar(Str[i], AllowPeriod)) - return true; - return false; -} - -/// appendMangledName - Add the specified string in mangled form if it uses -/// any unusual characters. -static void appendMangledName(SmallVectorImpl<char> &OutName, StringRef Str, - const MCAsmInfo *MAI) { - // The first character is not allowed to be a number unless the target - // explicitly allows it. - if (!MAI->doesAllowNameToStartWithDigit() && Str[0] >= '0' && Str[0] <= '9') { - MangleLetter(OutName, Str[0]); - Str = Str.substr(1); - } - - bool AllowPeriod = MAI->doesAllowPeriodsInName(); - for (unsigned i = 0, e = Str.size(); i != e; ++i) { - if (!isAcceptableChar(Str[i], AllowPeriod)) - MangleLetter(OutName, Str[i]); - else - OutName.push_back(Str[i]); - } -} - - /// 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. @@ -134,22 +83,14 @@ void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName, OutName.append(Prefix, Prefix+strlen(Prefix)); } } - + // If this is a simple string that doesn't need escaping, just append it. - if (!NameNeedsEscaping(Name, MAI) || - // If quotes are supported, they can be used unless the string contains - // a quote or newline. - (MAI->doesAllowQuotesInName() && - Name.find_first_of("\n\"") == StringRef::npos)) { + // 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; } - - // On systems that do not allow quoted names, we need to mangle most - // strange characters. - if (!MAI->doesAllowQuotesInName()) - return appendMangledName(OutName, Name, MAI); - + // 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); diff --git a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp index dfa1ff5f51..f2784b836b 100644 --- a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp +++ b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp @@ -35,8 +35,6 @@ NVPTXMCAsmInfo::NVPTXMCAsmInfo(const StringRef &TT) { PrivateGlobalPrefix = "$L__"; - AllowPeriodsInName = false; - HasSetDirective = false; HasSingleParameterDotFile = false; diff --git a/lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.cpp b/lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.cpp index 0aeb8d09f2..4a8e1b0b2d 100644 --- a/lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.cpp +++ b/lib/Target/R600/MCTargetDesc/AMDGPUMCAsmInfo.cpp @@ -31,9 +31,6 @@ AMDGPUMCAsmInfo::AMDGPUMCAsmInfo(StringRef &TT) : MCAsmInfo() { InlineAsmStart = ";#ASMSTART"; InlineAsmEnd = ";#ASMEND"; AssemblerDialect = 0; - AllowQuotesInName = false; - AllowNameToStartWithDigit = false; - AllowPeriodsInName = false; //===--- Data Emission Directives -------------------------------------===// ZeroDirective = ".zero"; diff --git a/test/CodeGen/X86/GC/ocaml-gc.ll b/test/CodeGen/X86/GC/ocaml-gc.ll index 44241a90d0..6d5f8aebe1 100644 --- a/test/CodeGen/X86/GC/ocaml-gc.ll +++ b/test/CodeGen/X86/GC/ocaml-gc.ll @@ -2,23 +2,23 @@ define i32 @main(i32 %x) nounwind gc "ocaml" { ; CHECK: .text -; CHECK-NEXT: .globl caml_3C_stdin_3E___code_begin -; CHECK-NEXT: caml_3C_stdin_3E___code_begin: +; CHECK-NEXT: .globl "caml<stdin>__code_begin" +; CHECK-NEXT: "caml<stdin>__code_begin": ; CHECK-NEXT: .data -; CHECK-NEXT: .globl caml_3C_stdin_3E___data_begin -; CHECK-NEXT: caml_3C_stdin_3E___data_begin: +; CHECK-NEXT: .globl "caml<stdin>__data_begin" +; CHECK-NEXT: "caml<stdin>__data_begin": %puts = tail call i32 @foo(i32 %x) ret i32 0 -; CHECK: .globl caml_3C_stdin_3E___code_end -; CHECK-NEXT: caml_3C_stdin_3E___code_end: +; CHECK: .globl "caml<stdin>__code_end" +; CHECK-NEXT: "caml<stdin>__code_end": ; CHECK-NEXT: .data -; CHECK-NEXT: .globl caml_3C_stdin_3E___data_end -; CHECK-NEXT: caml_3C_stdin_3E___data_end: +; CHECK-NEXT: .globl "caml<stdin>__data_end" +; CHECK-NEXT: "caml<stdin>__data_end": ; CHECK-NEXT: .quad 0 -; CHECK-NEXT: .globl caml_3C_stdin_3E___frametable -; CHECK-NEXT: caml_3C_stdin_3E___frametable: +; CHECK-NEXT: .globl "caml<stdin>__frametable" +; CHECK-NEXT: "caml<stdin>__frametable": ; CHECK-NEXT: .short 1 ; CHECK-NEXT: .align 8 ; CHECK-NEXT: # live roots for main diff --git a/test/CodeGen/X86/global-sections.ll b/test/CodeGen/X86/global-sections.ll index 194f59765e..d8743ac318 100644 --- a/test/CodeGen/X86/global-sections.ll +++ b/test/CodeGen/X86/global-sections.ll @@ -65,10 +65,10 @@ ; PR4584 @"foo bar" = linkonce global i32 42 -; LINUX: .type foo_20_bar,@object -; LINUX: .section .data.foo_20_bar,"aGw",@progbits,foo_20_bar,comdat -; LINUX: .weak foo_20_bar -; LINUX: foo_20_bar: +; LINUX: .type "foo bar",@object +; LINUX: .section ".data.foo bar","aGw",@progbits,"foo bar",comdat +; LINUX: .weak "foo bar" +; LINUX: "foo bar": ; DARWIN: .section __DATA,__datacoal_nt,coalesced ; DARWIN: .globl "_foo bar" |