fix a significant difference between llvm and gcc on ELF systems:
authorChris Lattner <sabre@nondot.org>
Tue, 19 Jan 2010 03:06:01 +0000 (03:06 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 19 Jan 2010 03:06:01 +0000 (03:06 +0000)
GCC would put weak zero initialized mutable data in the .bss section,
we would put it into a crasy '.gnu.linkonce.b.test,"aw",@nobits'
section.  Fixing this will allow simplifications next up.

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

lib/Target/TargetLoweringObjectFile.cpp
lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp
test/CodeGen/X86/global-sections.ll

index cd0558025b8ea39004a679f19747d34097b42137..7b00b332f63679a147402a6c6b15f2e068027f45 100644 (file)
@@ -565,7 +565,6 @@ static const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
   if (Kind.isThreadData())           return ".gnu.linkonce.td.";
   if (Kind.isThreadBSS())            return ".gnu.linkonce.tb.";
 
-  if (Kind.isBSS())                  return ".gnu.linkonce.b.";
   if (Kind.isDataNoRel())            return ".gnu.linkonce.d.";
   if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local.";
   if (Kind.isDataRel())              return ".gnu.linkonce.d.rel.";
@@ -581,7 +580,7 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
 
   // 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() && !Kind.isCommon()) {
+  if (GV->isWeakForLinker() && !Kind.isCommon() && !Kind.isBSS()) {
     const char *Prefix = getSectionPrefixForUniqueGlobal(Kind);
     SmallString<128> Name;
     Name.append(Prefix, Prefix+strlen(Prefix));
@@ -634,6 +633,9 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
   if (Kind.isThreadData())           return TLSDataSection;
   if (Kind.isThreadBSS())            return TLSBSSSection;
 
+  // Note: we claim that common symbols are put in BSSSection, but they are
+  // really emitted with the magic .comm directive, which creates a symbol table
+  // entry but not a section.
   if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
 
   if (Kind.isDataNoRel())            return DataSection;
index 383bc3180b35632a92633738763edf39a566c81c..82577cfa194ec80301f43fdd50604acb7afb1689 100644 (file)
@@ -718,7 +718,7 @@ void X86AsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
       // Don't put things that should go in the cstring section into "comm".
       !TheSection->getKind().isMergeableCString() &&
       !GVar->isThreadLocal() &&
-      (GVar->hasLocalLinkage() || GVar->isWeakForLinker())) {
+      (GVar->hasLocalLinkage())) {
     if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
 
     if (const char *LComm = MAI->getLCOMMDirective()) {
index 405adca6cd8721a21d1b56ac4d8fdc5f103b9b6a..b6caa4f27f7a9cf91051020026935ee32a6517ce 100644 (file)
 ; LINUX:G9
 
 
+@G10 = weak global [100 x i32] zeroinitializer, align 32 ; <[100 x i32]*> [#uses=0]
+
+
+; DARWIN:      .section        __DATA,__datacoal_nt,coalesced
+; DARWIN: .globl _G10
+; DARWIN:      .weak_definition _G10
+; DARWIN:      .align  5
+; DARWIN: _G10:
+; DARWIN:      .space  400
+
+; LINUX:       .bss
+; LINUX:       .weak   G10
+; LINUX:       .align  32
+; LINUX: G10:
+; LINUX:       .zero   400