fix a significant difference between llvm and gcc on ELF systems:

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.

llvm-svn: 93844
This commit is contained in:
Chris Lattner 2010-01-19 03:06:01 +00:00
parent 5b585f8b1a
commit a986aa33eb
3 changed files with 20 additions and 3 deletions

View File

@ -565,7 +565,6 @@ static const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
if (Kind.isThreadData()) return ".gnu.linkonce.td."; if (Kind.isThreadData()) return ".gnu.linkonce.td.";
if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; if (Kind.isThreadBSS()) return ".gnu.linkonce.tb.";
if (Kind.isBSS()) return ".gnu.linkonce.b.";
if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; if (Kind.isDataNoRel()) return ".gnu.linkonce.d.";
if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local.";
if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 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 // 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. // 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); const char *Prefix = getSectionPrefixForUniqueGlobal(Kind);
SmallString<128> Name; SmallString<128> Name;
Name.append(Prefix, Prefix+strlen(Prefix)); Name.append(Prefix, Prefix+strlen(Prefix));
@ -634,6 +633,9 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
if (Kind.isThreadData()) return TLSDataSection; if (Kind.isThreadData()) return TLSDataSection;
if (Kind.isThreadBSS()) return TLSBSSSection; 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.isBSS() || Kind.isCommon()) return BSSSection;
if (Kind.isDataNoRel()) return DataSection; if (Kind.isDataNoRel()) return DataSection;

View File

@ -718,7 +718,7 @@ void X86AsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
// Don't put things that should go in the cstring section into "comm". // Don't put things that should go in the cstring section into "comm".
!TheSection->getKind().isMergeableCString() && !TheSection->getKind().isMergeableCString() &&
!GVar->isThreadLocal() && !GVar->isThreadLocal() &&
(GVar->hasLocalLinkage() || GVar->isWeakForLinker())) { (GVar->hasLocalLinkage())) {
if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it. if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
if (const char *LComm = MAI->getLCOMMDirective()) { if (const char *LComm = MAI->getLCOMMDirective()) {

View File

@ -119,4 +119,19 @@
; LINUX:G9 ; 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