OSDN Git Service

hoist section name uniquing logic up to the top-level SectionForGlobal
authorChris Lattner <sabre@nondot.org>
Fri, 24 Jul 2009 05:10:25 +0000 (05:10 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 24 Jul 2009 05:10:25 +0000 (05:10 +0000)
implementation, eliminating a dupe.

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

lib/Target/DarwinTargetAsmInfo.cpp
lib/Target/ELFTargetAsmInfo.cpp
lib/Target/TargetAsmInfo.cpp

index 0ea9bd1..c25040c 100644 (file)
@@ -134,16 +134,15 @@ DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
   case SectionKind::Text:
     if (isWeak)
       return TextCoalSection;
-    else
-      return TextSection;
+    return TextSection;
   case SectionKind::Data:
   case SectionKind::ThreadData:
   case SectionKind::BSS:
   case SectionKind::ThreadBSS:
     if (cast<GlobalVariable>(GV)->isConstant())
-      return (isWeak ? ConstDataCoalSection : ConstDataSection);
-    else
-      return (isWeak ? DataCoalSection : DataSection);
+      return isWeak ? ConstDataCoalSection : ConstDataSection;
+    return isWeak ? DataCoalSection : DataSection;
+
   case SectionKind::ROData:
     return (isWeak ? ConstDataCoalSection :
             (isNonStatic ? ConstDataSection : getReadOnlySection()));
index 1785d15..662fc11 100644 (file)
@@ -77,15 +77,6 @@ const Section*
 ELFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
   SectionKind::Kind Kind = SectionKindForGlobal(GV);
 
-  if (GV->isWeakForLinker()) {
-    if (const char *Prefix = getSectionPrefixForUniqueGlobal(Kind)) {
-      // FIXME: Use mangler interface (PR4584).
-      std::string Name = Prefix+GV->getName();
-      unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str());
-      return getNamedSection(Name.c_str(), Flags);
-    }
-  }
-  
   if (const Function *F = dyn_cast<Function>(GV)) {
     switch (F->getLinkage()) {
     default: llvm_unreachable("Unknown linkage type!");
index d13a322..e193dd4 100644 (file)
@@ -295,6 +295,18 @@ const Section *TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
     return getNamedSection(GV->getSection().c_str(), Flags);
   }
 
+  // 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 (GV->isWeakForLinker()) {
+    if (const char *Prefix =
+          getSectionPrefixForUniqueGlobal(SectionKindForGlobal(GV))) {
+      // FIXME: Use mangler interface (PR4584).
+      std::string Name = Prefix+GV->getName();
+      unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str());
+      return getNamedSection(Name.c_str(), Flags);
+    }
+  }
+  
   // Use default section depending on the 'type' of global
   return SelectSectionForGlobal(GV);
 }
@@ -304,19 +316,16 @@ const Section*
 TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
   SectionKind::Kind Kind = SectionKindForGlobal(GV);
 
-  if (GV->isWeakForLinker()) {
-    // FIXME: Use mangler interface (PR4584).
-    std::string Name = getSectionPrefixForUniqueGlobal(Kind)+GV->getName();
-    unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str());
-    return getNamedSection(Name.c_str(), Flags);
-  } else {
-    if (Kind == SectionKind::Text)
-      return getTextSection();
-    else if (isBSS(Kind) && getBSSSection_())
-      return getBSSSection_();
-    else if (getReadOnlySection() && SectionKind::isReadOnly(Kind))
-      return getReadOnlySection();
-  }
+  if (Kind == SectionKind::Text)
+    return getTextSection();
+  
+  if (isBSS(Kind))
+    if (const Section *S = getBSSSection_())
+      return S;
+  
+  if (SectionKind::isReadOnly(Kind))
+    if (const Section *S = getReadOnlySection())
+      return S;
 
   return getDataSection();
 }
@@ -352,7 +361,6 @@ TargetAsmInfo::getSectionPrefixForUniqueGlobal(SectionKind::Kind Kind) const {
   case SectionKind::ThreadData:       return ".gnu.linkonce.td.";
   case SectionKind::ThreadBSS:        return ".gnu.linkonce.tb.";
   }
-  return NULL;
 }
 
 const Section *TargetAsmInfo::getNamedSection(const char *Name, unsigned Flags,