[llvm-commits] [llvm] r76993 - in /llvm/trunk: include/llvm/Target/ELFTargetAsmInfo.h include/llvm/Target/TargetAsmInfo.h lib/Target/DarwinTargetAsmInfo.cpp lib/Target/ELFTargetAsmInfo.cpp lib/Target/TargetAsmInfo.cpp lib/Target/X86/X86TargetAsmInfo.cpp

Chris Lattner sabre at nondot.org
Fri Jul 24 12:15:47 PDT 2009


Author: lattner
Date: Fri Jul 24 14:15:47 2009
New Revision: 76993

URL: http://llvm.org/viewvc/llvm-project?rev=76993&view=rev
Log:
make SectionKindForGlobal target independent, and therefore non-virtual.
It's classifications now include elf-specific discriminators.  Targets
that don't have these features (like darwin and pecoff) simply treat
data.rel like data, etc.


Modified:
    llvm/trunk/include/llvm/Target/ELFTargetAsmInfo.h
    llvm/trunk/include/llvm/Target/TargetAsmInfo.h
    llvm/trunk/lib/Target/DarwinTargetAsmInfo.cpp
    llvm/trunk/lib/Target/ELFTargetAsmInfo.cpp
    llvm/trunk/lib/Target/TargetAsmInfo.cpp
    llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp

Modified: llvm/trunk/include/llvm/Target/ELFTargetAsmInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/ELFTargetAsmInfo.h?rev=76993&r1=76992&r2=76993&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Target/ELFTargetAsmInfo.h (original)
+++ llvm/trunk/include/llvm/Target/ELFTargetAsmInfo.h Fri Jul 24 14:15:47 2009
@@ -37,7 +37,6 @@
     /// ".tbss" gets the TLS bit set etc.
     virtual unsigned getFlagsForNamedSection(const char *Section) const;
     
-    SectionKind::Kind SectionKindForGlobal(const GlobalValue *GV) const;
     virtual const Section* SelectSectionForGlobal(const GlobalValue *GV,
                                                   SectionKind::Kind Kind) const;
     virtual std::string printSectionFlags(unsigned flags) const;

Modified: llvm/trunk/include/llvm/Target/TargetAsmInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetAsmInfo.h?rev=76993&r1=76992&r2=76993&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Target/TargetAsmInfo.h (original)
+++ llvm/trunk/include/llvm/Target/TargetAsmInfo.h Fri Jul 24 14:15:47 2009
@@ -611,8 +611,7 @@
     /// SectionKindForGlobal - This hook allows the target to select proper
     /// section kind used for global emission.
 // FIXME: Eliminate this.
-    virtual SectionKind::Kind
-    SectionKindForGlobal(const GlobalValue *GV) const;
+    SectionKind::Kind SectionKindForGlobal(const GlobalValue *GV) const;
 
 
     const std::string &getSectionFlags(unsigned Flags) const;

Modified: llvm/trunk/lib/Target/DarwinTargetAsmInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/DarwinTargetAsmInfo.cpp?rev=76993&r1=76992&r2=76993&view=diff

