remove a densemap from TargetAsmInfo that was uniquing the targetflags strings,
just use a smallstring instead.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77144 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/Target/ELFTargetAsmInfo.h b/include/llvm/Target/ELFTargetAsmInfo.h
index 854217f..eb24dd1 100644
--- a/include/llvm/Target/ELFTargetAsmInfo.h
+++ b/include/llvm/Target/ELFTargetAsmInfo.h
@@ -41,7 +41,8 @@
     
     virtual const Section* SelectSectionForGlobal(const GlobalValue *GV,
                                                   SectionKind Kind) const;
-    virtual std::string printSectionFlags(unsigned flags) const;
+    virtual void getSectionFlags(unsigned Flags,
+                                 SmallVectorImpl<char> &Str) const;
 
     const Section *DataRelSection;
     const Section *DataRelLocalSection;
diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h
index 3a34905..ab28ec1 100644
--- a/include/llvm/Target/TargetAsmInfo.h
+++ b/include/llvm/Target/TargetAsmInfo.h
@@ -16,12 +16,13 @@
 #ifndef LLVM_TARGET_ASM_INFO_H
 #define LLVM_TARGET_ASM_INFO_H
 
-#include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/Support/DataTypes.h"
 #include <string>
 
 namespace llvm {
+  template <typename T> class SmallVectorImpl;
+  
   // DWARF encoding query type
   namespace DwarfEncoding {
     enum Target {
@@ -235,8 +236,6 @@
       static bool isEqual(unsigned LHS, unsigned RHS) { return LHS == RHS; }
       static bool isPod() { return true; }
     };
-
-    typedef DenseMap<unsigned, std::string, KeyInfo> FlagsStringsMapType;
   }
 
   class TargetMachine;
@@ -269,7 +268,6 @@
   class TargetAsmInfo {
   private:
     mutable StringMap<Section> Sections;
-    mutable SectionFlags::FlagsStringsMapType FlagsStrings;
   protected:
     /// TM - The current TargetMachine.
     const TargetMachine &TM;
@@ -746,8 +744,11 @@
       return 0;
     }
     
-    const std::string &getSectionFlags(unsigned Flags) const;
-    virtual std::string printSectionFlags(unsigned flags) const { return ""; }
+    /// Turn the specified flags into a string that can be printed to the
+    /// assembly file.
+    virtual void getSectionFlags(unsigned Flags,
+                                 SmallVectorImpl<char> &Str) const {
+    }
 
 // FIXME: Eliminate this.
     virtual const Section* SelectSectionForGlobal(const GlobalValue *GV,
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 0bbbddf..c608f6e 100644
--- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -135,12 +135,16 @@
     // If section is named we need to switch into it via special '.section'
     // directive and also append funky flags. Otherwise - section name is just
     // some magic assembler directive.
-    if (NS->hasFlag(SectionFlags::Named))
+    if (NS->hasFlag(SectionFlags::Named)) {
       O << TAI->getSwitchToSectionDirective()
-        << CurrentSection
-        << TAI->getSectionFlags(NS->getFlags());
-    else
+        << CurrentSection;
+      
+      SmallString<32> FlagsStr;
+      TAI->getSectionFlags(NS->getFlags(), FlagsStr);
+      O << FlagsStr.c_str();
+    } else {
       O << CurrentSection;
+    }
     O << TAI->getDataSectionStartSuffix() << '\n';
   }
 
diff --git a/lib/Target/ELFTargetAsmInfo.cpp b/lib/Target/ELFTargetAsmInfo.cpp
index 258542c..b64c0b6 100644
--- a/lib/Target/ELFTargetAsmInfo.cpp
+++ b/lib/Target/ELFTargetAsmInfo.cpp
@@ -168,38 +168,44 @@
   return getReadOnlySection();
 }
 
