From f40761d5229322c08701049f89aa10f7f7b8b743 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 26 Jul 2009 07:33:58 +0000 Subject: [PATCH] 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 --- include/llvm/Target/ELFTargetAsmInfo.h | 3 +- include/llvm/Target/TargetAsmInfo.h | 13 +++--- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 12 +++-- lib/Target/ELFTargetAsmInfo.cpp | 58 ++++++++++++++----------- lib/Target/Sparc/SparcTargetAsmInfo.cpp | 31 +++++++------ lib/Target/Sparc/SparcTargetAsmInfo.h | 4 +- lib/Target/TargetAsmInfo.cpp | 13 ------ lib/Target/X86/X86TargetAsmInfo.cpp | 19 ++++---- lib/Target/X86/X86TargetAsmInfo.h | 4 +- 9 files changed, 82 insertions(+), 75 deletions(-) diff --git a/include/llvm/Target/ELFTargetAsmInfo.h b/include/llvm/Target/ELFTargetAsmInfo.h index 854217f6e8d..eb24dd10f71 100644 --- a/include/llvm/Target/ELFTargetAsmInfo.h +++ b/include/llvm/Target/ELFTargetAsmInfo.h @@ -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 &Str) const; const Section *DataRelSection; const Section *DataRelLocalSection; diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index 3a349055d62..ab28ec12ff4 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 namespace llvm { + template 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 FlagsStringsMapType; } class TargetMachine; @@ -269,7 +268,6 @@ namespace llvm { class TargetAsmInfo { private: mutable StringMap
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 &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 0bbbddf54c7..c608f6e4447 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -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'; } diff --git a/lib/Target/ELFTargetAsmInfo.cpp b/lib/Target/ELFTargetAsmInfo.cpp index 258542c31ed..b64c0b675d9 100644 --- a/lib/Target/ELFTargetAsmInfo.cpp +++ b/lib/Target/ELFTargetAsmInfo.cpp @@ -168,38 +168,44 @@ ELFTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const { return getReadOnlySection(); } -std::string ELFTargetAsmInfo::printSectionFlags(unsigned flags) const { - std::string Flags = ",\""; +void ELFTargetAsmInfo::getSectionFlags(unsigned Flags, + SmallVectorImpl &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 0087c262fbd..7b9f449436e 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 @@ 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 &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 1af5d80b550..77cf4e9f4d6 100644 --- a/lib/Target/Sparc/SparcTargetAsmInfo.h +++ b/lib/Target/Sparc/SparcTargetAsmInfo.h @@ -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 &Str) const; + }; } // namespace llvm diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index b0aeff6f84a..0052075fea3 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -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 { diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index 5de9d696147..b584cb49c3c 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -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'; +void X86COFFTargetAsmInfo::getSectionFlags(unsigned Flags, + SmallVectorImpl &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 af1ee2d1473..75cd04c51d8 100644 --- a/lib/Target/X86/X86TargetAsmInfo.h +++ b/lib/Target/X86/X86TargetAsmInfo.h @@ -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 &Str) const; }; struct X86WinTargetAsmInfo : public X86GenericTargetAsmInfo {