From 5ea326a23b0cf74e3f1f96b8846b43437a00cd2a Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 3 Nov 2003 17:35:00 +0000 Subject: [PATCH] Work around a bug in GCC where it can't handle common variables marked weak. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9679 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/CBackend/CBackend.cpp | 9 ++++++++- lib/Target/CBackend/Writer.cpp | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index 0fd30460214..258c2878787 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -693,7 +693,14 @@ void CWriter::printModule(Module *M) { Out << " __attribute__((common))"; else if (I->hasWeakLinkage()) Out << " __attribute__((weak))"; - if (!I->getInitializer()->isNullValue()) { + + // If the initializer is not null, emit the initializer. If it is null, + // we try to avoid emitting large amounts of zeros. The problem with + // this, however, occurs when the variable has weak linkage. In this + // case, the assembler will complain about the variable being both weak + // and common, so we disable this optimization. + if (!I->getInitializer()->isNullValue() || + I->hasWeakLinkage()) { Out << " = " ; writeOperand(I->getInitializer()); } diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index 0fd30460214..258c2878787 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -693,7 +693,14 @@ void CWriter::printModule(Module *M) { Out << " __attribute__((common))"; else if (I->hasWeakLinkage()) Out << " __attribute__((weak))"; - if (!I->getInitializer()->isNullValue()) { + + // If the initializer is not null, emit the initializer. If it is null, + // we try to avoid emitting large amounts of zeros. The problem with + // this, however, occurs when the variable has weak linkage. In this + // case, the assembler will complain about the variable being both weak + // and common, so we disable this optimization. + if (!I->getInitializer()->isNullValue() || + I->hasWeakLinkage()) { Out << " = " ; writeOperand(I->getInitializer()); }