-std::string ELFTargetAsmInfo::printSectionFlags(unsigned flags) const {
-  std::string Flags = ",\"";
+void ELFTargetAsmInfo::getSectionFlags(unsigned Flags,
+                                       SmallVectorImpl<char> &Str) const {
+  Str.push_back(',');
+  Str.push_back('"');
+  
+  if (!(Flags & SectionFlags::Debug))
+    Str.push_back('a');
+  if (Flags & SectionFlags::Code)
+    Str.push_back('x');
+  if (Flags & SectionFlags::Writable)
+    Str.push_back('w');
+  if (Flags & SectionFlags::Mergeable)
+    Str.push_back('M');
+  if (Flags & SectionFlags::Strings)
+    Str.push_back('S');
+  if (Flags & SectionFlags::TLS)
+    Str.push_back('T');
 
-  if (!(flags & SectionFlags::Debug))
-    Flags += 'a';
-  if (flags & SectionFlags::Code)
-    Flags += 'x';
-  if (flags & SectionFlags::Writable)
-    Flags += 'w';
-  if (flags & SectionFlags::Mergeable)
-    Flags += 'M';
-  if (flags & SectionFlags::Strings)
-    Flags += 'S';
-  if (flags & SectionFlags::TLS)
-    Flags += 'T';
-
-  Flags += "\",";
+  Str.push_back('"');
+  Str.push_back(',');
 
   // If comment string is '@', e.g. as on ARM - use '%' instead
   if (strcmp(CommentString, "@") == 0)
-    Flags += '%';
+    Str.push_back('%');
   else
-    Flags += '@';
+    Str.push_back('@');
 
-  // FIXME: There can be exceptions here
-  if (flags & SectionFlags::BSS)
-    Flags += "nobits";
+  const char *KindStr;
+  if (Flags & SectionFlags::BSS)
+    KindStr = "nobits";
   else
-    Flags += "progbits";
+    KindStr = "progbits";
+  
+  Str.append(KindStr, KindStr+strlen(KindStr));
 
-  if (unsigned entitySize = SectionFlags::getEntitySize(flags))
-    Flags += "," + utostr(entitySize);
-
-  return Flags;
+  if (unsigned entitySize = SectionFlags::getEntitySize(Flags)) {
+    Str.push_back(',');
+    std::string Size = utostr(entitySize);
+    Str.append(Size.begin(), Size.end());
+  }
 }
diff --git a/lib/Target/Sparc/SparcTargetAsmInfo.cpp b/lib/Target/Sparc/SparcTargetAsmInfo.cpp
index 0087c26..7b9f449 100644
--- a/lib/Target/Sparc/SparcTargetAsmInfo.cpp
+++ b/lib/Target/Sparc/SparcTargetAsmInfo.cpp
@@ -12,7 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "SparcTargetAsmInfo.h"
-
+#include "llvm/ADT/SmallVector.h"
 using namespace llvm;
 
 SparcELFTargetAsmInfo::SparcELFTargetAsmInfo(const TargetMachine &TM):
@@ -32,19 +32,22 @@
                                  /* Override */ true);
 }
 
