Another bunch of hacks for named sections support
authorAnton Korobeynikov <asl@math.spbu.ru>
Wed, 9 Jul 2008 13:26:52 +0000 (13:26 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Wed, 9 Jul 2008 13:26:52 +0000 (13:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53315 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetAsmInfo.h
lib/Target/X86/X86TargetAsmInfo.cpp

index 0c946dafa1695c83e998de2559a6ea38b6f24d02..bcd65612ab45d8aa01b3340ab1793778bbc38c10 100644 (file)
@@ -53,8 +53,9 @@ namespace llvm {
       TLS        = 1 << 5,    ///< Section contains thread-local data
       Debug      = 1 << 6,    ///< Section contains debug data
       Linkonce   = 1 << 7,    ///< Section is linkonce
-      Named      = 1 << 8,    ///< Section is named
+      TypeFlags  = 0xFF,
       // Some gap for future flags
+      Named      = 1 << 23,    ///< Section is named
       EntitySize = 0xFF << 24 ///< Entity size for mergeable sections
     };
 
index a53f4a1183283ba157920318a141f2b561987e33..0fdc0eefbae3bf86286661814c7478f9f5487f77 100644 (file)
@@ -323,8 +323,10 @@ X86DarwinTargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV,
       Type = C->getType();
 
     unsigned Size = TD->getABITypeSize(Type);
-    if (Size > 16) {
-      // Too big for mergeable
+    if (Size > 16 ||
+        !(Flags & SectionFlags::Strings ||
+          (Size == 4 || Size == 8 || Size == 16))) {
+      // Not suitable for mergeable
       Size = 0;
       Flags &= ~SectionFlags::Mergeable;
     }
@@ -516,8 +518,12 @@ X86ELFTargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV,
       Type = C->getType();
 
     unsigned Size = TD->getABITypeSize(Type);
-    if (Size > 16) {
-      // Too big for mergeable
+    // FIXME: size check here ugly, and will hopefully have gone, when we will
+    // have sane interface for attaching flags to sections.
+    if (Size > 16 ||
+        !(Flags & SectionFlags::Strings ||
+          (Size == 4 || Size == 8 || Size == 16))) {
+      // Not suitable for mergeable
       Size = 0;
       Flags &= ~SectionFlags::Mergeable;
     }
@@ -529,9 +535,11 @@ X86ELFTargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV,
 
   // Mark section as named, when needed (so, we we will need .section directive
   // to switch into it).
-  if (Flags & (SectionFlags::Mergeable |
-               SectionFlags::TLS |
-               SectionFlags::Linkonce))
+  unsigned TypeFlags = Flags & SectionFlags::TypeFlags;
+  if (!TypeFlags /* Read-only section */ ||
+      (TypeFlags & (SectionFlags::Mergeable |
+                    SectionFlags::TLS |
+                    SectionFlags::Linkonce)))
     Flags |= SectionFlags::Named;
 
   return Flags;
@@ -668,9 +676,11 @@ X86COFFTargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV,
 
   // Mark section as named, when needed (so, we we will need .section directive
   // to switch into it).
-  if (Flags & (SectionFlags::Mergeable ||
-               SectionFlags::TLS ||
-               SectionFlags::Linkonce))
+  unsigned TypeFlags = Flags & SectionFlags::TypeFlags;
+  if (!TypeFlags /* Read-only section */ ||
+      (TypeFlags & (SectionFlags::Mergeable |
+                    SectionFlags::TLS |
+                    SectionFlags::Linkonce)))
     Flags |= SectionFlags::Named;
 
   return Flags;