==============================================================================
--- llvm/trunk/lib/Target/DarwinTargetAsmInfo.cpp (original)
+++ llvm/trunk/lib/Target/DarwinTargetAsmInfo.cpp Fri Jul 24 14:15:47 2009
@@ -131,19 +131,24 @@
   bool isNonStatic = TM.getRelocationModel() != Reloc::Static;
 
   switch (Kind) {
+  case SectionKind::ThreadData:
+  case SectionKind::ThreadBSS:
+    llvm_unreachable("Darwin doesn't support TLS");
   case SectionKind::Text:
     if (isWeak)
       return TextCoalSection;
     return TextSection;
   case SectionKind::Data:
-  case SectionKind::ThreadData:
+  case SectionKind::DataRelLocal:
+  case SectionKind::DataRel:
   case SectionKind::BSS:
-  case SectionKind::ThreadBSS:
     if (cast<GlobalVariable>(GV)->isConstant())
       return isWeak ? ConstDataCoalSection : ConstDataSection;
     return isWeak ? DataCoalSection : DataSection;
 
   case SectionKind::ROData:
+  case SectionKind::DataRelRO:
+  case SectionKind::DataRelROLocal:
     return (isWeak ? ConstDataCoalSection :
             (isNonStatic ? ConstDataSection : getReadOnlySection()));
   case SectionKind::RODataMergeStr:

Modified: llvm/trunk/lib/Target/ELFTargetAsmInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ELFTargetAsmInfo.cpp?rev=76993&r1=76992&r2=76993&view=diff

==============================================================================
--- llvm/trunk/lib/Target/ELFTargetAsmInfo.cpp (original)
+++ llvm/trunk/lib/Target/ELFTargetAsmInfo.cpp Fri Jul 24 14:15:47 2009
@@ -45,33 +45,6 @@
                                           SectionFlags::Writeable);
 }
 
-SectionKind::Kind
-ELFTargetAsmInfo::SectionKindForGlobal(const GlobalValue *GV) const {
-  SectionKind::Kind Kind = TargetAsmInfo::SectionKindForGlobal(GV);
-
-  if (Kind != SectionKind::Data)
-    return Kind;
-
-  // Decide, whether we need data.rel stuff
-  const GlobalVariable* GVar = dyn_cast<GlobalVariable>(GV);
-  if (GVar->hasInitializer() && TM.getRelocationModel() != Reloc::Static) {
-    Constant *C = GVar->getInitializer();
-    bool isConstant = GVar->isConstant();
-    
-    // By default - all relocations in PIC mode would force symbol to be
-    // placed in r/w section.
-    switch (C->getRelocationInfo()) {
-    default: break;
-    case Constant::LocalRelocation:
-      return isConstant ? SectionKind::DataRelROLocal :
-                          SectionKind::DataRelLocal;
-    case Constant::GlobalRelocations:
-      return isConstant ? SectionKind::DataRelRO : SectionKind::DataRel;
-    }
-  }
-
-  return Kind;
-}
 
 const Section*
 ELFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV,
@@ -91,6 +64,8 @@
   const GlobalVariable *GVar = cast<GlobalVariable>(GV);
   switch (Kind) {
   default: llvm_unreachable("Unsuported section kind for global");
+  case SectionKind::BSS:
+    return getBSSSection_();
   case SectionKind::Data:
   case SectionKind::DataRel:
     return DataRelSection;
@@ -100,8 +75,6 @@
     return DataRelROSection;
   case SectionKind::DataRelROLocal:
     return DataRelROLocalSection;
-  case SectionKind::BSS:
-    return getBSSSection_();
   case SectionKind::ROData:
     return getReadOnlySection();
   case SectionKind::RODataMergeStr:

Modified: llvm/trunk/lib/Target/TargetAsmInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetAsmInfo.cpp?rev=76993&r1=76992&r2=76993&view=diff

==============================================================================
--- llvm/trunk/lib/Target/TargetAsmInfo.cpp (original)
+++ llvm/trunk/lib/Target/TargetAsmInfo.cpp Fri Jul 24 14:15:47 2009
@@ -232,33 +232,72 @@
     return SectionKind::Text;
 
   bool isThreadLocal = GVar->isThreadLocal();
-  assert(GVar && "Invalid global value for section selection");
 
-  if (isSuitableForBSS(GVar)) {
-    // Variable can be easily put to BSS section.
+  // Variable can be easily put to BSS section.
+  if (isSuitableForBSS(GVar))
     return isThreadLocal ? SectionKind::ThreadBSS : SectionKind::BSS;
-  } else if (GVar->isConstant() && !isThreadLocal) {
-    // Now we know, that variable has initializer and it is constant. We need to
-    // check its initializer to decide, which section to output it into. Also
-    // note, there is no thread-local r/o section.
-    Constant *C = GVar->getInitializer();
-    if (C->getRelocationInfo() != 0) {
-      // Decide whether it is still possible to put symbol into r/o section.
-      if (TM.getRelocationModel() != Reloc::Static)
-        return SectionKind::Data;
-      else
-        return SectionKind::ROData;
-    } else {
-      // Check, if initializer is a null-terminated string
+
+  // If this is thread-local, put it in the general "thread_data" section.
+  if (isThreadLocal)
+    return SectionKind::ThreadData;
+  
+  Constant *C = GVar->getInitializer();
+  
+  // If the global is marked constant, we can put it into a mergable section,
+  // a mergable string section, or general .data if it contains relocations.
+  if (GVar->isConstant()) {
+    // If the initializer for the global contains something that requires a
+    // relocation, then we may have to drop this into a wriable data section
+    // even though it is marked const.
+    switch (C->getRelocationInfo()) {
+    default: llvm_unreachable("unknown relocation info kind");
+    case Constant::NoRelocation:
+      // If initializer is a null-terminated string, put it in a "cstring"
+      // section if the target has it.
       if (isConstantString(C))
         return SectionKind::RODataMergeStr;
-      else
-        return SectionKind::RODataMergeConst;
+      
+      // Otherwise, just drop it into a mergable constant section.
+      return SectionKind::RODataMergeConst;
+      
+    case Constant::LocalRelocation:
+      // In static relocation model, the linker will resolve all addresses, so
+      // the relocation entries will actually be constants by the time the app
+      // starts up.
+      if (TM.getRelocationModel() == Reloc::Static)
+        return SectionKind::ROData;
+              
+      // Otherwise, the dynamic linker needs to fix it up, put it in the
+      // writable data.rel.local section.
+      return SectionKind::DataRelROLocal;
+              
+    case Constant::GlobalRelocations:
+      // In static relocation model, the linker will resolve all addresses, so
+      // the relocation entries will actually be constants by the time the app
+      // starts up.
+      if (TM.getRelocationModel() == Reloc::Static)
+        return SectionKind::ROData;
+      
+      // Otherwise, the dynamic linker needs to fix it up, put it in the
+      // writable data.rel section.
+      return SectionKind::DataRelRO;
     }
   }
 
-  // Variable either is not constant or thread-local - output to data section.
-  return isThreadLocal ? SectionKind::ThreadData : SectionKind::Data;
+  // Okay, this isn't a constant.  If the initializer for the global is going
+  // to require a runtime relocation by the dynamic linker, put it into a more
+  // specific section to improve startup time of the app.  This coalesces these
+  // globals together onto fewer pages, improving the locality of the dynamic
+  // linker.
+  if (TM.getRelocationModel() == Reloc::Static)
+    return SectionKind::Data;
+
+  switch (C->getRelocationInfo()) {
+  default: llvm_unreachable("unknown relocation info kind");
+  case Constant::NoRelocation:      return SectionKind::Data;
+  case Constant::LocalRelocation:   return SectionKind::DataRelLocal;
+  case Constant::GlobalRelocations: return SectionKind::DataRel;
+  }
 }
 
 

Modified: llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp?rev=76993&r1=76992&r2=76993&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86TargetAsmInfo.cpp Fri Jul 24 14:15:47 2009
@@ -271,10 +271,14 @@
   default: llvm_unreachable("Unknown section kind");
   case SectionKind::Text:             return ".text$linkonce";
   case SectionKind::Data:
+  case SectionKind::DataRelLocal:
+  case SectionKind::DataRel:
   case SectionKind::BSS:
   case SectionKind::ThreadData:
   case SectionKind::ThreadBSS:        return ".data$linkonce";
   case SectionKind::ROData:
+  case SectionKind::DataRelRO:
+  case SectionKind::DataRelROLocal:
   case SectionKind::RODataMergeConst:
   case SectionKind::RODataMergeStr:   return ".rdata$linkonce";
   }





More information about the llvm-commits mailing list