mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-14 23:29:51 +00:00
hoist section name uniquing logic up to the top-level SectionForGlobal
implementation, eliminating a dupe. llvm-svn: 76953
This commit is contained in:
parent
d087574dc5
commit
d594b72797
@ -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()));
|
||||
|
@ -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!");
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user