From 6ec2992acaec64dd3b5629d557ddaf5d0615e3a6 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 23 Apr 2015 23:34:05 +0000 Subject: [PATCH] MC: Allow targets to stop symbol name quoting Currently symbol names are printed in quotes if it contains something outside of the arbitrary set of characters that isAcceptableChar tests for. On somem targets, it is never OK to print a symbol name in quotes so allow targets to opt out of this behavior. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235670 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCAsmInfo.h | 4 ++++ include/llvm/MC/MCSymbol.h | 9 +++++++-- lib/MC/MCAsmInfo.cpp | 1 + lib/MC/MCContext.cpp | 6 ++++-- lib/MC/MCSymbol.cpp | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/include/llvm/MC/MCAsmInfo.h b/include/llvm/MC/MCAsmInfo.h index 658d77cbddf..5e58320c571 100644 --- a/include/llvm/MC/MCAsmInfo.h +++ b/include/llvm/MC/MCAsmInfo.h @@ -155,6 +155,9 @@ protected: /// Defaults to false. bool AllowAtInName; + /// If this is true, symbol names will not attempt to be quoted when printed. + bool NoSymbolNameQuoting; + /// This is true if data region markers should be printed as /// ".data_region/.end_data_region" directives. If false, use "$d/$a" labels /// instead. @@ -452,6 +455,7 @@ public: const char *getCode64Directive() const { return Code64Directive; } unsigned getAssemblerDialect() const { return AssemblerDialect; } bool doesAllowAtInName() const { return AllowAtInName; } + bool noSymbolNameQuoting() const { return NoSymbolNameQuoting; } bool doesSupportDataRegionDirectives() const { return UseDataRegionDirectives; } diff --git a/include/llvm/MC/MCSymbol.h b/include/llvm/MC/MCSymbol.h index f1c36f54e08..464fff4fccb 100644 --- a/include/llvm/MC/MCSymbol.h +++ b/include/llvm/MC/MCSymbol.h @@ -55,6 +55,10 @@ namespace llvm { /// "Lfoo" or ".foo". unsigned IsTemporary : 1; + /// True if the name should be quoted if "unacceptable" characters are used + /// in the name. + unsigned NoQuoting : 1; + /// \brief True if this symbol can be redefined. unsigned IsRedefinable : 1; @@ -64,9 +68,10 @@ namespace llvm { private: // MCContext creates and uniques these. friend class MCExpr; friend class MCContext; - MCSymbol(StringRef name, bool isTemporary) + MCSymbol(StringRef name, bool isTemporary, bool noQuoting) : Name(name), Section(nullptr), Value(nullptr), - IsTemporary(isTemporary), IsRedefinable(false), IsUsed(false) {} + IsTemporary(isTemporary), NoQuoting(noQuoting), + IsRedefinable(false), IsUsed(false) {} MCSymbol(const MCSymbol&) = delete; void operator=(const MCSymbol&) = delete; diff --git a/lib/MC/MCAsmInfo.cpp b/lib/MC/MCAsmInfo.cpp index bad257a961b..f2d3b2a1855 100644 --- a/lib/MC/MCAsmInfo.cpp +++ b/lib/MC/MCAsmInfo.cpp @@ -50,6 +50,7 @@ MCAsmInfo::MCAsmInfo() { Code64Directive = ".code64"; AssemblerDialect = 0; AllowAtInName = false; + NoSymbolNameQuoting = false; UseDataRegionDirectives = false; ZeroDirective = "\t.zero\t"; AsciiDirective = "\t.ascii\t"; diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index 5f8e3c11de3..a43bdc7bfa2 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -125,7 +125,8 @@ MCSymbol *MCContext::getOrCreateSectionSymbol(const MCSectionELF &Section) { } auto NameIter = UsedNames.insert(std::make_pair(Name, true)).first; - Sym = new (*this) MCSymbol(NameIter->getKey(), /*isTemporary*/ false); + Sym = new (*this) MCSymbol(NameIter->getKey(), /*isTemporary*/ false, + MAI->noSymbolNameQuoting()); if (!OldSym) OldSym = Sym; @@ -163,7 +164,8 @@ MCSymbol *MCContext::CreateSymbol(StringRef Name, bool AlwaysAddSuffix) { // Ok, we found a name. Have the MCSymbol object itself refer to the copy // of the string that is embedded in the UsedNames entry. MCSymbol *Result = - new (*this) MCSymbol(NameEntry.first->getKey(), IsTemporary); + new (*this) MCSymbol(NameEntry.first->getKey(), IsTemporary, + MAI->noSymbolNameQuoting()); return Result; } assert(IsTemporary && "Cannot rename non-temporary symbols"); diff --git a/lib/MC/MCSymbol.cpp b/lib/MC/MCSymbol.cpp index ccb9f8def9e..346a9260709 100644 --- a/lib/MC/MCSymbol.cpp +++ b/lib/MC/MCSymbol.cpp @@ -51,7 +51,7 @@ void MCSymbol::print(raw_ostream &OS) const { // some targets support quoting names with funny characters. If the name // contains a funny character, then print it quoted. StringRef Name = getName(); - if (!NameNeedsQuoting(Name)) { + if (NoQuoting || !NameNeedsQuoting(Name)) { OS << Name; return; } -- 2.34.1