remove a densemap from TargetAsmInfo that was uniquing the targetflags strings,
authorChris Lattner <sabre@nondot.org>
Sun, 26 Jul 2009 07:33:58 +0000 (07:33 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 26 Jul 2009 07:33:58 +0000 (07:33 +0000)
just use a smallstring instead.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77144 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/ELFTargetAsmInfo.h
include/llvm/Target/TargetAsmInfo.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/Target/ELFTargetAsmInfo.cpp
lib/Target/Sparc/SparcTargetAsmInfo.cpp
lib/Target/Sparc/SparcTargetAsmInfo.h
lib/Target/TargetAsmInfo.cpp
lib/Target/X86/X86TargetAsmInfo.cpp
lib/Target/X86/X86TargetAsmInfo.h

index 854217f6e8dfe1c2e8cbf95a6b08f1a57f156a7e..eb24dd10f71dc127788ecab9cdbf5b36aed80dcd 100644 (file)
@@ -41,7 +41,8 @@ namespace llvm {
     
     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;
index 3a349055d62a9f5d4be2e8bf2ac5383981d65f87..ab28ec12ff4c5a679ae410d56c7a0aec8cb365bd 100644 (file)
 #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 @@ namespace llvm {
       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 @@ namespace llvm {
   class TargetAsmInfo {
   private:
     mutable StringMap<Section> Sections;
-    mutable SectionFlags::FlagsStringsMapType FlagsStrings;
   protected:
     /// TM - The current TargetMachine.
     const TargetMachine &TM;
@@ -746,8 +744,11 @@ namespace llvm {
       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,
index 0bbbddf54c716e89b15ffc02e4904a63f26b0e4f..c608f6e4447fcc95f6719e6e7b3f576a9ebb5455 100644 (file)
@@ -135,12 +135,16 @@ void AsmPrinter::SwitchToSection(const Section* NS) {
     // 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';
   }
 
index 258542c31ed3d3b97903261884997446e82ba1e0..b64c0b675d9bbb4d461c1714b0891eee21a4fb94 100644 (file)
@@ -168,38 +168,44 @@ ELFTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const {
   return getReadOnlySection();
 }
 
-std::string ELFTargetAsmInfo::printSectionFlags(unsigned flags) const {
-  std::string Flags = ",\"";
-
-  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 += "\",";
+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');
+
+  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";
-
-  if (unsigned entitySize = SectionFlags::getEntitySize(flags))
-    Flags += "," + utostr(entitySize);
+    KindStr = "progbits";
+  
+  Str.append(KindStr, KindStr+strlen(KindStr));
 
-  return Flags;
+  if (unsigned entitySize = SectionFlags::getEntitySize(Flags)) {
+    Str.push_back(',');
+    std::string Size = utostr(entitySize);
+    Str.append(Size.begin(), Size.end());
+  }
 }
index 0087c262fbd8668f3182e81a794c1d406b6df942..7b9f449436e620c93b5fd3d450a1e85fc0879307 100644 (file)
@@ -12,7 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "SparcTargetAsmInfo.h"
-
+#include "llvm/ADT/SmallVector.h"
 using namespace llvm;
 
 SparcELFTargetAsmInfo::SparcELFTargetAsmInfo(const TargetMachine &TM):
@@ -32,19 +32,22 @@ SparcELFTargetAsmInfo::SparcELFTargetAsmInfo(const TargetMachine &TM):
                                  /* 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);
+
+  // 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";
 
-  return Flags;
+  Str.append(Res.begin(), Res.end());
 }
index 1af5d80b550362f0375cc10842dfb55f18f6823d..77cf4e9f4d681536c4f3e549184086950201ea15 100644 (file)
@@ -25,7 +25,9 @@ namespace llvm {
   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
index b0aeff6f84a8983ab74ff3773637c1ea56c00021..0052075fea3ea3f50c5261885f1fbc001200eb54 100644 (file)
@@ -416,19 +416,6 @@ TargetAsmInfo::getUnnamedSection(const char *Directive, unsigned Flags,
   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 {
index 5de9d6961470e7ac716dacacaa1acdf41027e4c0..b584cb49c3c1ae3070144ea28863fd5d9bd9d491 100644 (file)
@@ -274,17 +274,18 @@ getSectionPrefixForUniqueGlobal(SectionKind Kind) const {
   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';
-
-  Flags += "\"";
-
-  return Flags;
+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 += "\"";
+
+  Str.append(Res.begin(), Res.end());
 }
 
 X86WinTargetAsmInfo::X86WinTargetAsmInfo(const X86TargetMachine &TM):
index af1ee2d14733f39abcee3e7006c031c3dbcb954d..75cd04c51d854495d068e287b6a72af7e2825263 100644 (file)
@@ -55,7 +55,9 @@ namespace llvm {
                                            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 {