aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Target/DarwinTargetAsmInfo.cpp9
-rw-r--r--lib/Target/ELFTargetAsmInfo.cpp9
-rw-r--r--lib/Target/TargetAsmInfo.cpp36
3 files changed, 26 insertions, 28 deletions
diff --git a/lib/Target/DarwinTargetAsmInfo.cpp b/lib/Target/DarwinTargetAsmInfo.cpp
index 0ea9bd1666..c25040ca60 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<GlobalVariable>(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 1785d156c8..662fc11f20 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<Function>(GV)) {
switch (F->getLinkage()) {
default: llvm_unreachable("Unknown linkage type!");
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
index d13a3226cf..e193dd47a5 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,