From eed05b804275e5ef835187d66240d7d6e294f8bb Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 24 Jul 2009 05:10:25 +0000 Subject: [PATCH] hoist section name uniquing logic up to the top-level SectionForGlobal implementation, eliminating a dupe. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76953 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/DarwinTargetAsmInfo.cpp | 9 ++++---- lib/Target/ELFTargetAsmInfo.cpp | 9 -------- lib/Target/TargetAsmInfo.cpp | 36 ++++++++++++++++++------------ 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/lib/Target/DarwinTargetAsmInfo.cpp b/lib/Target/DarwinTargetAsmInfo.cpp index 0ea9bd16661..c25040ca600 100644 --- a/lib/Target/DarwinTargetAsmInfo.cpp +++ b/lib/Target/DarwinTargetAsmInfo.cpp @@ -134,16 +134,15 @@ DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { case SectionKind::Text: if (isWeak) return TextCoalSection; - else - return TextSection; + return TextSection; case SectionKind::Data: case SectionKind::ThreadData: case SectionKind::BSS: case SectionKind::ThreadBSS: if (cast(GV)->isConstant()) - return (isWeak ? ConstDataCoalSection : ConstDataSection); - else - return (isWeak ? DataCoalSection : DataSection); + return isWeak ? ConstDataCoalSection : ConstDataSection; + return isWeak ? DataCoalSection : DataSection; + case SectionKind::ROData: return (isWeak ? ConstDataCoalSection : (isNonStatic ? ConstDataSection : getReadOnlySection())); diff --git a/lib/Target/ELFTargetAsmInfo.cpp b/lib/Target/ELFTargetAsmInfo.cpp index 1785d156c82..662fc11f20d 100644 --- a/lib/Target/ELFTargetAsmInfo.cpp +++ b/lib/Target/ELFTargetAsmInfo.cpp @@ -77,15 +77,6 @@ const Section* ELFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { SectionKind::Kind Kind = SectionKindForGlobal(GV); - if (GV->isWeakForLinker()) { - if (const char *Prefix = getSectionPrefixForUniqueGlobal(Kind)) { - // FIXME: Use mangler interface (PR4584). - std::string Name = Prefix+GV->getName(); - unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str()); - return getNamedSection(Name.c_str(), Flags); - } - } - if (const Function *F = dyn_cast(GV)) { switch (F->getLinkage()) { default: llvm_unreachable("Unknown linkage type!"); diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index d13a3226cfa..e193dd47a51 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -295,6 +295,18 @@ const Section *TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const { return getNamedSection(GV->getSection().c_str(), Flags); } + // If this global is linkonce/weak and the target handles this by emitting it + // into a 'uniqued' section name, create and return the section now. + if (GV->isWeakForLinker()) { + if (const char *Prefix = + getSectionPrefixForUniqueGlobal(SectionKindForGlobal(GV))) { + // FIXME: Use mangler interface (PR4584). + std::string Name = Prefix+GV->getName(); + unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str()); + return getNamedSection(Name.c_str(), Flags); + } + } + // Use default section depending on the 'type' of global return SelectSectionForGlobal(GV); } @@ -304,19 +316,16 @@ const Section* TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { SectionKind::Kind Kind = SectionKindForGlobal(GV); - if (GV->isWeakForLinker()) { - // FIXME: Use mangler interface (PR4584). - std::string Name = getSectionPrefixForUniqueGlobal(Kind)+GV->getName(); - unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str()); - return getNamedSection(Name.c_str(), Flags); - } else { - if (Kind == SectionKind::Text) - return getTextSection(); - else if (isBSS(Kind) && getBSSSection_()) - return getBSSSection_(); - else if (getReadOnlySection() && SectionKind::isReadOnly(Kind)) - return getReadOnlySection(); - } + if (Kind == SectionKind::Text) + return getTextSection(); + + if (isBSS(Kind)) + if (const Section *S = getBSSSection_()) + return S; + + if (SectionKind::isReadOnly(Kind)) + if (const Section *S = getReadOnlySection()) + return S; return getDataSection(); } @@ -352,7 +361,6 @@ TargetAsmInfo::getSectionPrefixForUniqueGlobal(SectionKind::Kind Kind) const { case SectionKind::ThreadData: return ".gnu.linkonce.td."; case SectionKind::ThreadBSS: return ".gnu.linkonce.tb."; } - return NULL; } const Section *TargetAsmInfo::getNamedSection(const char *Name, unsigned Flags,