-std::string SparcELFTargetAsmInfo::printSectionFlags(unsigned flags) const {
-  if (flags & SectionFlags::Mergeable)
-    return ELFTargetAsmInfo::printSectionFlags(flags);
 
-  std::string Flags;
-  if (!(flags & SectionFlags::Debug))
-    Flags += ",#alloc";
-  if (flags & SectionFlags::Code)
-    Flags += ",#execinstr";
-  if (flags & SectionFlags::Writable)
-    Flags += ",#write";
-  if (flags & SectionFlags::TLS)
-    Flags += ",#tls";
+void SparcELFTargetAsmInfo::getSectionFlags(unsigned Flags,
+                                            SmallVectorImpl<char> &Str) const {
+  if (Flags & SectionFlags::Mergeable)
+    return ELFTargetAsmInfo::getSectionFlags(Flags, Str);
 
-  return Flags;
+  // FIXME: Inefficient.
+  std::string Res;
+  if (!(Flags & SectionFlags::Debug))
+    Res += ",#alloc";
+  if (Flags & SectionFlags::Code)
+    Res += ",#execinstr";
+  if (Flags & SectionFlags::Writable)
+    Res += ",#write";
+  if (Flags & SectionFlags::TLS)
+    Res += ",#tls";
+
+  Str.append(Res.begin(), Res.end());
 }
diff --git a/lib/Target/Sparc/SparcTargetAsmInfo.h b/lib/Target/Sparc/SparcTargetAsmInfo.h
index 1af5d80..77cf4e9 100644
--- a/lib/Target/Sparc/SparcTargetAsmInfo.h
+++ b/lib/Target/Sparc/SparcTargetAsmInfo.h
@@ -25,7 +25,9 @@
   struct SparcELFTargetAsmInfo : public ELFTargetAsmInfo {
     explicit SparcELFTargetAsmInfo(const TargetMachine &TM);
 
-    std::string printSectionFlags(unsigned flags) const;
+    virtual void getSectionFlags(unsigned Flags,
+                                 SmallVectorImpl<char> &Str) const;
+
   };
 
 } // namespace llvm
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
index b0aeff6..0052075 100644
--- a/lib/Target/TargetAsmInfo.cpp
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -416,19 +416,6 @@
   return &S;
 }
 
-const std::string&
-TargetAsmInfo::getSectionFlags(unsigned Flags) const {
-  SectionFlags::FlagsStringsMapType::iterator I = FlagsStrings.find(Flags);
-
-  // We didn't print these flags yet, print and save them to map. This reduces
-  // amount of heap trashing due to std::string construction / concatenation.
-  if (I == FlagsStrings.end())
-    I = FlagsStrings.insert(std::make_pair(Flags,
-                                           printSectionFlags(Flags))).first;
-
-  return I->second;
-}
-
 unsigned TargetAsmInfo::getULEB128Size(unsigned Value) {
   unsigned Size = 0;
   do {
diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp
index 5de9d69..b584cb4 100644
--- a/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/lib/Target/X86/X86TargetAsmInfo.cpp
@@ -274,17 +274,18 @@
   return ".rdata$linkonce";
 }
 
-std::string X86COFFTargetAsmInfo::printSectionFlags(unsigned flags) const {
-  std::string Flags = ",\"";
 
-  if (flags & SectionFlags::Code)
-    Flags += 'x';
-  if (flags & SectionFlags::Writable)
-    Flags += 'w';
+void X86COFFTargetAsmInfo::getSectionFlags(unsigned Flags,
+                                           SmallVectorImpl<char> &Str) const {
+  // FIXME: Inefficient.
+  std::string Res = ",\"";
+  if (Flags & SectionFlags::Code)
+    Res += 'x';
+  if (Flags & SectionFlags::Writable)
+    Res += 'w';
+  Res += "\"";
 
-  Flags += "\"";
-
-  return Flags;
+  Str.append(Res.begin(), Res.end());
 }
 
 X86WinTargetAsmInfo::X86WinTargetAsmInfo(const X86TargetMachine &TM):
diff --git a/lib/Target/X86/X86TargetAsmInfo.h b/lib/Target/X86/X86TargetAsmInfo.h
index af1ee2d..75cd04c 100644
--- a/lib/Target/X86/X86TargetAsmInfo.h
+++ b/lib/Target/X86/X86TargetAsmInfo.h
@@ -55,7 +55,9 @@
                                            bool Global) const;
     virtual const char *
     getSectionPrefixForUniqueGlobal(SectionKind kind) const;
-    virtual std::string printSectionFlags(unsigned flags) const;
+    
+    virtual void getSectionFlags(unsigned Flags,
+                                 SmallVectorImpl<char> &Str) const;
   };
 
   struct X86WinTargetAsmInfo : public X86GenericTargetAsmInfo {