enhance codegen to put 16-bit character strings into the
authorChris Lattner <sabre@nondot.org>
Tue, 4 Aug 2009 16:27:13 +0000 (16:27 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 4 Aug 2009 16:27:13 +0000 (16:27 +0000)
__TEXT,__ustring section on darwin.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78068 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetLoweringObjectFile.h
lib/Target/TargetLoweringObjectFile.cpp
test/CodeGen/X86/global-sections.ll

index 3715a6585ac7715521bebeb14cac72673dde1634..10ce48158ae7892f292a8555225df2b68f565594 100644 (file)
@@ -224,6 +224,7 @@ public:
   
 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
   const MCSection *CStringSection;
+  const MCSection *UStringSection;
   const MCSection *TextCoalSection;
   const MCSection *ConstTextCoalSection;
   const MCSection *ConstDataCoalSection;
index 730d32f5429b9748f3389353b2a3a9204d64b457..7489883998d84c32db595c3a2d7444fd95a6512e 100644 (file)
@@ -593,11 +593,13 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
                                    SectionKind::getDataRel());
   
   CStringSection = getOrCreateSection("\t.cstring", true,
-                               SectionKind::getMergeable1ByteCString());
+                                      SectionKind::getMergeable1ByteCString());
+  UStringSection = getOrCreateSection("__TEXT,__ustring", false,
+                                      SectionKind::getMergeable2ByteCString());
   FourByteConstantSection = getOrCreateSection("\t.literal4\n", true,
-                                SectionKind::getMergeableConst4());
+                                             SectionKind::getMergeableConst4());
   EightByteConstantSection = getOrCreateSection("\t.literal8\n", true,
-                                SectionKind::getMergeableConst8());
+                                             SectionKind::getMergeableConst8());
   
   // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
   // to using it in -static mode.
@@ -704,18 +706,15 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
   }
   
   // FIXME: Alignment check should be handled by section classifier.
-  if (Kind.isMergeable1ByteCString()) {
-    Constant *C = cast<GlobalVariable>(GV)->getInitializer();
-    const Type *Ty = cast<ArrayType>(C->getType())->getElementType();
-    const TargetData &TD = *TM.getTargetData();
-    unsigned Size = TD.getTypeAllocSize(Ty);
-    if (Size) {
-      unsigned Align = TD.getPreferredAlignment(cast<GlobalVariable>(GV));
-      if (Align <= 32)
+  if (Kind.isMergeable1ByteCString() ||
+      Kind.isMergeable2ByteCString()) {
+    if (TM.getTargetData()->getPreferredAlignment(
+                                              cast<GlobalVariable>(GV)) < 32) {
+      if (Kind.isMergeable1ByteCString())
         return CStringSection;
+      assert(Kind.isMergeable2ByteCString());
+      return UStringSection;
     }
-    
-    return ReadOnlySection;
   }
   
   if (Kind.isMergeableConst()) {
@@ -725,11 +724,10 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
       return EightByteConstantSection;
     if (Kind.isMergeableConst16() && SixteenByteConstantSection)
       return SixteenByteConstantSection;
-    return ReadOnlySection;  // .const
   }
-  
-  // FIXME: ROData -> const in -static mode that is relocatable but they happen
-  // by the static linker.  Why not mergeable?
+
+  // Otherwise, if it is readonly, but not something we can specially optimize,
+  // just drop it in .const.
   if (Kind.isReadOnly())
     return ReadOnlySection;
 
index 4f4c4bcf1c763b53e36d1a91937c3039a515c1d8..7d39a0209524af37fbd5d638f59f79c3f72e380c 100644 (file)
 
 @G8 = constant [4 x i16] [ i16 1, i16 2, i16 3, i16 0 ]
 
-; DARWIN:      .const
+; DARWIN:      .section        __TEXT,__ustring
 ; DARWIN:      .globl _G8
 ; DARWIN: _G8:
 
 
 @G9 = constant [4 x i32] [ i32 1, i32 2, i32 3, i32 0 ]
 
-; ARWIN:       .const   [[ already in const section]]
+; DARWIN:      .const
 ; DARWIN:      .globl _G9
 ; DARWIN: _G9: