Provide section selection for X86 ELF targets

llvm-svn: 53305
This commit is contained in:
Anton Korobeynikov 2008-07-09 13:23:08 +00:00
parent 9d6939b5fc
commit 4c37c3ad5b
3 changed files with 50 additions and 64 deletions

View File

@ -261,6 +261,9 @@ TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
std::string Name;
// FIXME: Should we use some hashing based on section name and just check
// flags?
// Select section name
if (GV->hasSection()) {
// Honour section already set, if any

View File

@ -313,6 +313,51 @@ X86ELFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
}
}
std::string
X86ELFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
SectionKind::Kind kind = SectionKindForGlobal(GV);
if (const Function *F = dyn_cast<Function>(GV)) {
switch (F->getLinkage()) {
default: assert(0 && "Unknown linkage type!");
case Function::InternalLinkage:
case Function::DLLExportLinkage:
case Function::ExternalLinkage:
return getTextSection();
case Function::WeakLinkage:
case Function::LinkOnceLinkage:
return UniqueSectionForGlobal(F, kind);
}
} else if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV)) {
if (GVar->hasCommonLinkage() ||
GVar->hasLinkOnceLinkage() ||
GVar->hasWeakLinkage())
return UniqueSectionForGlobal(GVar, kind);
else {
switch (kind) {
case SectionKind::Data:
return getDataSection();
case SectionKind::BSS:
// ELF targets usually have BSS sections
return getBSSSection();
case SectionKind::ROData:
case SectionKind::RODataMergeStr:
case SectionKind::RODataMergeConst:
// FIXME: Temporary
return getReadOnlySection();
case SectionKind::ThreadData:
// ELF targets usually support TLS stuff
return getTLSDataSection();
case SectionKind::ThreadBSS:
return getTLSBSSSection();
default:
assert(0 && "Unsuported section kind for global");
}
}
} else
assert(0 && "Unsupported global");
}
std::string X86ELFTargetAsmInfo::PrintSectionFlags(unsigned flags) const {
std::string Flags = ",\"";
@ -472,67 +517,3 @@ X86WinTargetAsmInfo::X86WinTargetAsmInfo(const X86TargetMachine &TM):
DataSectionStartSuffix = "\tsegment 'DATA'";
SectionEndDirectiveSuffix = "\tends\n";
}
std::string X86TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
SectionKind::Kind kind = SectionKindForGlobal(GV);
unsigned flags = SectionFlagsForGlobal(GV, GV->getSection().c_str());
std::string Name;
// FIXME: Should we use some hashing based on section name and just check
// flags?
// FIXME: It seems, that Darwin uses much more sections.
// Select section name
if (GV->hasSection()) {
// Honour section already set, if any
Name = GV->getSection();
} else {
// Use default section depending on the 'type' of global
if (const Function *F = dyn_cast<Function>(GV)) {
switch (F->getLinkage()) {
default: assert(0 && "Unknown linkage type!");
case Function::InternalLinkage:
case Function::DLLExportLinkage:
case Function::ExternalLinkage:
Name = getTextSection();
break;
case Function::WeakLinkage:
case Function::LinkOnceLinkage:
Name = UniqueSectionForGlobal(F, kind);
break;
}
} else if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV)) {
if (GVar->hasCommonLinkage() ||
GVar->hasLinkOnceLinkage() ||
GVar->hasWeakLinkage())
Name = UniqueSectionForGlobal(GVar, kind);
else {
switch (kind) {
case SectionKind::Data:
Name = getDataSection();
break;
case SectionKind::BSS:
Name = (getBSSSection() ? getBSSSection() : getDataSection());
break;
case SectionKind::ROData:
case SectionKind::RODataMergeStr:
case SectionKind::RODataMergeConst:
// FIXME: Temporary
Name = getDataSection();
break;
case SectionKind::ThreadData:
Name = (getTLSDataSection() ? getTLSDataSection() : getDataSection());
break;
case SectionKind::ThreadBSS:
Name = (getTLSBSSSection() ? getTLSBSSSection() : getDataSection());
default:
assert(0 && "Unsuported section kind for global");
}
}
} else
assert(0 && "Unsupported global");
}
Name += PrintSectionFlags(flags);
return Name;
}

View File

@ -45,6 +45,8 @@ namespace llvm {
explicit X86ELFTargetAsmInfo(const X86TargetMachine &TM);
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
bool Global) const;
virtual std::string SelectSectionForGlobal(const GlobalValue *GV) const;
virtual std::string PrintSectionFlags(unsigned flags) const;
};