From: Anton Korobeynikov Date: Wed, 9 Jul 2008 13:22:46 +0000 (+0000) Subject: Provide general hook for section name calculation X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=265c5259ab98b5a4f9f25fbe9f2e470d0933cb38;p=oota-llvm.git Provide general hook for section name calculation git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53304 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index 4e7d23d5001..6194e163cd5 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -481,11 +481,14 @@ namespace llvm { /// global with all necessary flags and marks. virtual std::string SectionForGlobal(const GlobalValue *GV) const; + // Helper methods for SectionForGlobal virtual std::string UniqueSectionForGlobal(const GlobalValue* GV, SectionKind::Kind kind) const; virtual std::string PrintSectionFlags(unsigned flags) const { return ""; } + virtual std::string SelectSectionForGlobal(const GlobalValue *GV) const; + // Accessors. // const char *getTextSection() const { diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 6967ebe4860..0b810c77cfc 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 b0c6f1cb533..96e452ee284 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"); }