diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2008-07-09 13:22:46 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2008-07-09 13:22:46 +0000 |
commit | 265c5259ab98b5a4f9f25fbe9f2e470d0933cb38 (patch) | |
tree | f496abd2342944b0ea9b211ecabd178c383dd33f /lib | |
parent | 6d8294209287eb36951f8445abe1129e015cd312 (diff) | |
download | external_llvm-265c5259ab98b5a4f9f25fbe9f2e470d0933cb38.zip external_llvm-265c5259ab98b5a4f9f25fbe9f2e470d0933cb38.tar.gz external_llvm-265c5259ab98b5a4f9f25fbe9f2e470d0933cb38.tar.bz2 |
Provide general hook for section name calculation
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53304 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/TargetAsmInfo.cpp | 39 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetAsmInfo.cpp | 12 |
2 files changed, 41 insertions, 10 deletions
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 6967ebe..0b810c7 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -257,12 +257,43 @@ TargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV, std::string TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const { + unsigned flags = SectionFlagsForGlobal(GV, GV->getSection().c_str()); + + std::string Name; + + // 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 + Name = SelectSectionForGlobal(GV); + } + + Name += PrintSectionFlags(flags); + return Name; +} + +// Lame default implementation. Calculate the section name for global. +std::string +TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { SectionKind::Kind kind = SectionKindForGlobal(GV); - if (kind == SectionKind::Text) - return getTextSection(); - else if (kind == SectionKind::BSS && getBSSSection()) - return getBSSSection(); + if (GV->hasLinkOnceLinkage() || + GV->hasWeakLinkage() || + GV->hasCommonLinkage()) + return UniqueSectionForGlobal(GV, kind); + else { + if (kind == SectionKind::Text) + return getTextSection(); + else if (kind == SectionKind::BSS && getBSSSection()) + return getBSSSection(); + else if (getReadOnlySection() && + (kind == SectionKind::ROData || + kind == SectionKind::RODataMergeConst || + kind == SectionKind::RODataMergeStr)) + return getReadOnlySection(); + } return getDataSection(); } diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index b0c6f1c..96e452e 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -494,7 +494,7 @@ std::string X86TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const { case Function::InternalLinkage: case Function::DLLExportLinkage: case Function::ExternalLinkage: - Name = TextSection; + Name = getTextSection(); break; case Function::WeakLinkage: case Function::LinkOnceLinkage: @@ -509,22 +509,22 @@ std::string X86TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const { else { switch (kind) { case SectionKind::Data: - Name = DataSection; + Name = getDataSection(); break; case SectionKind::BSS: - Name = (BSSSection ? BSSSection : DataSection); + Name = (getBSSSection() ? getBSSSection() : getDataSection()); break; case SectionKind::ROData: case SectionKind::RODataMergeStr: case SectionKind::RODataMergeConst: // FIXME: Temporary - Name = DataSection; + Name = getDataSection(); break; case SectionKind::ThreadData: - Name = (TLSDataSection ? TLSDataSection : DataSection); + Name = (getTLSDataSection() ? getTLSDataSection() : getDataSection()); break; case SectionKind::ThreadBSS: - Name = (TLSBSSSection ? TLSBSSSection : DataSection); + Name = (getTLSBSSSection() ? getTLSBSSSection() : getDataSection()); default: assert(0 && "Unsuported section kind for global"); } |