Only emit movw on ARMv6T2+
[oota-llvm.git] / lib / Target / XCore / XCoreTargetObjectFile.cpp
index 61eb2b51f3ebf744437490e3e4a8c09cabece476..86d0de654e4404c19b1090a3ee8746c44ddc56f6 100644 (file)
@@ -41,10 +41,16 @@ void XCoreTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM){
                       ELF::SHF_ALLOC | ELF::SHF_WRITE |
                       ELF::XCORE_SHF_DP_SECTION,
                       SectionKind::getDataRel());
-  // This is the wrong place to decide if const data should be placed
-  // in the .cp or .dp section.
-  // Ideally we should set up DataRelROSection to use the '.dp.'' and use this
-  // for const data, unless the front end explicitly states a '.cp.'' section.
+  DataRelROSection =
+    Ctx.getELFSection(".dp.rodata", ELF::SHT_PROGBITS,
+                      ELF::SHF_ALLOC | ELF::SHF_WRITE |
+                      ELF::XCORE_SHF_DP_SECTION,
+                      SectionKind::getReadOnlyWithRel());
+  DataRelROSectionLarge =
+    Ctx.getELFSection(".dp.rodata.large", ELF::SHT_PROGBITS,
+                      ELF::SHF_ALLOC | ELF::SHF_WRITE |
+                      ELF::XCORE_SHF_DP_SECTION,
+                      SectionKind::getReadOnlyWithRel());
   ReadOnlySection =
     Ctx.getELFSection(".cp.rodata", ELF::SHT_PROGBITS,
                       ELF::SHF_ALLOC |
@@ -80,19 +86,13 @@ void XCoreTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM){
   // StaticDtorSection - see MObjectFileInfo.cpp
  }
 
-static SectionKind getXCoreKindForNamedSection(StringRef Name, SectionKind K) {
-  if (Name.startswith(".cp."))
-    return SectionKind::getReadOnly();
-  return K;
-}
-
 static unsigned getXCoreSectionType(SectionKind K) {
   if (K.isBSS())
     return ELF::SHT_NOBITS;
   return ELF::SHT_PROGBITS;
 }
 
-static unsigned getXCoreSectionFlags(SectionKind K) {
+static unsigned getXCoreSectionFlags(SectionKind K, bool IsCPRel) {
   unsigned Flags = 0;
 
   if (!K.isMetadata())
@@ -100,7 +100,7 @@ static unsigned getXCoreSectionFlags(SectionKind K) {
 
   if (K.isText())
     Flags |= ELF::SHF_EXECINSTR;
-  else if (K.isReadOnly())
+  else if (IsCPRel)
     Flags |= ELF::XCORE_SHF_CP_SECTION;
   else
     Flags |= ELF::XCORE_SHF_DP_SECTION;
@@ -118,46 +118,56 @@ static unsigned getXCoreSectionFlags(SectionKind K) {
   return Flags;
 }
 
-const MCSection *XCoreTargetObjectFile::
-getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
-                         Mangler *Mang, const TargetMachine &TM) const {
+const MCSection *
+XCoreTargetObjectFile::getExplicitSectionGlobal(const GlobalValue *GV,
+                                                SectionKind Kind, Mangler &Mang,
+                                                const TargetMachine &TM) const {
   StringRef SectionName = GV->getSection();
   // Infer section flags from the section name if we can.
-  Kind = getXCoreKindForNamedSection(SectionName, Kind);
+  bool IsCPRel = SectionName.startswith(".cp.");
+  if (IsCPRel && !Kind.isReadOnly())
+    report_fatal_error("Using .cp. section for writeable object.");
   return getContext().getELFSection(SectionName, getXCoreSectionType(Kind),
-                                    getXCoreSectionFlags(Kind), Kind);
+                                    getXCoreSectionFlags(Kind, IsCPRel), Kind);
 }
 
 const MCSection *XCoreTargetObjectFile::
-SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang,
+SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler &Mang,
                        const TargetMachine &TM) const{
-  if (Kind.isText())                      return TextSection;
-  if (Kind.isMergeable1ByteCString())     return CStringSection;
-  if (Kind.isMergeableConst4())           return MergeableConst4Section;
-  if (Kind.isMergeableConst8())           return MergeableConst8Section;
-  if (Kind.isMergeableConst16())          return MergeableConst16Section;
 
+  bool UseCPRel = GV->isLocalLinkage(GV->getLinkage());
+
+  if (Kind.isText())                    return TextSection;
+  if (UseCPRel) {
+    if (Kind.isMergeable1ByteCString()) return CStringSection;
+    if (Kind.isMergeableConst4())       return MergeableConst4Section;
+    if (Kind.isMergeableConst8())       return MergeableConst8Section;
+    if (Kind.isMergeableConst16())      return MergeableConst16Section;
+  }
   Type *ObjType = GV->getType()->getPointerElementType();
-  if (TM.getCodeModel() == CodeModel::Small ||
-      !ObjType->isSized() ||
-      TM.getDataLayout()->getTypeAllocSize(ObjType) < CodeModelLargeSize) {
-    if (Kind.isReadOnly())                return ReadOnlySection;
-    if (Kind.isBSS())                     return BSSSection;
-    if (Kind.isDataRel())                 return DataSection;
-    if (Kind.isReadOnlyWithRel())         return ReadOnlySection;
+  if (TM.getCodeModel() == CodeModel::Small || !ObjType->isSized() ||
+      TM.getSubtargetImpl()->getDataLayout()->getTypeAllocSize(ObjType) <
+          CodeModelLargeSize) {
+    if (Kind.isReadOnly())              return UseCPRel? ReadOnlySection
+                                                       : DataRelROSection;
+    if (Kind.isBSS() || Kind.isCommon())return BSSSection;
+    if (Kind.isDataRel())               return DataSection;
+    if (Kind.isReadOnlyWithRel())       return DataRelROSection;
   } else {
-    if (Kind.isReadOnly())                return ReadOnlySectionLarge;
-    if (Kind.isBSS())                     return BSSSectionLarge;
-    if (Kind.isDataRel())                 return DataSectionLarge;
-    if (Kind.isReadOnlyWithRel())         return ReadOnlySectionLarge;
+    if (Kind.isReadOnly())              return UseCPRel? ReadOnlySectionLarge
+                                                       : DataRelROSectionLarge;
+    if (Kind.isBSS() || Kind.isCommon())return BSSSectionLarge;
+    if (Kind.isDataRel())               return DataSectionLarge;
+    if (Kind.isReadOnlyWithRel())       return DataRelROSectionLarge;
   }
 
   assert((Kind.isThreadLocal() || Kind.isCommon()) && "Unknown section kind");
   report_fatal_error("Target does not support TLS or Common sections");
 }
 
-const MCSection *XCoreTargetObjectFile::
-getSectionForConstant(SectionKind Kind) const {
+const MCSection *
+XCoreTargetObjectFile::getSectionForConstant(SectionKind Kind,
+                                             const Constant *C) const {
   if (Kind.isMergeableConst4())           return MergeableConst4Section;
   if (Kind.isMergeableConst8())           return MergeableConst8Section;
   if (Kind.isMergeableConst16())          return MergeableConst16Section;