aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/COFFTargetAsmInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/COFFTargetAsmInfo.cpp')
-rw-r--r--lib/Target/COFFTargetAsmInfo.cpp51
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();
+}