diff options
Diffstat (limited to 'lib/Target/COFFTargetAsmInfo.cpp')
-rw-r--r-- | lib/Target/COFFTargetAsmInfo.cpp | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/lib/Target/COFFTargetAsmInfo.cpp b/lib/Target/COFFTargetAsmInfo.cpp index 5d080b425f..cd7356d551 100644 --- a/lib/Target/COFFTargetAsmInfo.cpp +++ b/lib/Target/COFFTargetAsmInfo.cpp @@ -53,15 +53,6 @@ COFFTargetAsmInfo::COFFTargetAsmInfo(const TargetMachine &TM) DwarfMacroInfoSection = "\t.section\t.debug_macinfo,\"dr\""; } -const char *COFFTargetAsmInfo:: -getSectionPrefixForUniqueGlobal(SectionKind Kind) const { - if (Kind.isText()) - return ".text$linkonce"; - if (Kind.isWriteable()) - return ".data$linkonce"; - return ".rdata$linkonce"; -} - void COFFTargetAsmInfo::getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const { // FIXME: Inefficient. @@ -74,3 +65,45 @@ void COFFTargetAsmInfo::getSectionFlagsAsString(SectionKind Kind, Str.append(Res.begin(), Res.end()); } + +//===----------------------------------------------------------------------===// +// Move to AsmPrinter (mangler access). +//===----------------------------------------------------------------------===// + +#include "llvm/GlobalVariable.h" + +static const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { + if (Kind.isText()) + return ".text$linkonce"; + if (Kind.isWriteable()) + return ".data$linkonce"; + return ".rdata$linkonce"; +} + +const Section * +COFFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV, + SectionKind Kind) const { + assert(!Kind.isThreadLocal() && "Doesn't support TLS"); + + // 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 (Kind.isWeak()) { + const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); + // FIXME: Use mangler interface (PR4584). + std::string Name = Prefix+GV->getNameStr(); + return getOrCreateSection(Name.c_str(), false, Kind.getKind()); + } + + if (Kind.isText()) + return getTextSection(); + + if (Kind.isBSS()) + if (const Section *S = getBSSSection_()) + return S; + + if (Kind.isReadOnly()) + if (const Section *S = getReadOnlySection()) + return S; + + return getDataSection(); +} |