MC: Allow targets to stop symbol name quoting
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 23 Apr 2015 23:34:05 +0000 (23:34 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 23 Apr 2015 23:34:05 +0000 (23:34 +0000)
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
include/llvm/MC/MCSymbol.h
lib/MC/MCAsmInfo.cpp
lib/MC/MCContext.cpp
lib/MC/MCSymbol.cpp

index 658d77cbddf30f057a80f34dd9010d856febf2e7..5e58320c5714238db00911d3697b133d0aaf5639 100644 (file)
@@ -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;
   }
index f1c36f54e08a6b956424c19d967451f9fdd9dfd6..464fff4fccbd590ae969451a1d9e592384239629 100644 (file)
@@ -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;
index bad257a961ba6264c15d7095b96dd366a026d23b..f2d3b2a18553c32a56888a7c93fc1669606bc3f6 100644 (file)
@@ -50,6 +50,7 @@ MCAsmInfo::MCAsmInfo() {
   Code64Directive = ".code64";
   AssemblerDialect = 0;
   AllowAtInName = false;
+  NoSymbolNameQuoting = false;
   UseDataRegionDirectives = false;
   ZeroDirective = "\t.zero\t";
   AsciiDirective = "\t.ascii\t";
index 5f8e3c11de3f8a67153f462ea9dbac7a5d83a1d3..a43bdc7bfa21225fa34f9609df76f951405625cb 100644 (file)
@@ -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");
index ccb9f8def9ef8f31d33ca270b2877bdb198a2010..346a9260709641e015e92118994a65d8dfcb7bb1 100644 (file)
@@ -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;
   }