summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-07-26 07:33:58 +0000
committerChris Lattner <sabre@nondot.org>2009-07-26 07:33:58 +0000
commit1db210322aee38cd93a5489996e251072461f1ff (patch)
treef20488bc741c9d5b0fa0a560b7c15d114d5f9c68 /llvm
parentd2e0220cb411126637d0f9ff3262a33201d37385 (diff)
downloadbcm5719-llvm-1db210322aee38cd93a5489996e251072461f1ff.tar.gz
bcm5719-llvm-1db210322aee38cd93a5489996e251072461f1ff.zip
remove a densemap from TargetAsmInfo that was uniquing the targetflags strings,
just use a smallstring instead. llvm-svn: 77144
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/Target/ELFTargetAsmInfo.h3
-rw-r--r--llvm/include/llvm/Target/TargetAsmInfo.h13
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp12
-rw-r--r--llvm/lib/Target/ELFTargetAsmInfo.cpp60
-rw-r--r--llvm/lib/Target/Sparc/SparcTargetAsmInfo.cpp31
-rw-r--r--llvm/lib/Target/Sparc/SparcTargetAsmInfo.h4
-rw-r--r--llvm/lib/Target/TargetAsmInfo.cpp13
-rw-r--r--llvm/lib/Target/X86/X86TargetAsmInfo.cpp21
-rw-r--r--llvm/lib/Target/X86/X86TargetAsmInfo.h4
9 files changed, 84 insertions, 77 deletions
diff --git a/llvm/include/llvm/Target/ELFTargetAsmInfo.h b/llvm/include/llvm/Target/ELFTargetAsmInfo.h
index 854217f6e8d..eb24dd10f71 100644
--- a/llvm/include/llvm/Target/ELFTargetAsmInfo.h
+++ b/llvm/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<char> &Str) const;
const Section *DataRelSection;
const Section *DataRelLocalSection;
diff --git a/llvm/include/llvm/Target/TargetAsmInfo.h b/llvm/include/llvm/Target/TargetAsmInfo.h
index 3a349055d62..ab28ec12ff4 100644
--- a/llvm/include/llvm/Target/TargetAsmInfo.h
+++ b/llvm/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 @@ 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,
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 0bbbddf54c7..c608f6e4447 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/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/llvm/lib/Target/ELFTargetAsmInfo.cpp b/llvm/lib/Target/ELFTargetAsmInfo.cpp
index 258542c31ed..b64c0b675d9 100644
--- a/llvm/lib/Target/ELFTargetAsmInfo.cpp
+++ b/llvm/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 = ",\"";
-
- 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());
+ }
}
diff --git a/llvm/lib/Target/Sparc/SparcTargetAsmInfo.cpp b/llvm/lib/Target/Sparc/SparcTargetAsmInfo.cpp
index 0087c262fbd..7b9f449436e 100644
--- a/llvm/lib/Target/Sparc/SparcTargetAsmInfo.cpp
+++ b/llvm/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<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());
}
diff --git a/llvm/lib/Target/Sparc/SparcTargetAsmInfo.h b/llvm/lib/Target/Sparc/SparcTargetAsmInfo.h
index 1af5d80b550..77cf4e9f4d6 100644
--- a/llvm/lib/Target/Sparc/SparcTargetAsmInfo.h
+++ b/llvm/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<char> &Str) const;
+
};
} // namespace llvm
diff --git a/llvm/lib/Target/TargetAsmInfo.cpp b/llvm/lib/Target/TargetAsmInfo.cpp
index b0aeff6f84a..0052075fea3 100644
--- a/llvm/lib/Target/TargetAsmInfo.cpp
+++ b/llvm/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/llvm/lib/Target/X86/X86TargetAsmInfo.cpp b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp
index 5de9d696147..b584cb49c3c 100644
--- a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/llvm/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';
-
- 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):
diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.h b/llvm/lib/Target/X86/X86TargetAsmInfo.h
index af1ee2d1473..75cd04c51d8 100644
--- a/llvm/lib/Target/X86/X86TargetAsmInfo.h
+++ b/llvm/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<char> &Str) const;
};
struct X86WinTargetAsmInfo : public X86GenericTargetAsmInfo {
OpenPOWER on IntegriCloud