Add CommonLinkage; currently tentative definitions
authorDale Johannesen <dalej@apple.com>
Wed, 14 May 2008 20:12:51 +0000 (20:12 +0000)
committerDale Johannesen <dalej@apple.com>
Wed, 14 May 2008 20:12:51 +0000 (20:12 +0000)
are represented as "weak", but there are subtle differences
in some cases on Darwin, so we need both.  The intent
is that "common" will behave identically to "weak" unless
somebody changes their target to do something else.
No functional change as yet.

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

22 files changed:
include/llvm/GlobalValue.h
lib/AsmParser/LLLexer.cpp
lib/Bitcode/Reader/BitcodeReader.cpp
lib/Bitcode/Writer/BitcodeWriter.cpp
lib/CodeGen/ELFWriter.cpp
lib/CodeGen/MachOWriter.cpp
lib/ExecutionEngine/ExecutionEngine.cpp
lib/Linker/LinkModules.cpp
lib/Target/Alpha/AlphaAsmPrinter.cpp
lib/Target/CBackend/CBackend.cpp
lib/Target/CellSPU/SPUAsmPrinter.cpp
lib/Target/CppBackend/CPPBackend.cpp
lib/Target/IA64/IA64AsmPrinter.cpp
lib/Target/Mips/MipsAsmPrinter.cpp
lib/Target/PIC16/PIC16AsmPrinter.cpp
lib/Target/PowerPC/PPCAsmPrinter.cpp
lib/Target/Sparc/SparcAsmPrinter.cpp
lib/Target/X86/X86ATTAsmPrinter.cpp
lib/Target/X86/X86AsmPrinter.cpp
lib/Target/X86/X86IntelAsmPrinter.cpp
lib/Target/X86/X86Subtarget.cpp
lib/VMCore/AsmWriter.cpp

index 808471d0a4c37ed44847d5327eb38288628bf9ce..60b2d1c534276b0a40923bb5f854f5ae673b7376 100644 (file)
@@ -38,7 +38,8 @@ public:
     DLLImportLinkage,   ///< Function to be imported from DLL
     DLLExportLinkage,   ///< Function to be accessible from DLL
     ExternalWeakLinkage,///< ExternalWeak linkage description
-    GhostLinkage        ///< Stand-in functions for streaming fns from BC files    
+    GhostLinkage,       ///< Stand-in functions for streaming fns from BC files
+    CommonLinkage       ///< Tentative definitions
   };
 
   /// @brief An enumeration for the kinds of visibility of global values.
@@ -100,6 +101,7 @@ public:
   bool hasExternalLinkage()   const { return Linkage == ExternalLinkage; }
   bool hasLinkOnceLinkage()   const { return Linkage == LinkOnceLinkage; }
   bool hasWeakLinkage()       const { return Linkage == WeakLinkage; }
+  bool hasCommonLinkage()     const { return Linkage == CommonLinkage; }
   bool hasAppendingLinkage()  const { return Linkage == AppendingLinkage; }
   bool hasInternalLinkage()   const { return Linkage == InternalLinkage; }
   bool hasDLLImportLinkage()  const { return Linkage == DLLImportLinkage; }
index 6787ba184f72413c40cc15c0c6cb291912bee2c3..37032eb2fb946ebb471998778d561511f240a273 100644 (file)
@@ -451,6 +451,7 @@ int LLLexer::LexIdentifier() {
   KEYWORD("appending", APPENDING);
   KEYWORD("dllimport", DLLIMPORT);
   KEYWORD("dllexport", DLLEXPORT);
+  KEYWORD("common", COMMON);
   KEYWORD("hidden", HIDDEN);
   KEYWORD("protected", PROTECTED);
   KEYWORD("extern_weak", EXTERN_WEAK);
index 40982666f006bfd6db628d2cf5ee47697a208951..2d421b4b9e83aee56ab64da4430d12b340fd3e82 100644 (file)
@@ -66,6 +66,7 @@ static GlobalValue::LinkageTypes GetDecodedLinkage(unsigned Val) {
   case 5: return GlobalValue::DLLImportLinkage;
   case 6: return GlobalValue::DLLExportLinkage;
   case 7: return GlobalValue::ExternalWeakLinkage;
+  case 8: return GlobalValue::CommonLinkage;
   }
 }
 
index 40e70115d96a3cfb1f90d4781646c85628a4d2f7..8e9a395ab6f0b8182d24bb301e404645854ab96f 100644 (file)
@@ -270,6 +270,7 @@ static unsigned getEncodedLinkage(const GlobalValue *GV) {
   case GlobalValue::DLLImportLinkage:    return 5;
   case GlobalValue::DLLExportLinkage:    return 6;
   case GlobalValue::ExternalWeakLinkage: return 7;
+  case GlobalValue::CommonLinkage:       return 8;
   }
 }
 
index 63fee3a8d74dc871d177c5faf610431c85b50599..27f23f45cc0677af6a4466367e17eee8cb30e127 100644 (file)
@@ -282,7 +282,8 @@ void ELFWriter::EmitGlobal(GlobalVariable *GV) {
     // If this global is part of the common block, add it now.  Variables are
     // part of the common block if they are zero initialized and allowed to be
     // merged with other symbols.
-    if (GV->hasLinkOnceLinkage() || GV->hasWeakLinkage()) {
+    if (GV->hasLinkOnceLinkage() || GV->hasWeakLinkage() ||
+        GV->hasCommonLinkage()) {
       ELFSym CommonSym(GV);
       // Value for common symbols is the alignment required.
       CommonSym.Value = Align;
@@ -313,7 +314,7 @@ void ELFWriter::EmitGlobal(GlobalVariable *GV) {
     BSSSym.SetType(ELFSym::STT_OBJECT);
 
     switch (GV->getLinkage()) {
-    default:  // weak/linkonce handled above
+    default:  // weak/linkonce/common handled above
       assert(0 && "Unexpected linkage type!");
     case GlobalValue::AppendingLinkage:  // FIXME: This should be improved!
     case GlobalValue::ExternalLinkage:
index 2726f706d7f04cea6bdfdf11f3c0f9849056716b..c2b42ec48a7ba40094f05254c09fb720e7e1e957 100644 (file)
@@ -403,7 +403,8 @@ void MachOWriter::EmitGlobal(GlobalVariable *GV) {
     // If this global is part of the common block, add it now.  Variables are
     // part of the common block if they are zero initialized and allowed to be
     // merged with other symbols.
-    if (NoInit || GV->hasLinkOnceLinkage() || GV->hasWeakLinkage()) {
+    if (NoInit || GV->hasLinkOnceLinkage() || GV->hasWeakLinkage() ||
+        GV->hasCommonLinkage()) {
       MachOSym ExtOrCommonSym(GV, Mang->getValueName(GV), MachOSym::NO_SECT,TM);
       // For undefined (N_UNDF) external (N_EXT) types, n_value is the size in
       // bytes of the symbol.
@@ -951,6 +952,7 @@ MachOSym::MachOSym(const GlobalValue *gv, std::string name, uint8_t sect,
     break;
   case GlobalValue::WeakLinkage:
   case GlobalValue::LinkOnceLinkage:
+  case GlobalValue::CommonLinkage:
     assert(!isa<Function>(gv) && "Unexpected linkage type for Function!");
   case GlobalValue::ExternalLinkage:
     GVName = TAI->getGlobalPrefix() + name;
index a56951d2c5269ab13131331e10f05ef27a8972d9..8bd3b1127a9504e57f3b8eb3d0f758b038b6c541 100644 (file)
@@ -884,7 +884,7 @@ void ExecutionEngine::emitGlobals() {
           continue;
         
         // Otherwise, we know it's linkonce/weak, replace it if this is a strong
-        // symbol.
+        // symbol.  FIXME is this right for common?
         if (GV->hasExternalLinkage() || GVEntry->hasExternalWeakLinkage())
           GVEntry = GV;
       }
index 3db5b0927c305b46f6a2314e5b86d7958567bf82..cf4ceaac504002cdd0c203d790d444f9e7a7f792 100644 (file)
@@ -410,10 +410,12 @@ static bool GetLinkageResult(GlobalValue *Dest, const GlobalValue *Src,
             "': can only link appending global with another appending global!");
     LinkFromSrc = true; // Special cased.
     LT = Src->getLinkage();
-  } else if (Src->hasWeakLinkage() || Src->hasLinkOnceLinkage()) {
-    // At this point we know that Dest has LinkOnce, External*, Weak, or
-    // DLL* linkage.
-    if ((Dest->hasLinkOnceLinkage() && Src->hasWeakLinkage()) ||
+  } else if (Src->hasWeakLinkage() || Src->hasLinkOnceLinkage() ||
+             Src->hasCommonLinkage()) {
+    // At this point we know that Dest has LinkOnce, External*, Weak, Common,
+    // or DLL* linkage.
+    if ((Dest->hasLinkOnceLinkage() && 
+          (Src->hasWeakLinkage() || Src->hasCommonLinkage())) ||
         Dest->hasExternalWeakLinkage()) {
       LinkFromSrc = true;
       LT = Src->getLinkage();
@@ -421,7 +423,8 @@ static bool GetLinkageResult(GlobalValue *Dest, const GlobalValue *Src,
       LinkFromSrc = false;
       LT = Dest->getLinkage();
     }
-  } else if (Dest->hasWeakLinkage() || Dest->hasLinkOnceLinkage()) {
+  } else if (Dest->hasWeakLinkage() || Dest->hasLinkOnceLinkage() ||
+             Dest->hasCommonLinkage()) {
     // At this point we know that Src has External* or DLL* linkage.
     if (Src->hasExternalWeakLinkage()) {
       LinkFromSrc = false;
@@ -792,10 +795,12 @@ static bool LinkGlobalInits(Module *Dest, const Module *Src,
           if (DGV->getInitializer() != SInit)
             return Error(Err, "Global Variable Collision on '" + SGV->getName() +
                          "': global variables have different initializers");
-        } else if (DGV->hasLinkOnceLinkage() || DGV->hasWeakLinkage()) {
+        } else if (DGV->hasLinkOnceLinkage() || DGV->hasWeakLinkage() ||
+                   DGV->hasCommonLinkage()) {
           // Nothing is required, mapped values will take the new global
           // automatically.
-        } else if (SGV->hasLinkOnceLinkage() || SGV->hasWeakLinkage()) {
+        } else if (SGV->hasLinkOnceLinkage() || SGV->hasWeakLinkage() ||
+                   SGV->hasCommonLinkage()) {
           // Nothing is required, mapped values will take the new global
           // automatically.
         } else if (DGV->hasAppendingLinkage()) {
@@ -916,16 +921,19 @@ static bool LinkFunctionProtos(Module *Dest, const Module *Src,
       DF->setLinkage(SF->getLinkage());
       // Visibility of prototype is overridden by vis of definition.
       DF->setVisibility(SF->getVisibility());
-    } else if (SF->hasWeakLinkage() || SF->hasLinkOnceLinkage()) {
+    } else if (SF->hasWeakLinkage() || SF->hasLinkOnceLinkage() ||
+               SF->hasCommonLinkage()) {
       // At this point we know that DF has LinkOnce, Weak, or External* linkage.
       ValueMap[SF] = DF;
 
       // Linkonce+Weak = Weak
       // *+External Weak = *
-      if ((DF->hasLinkOnceLinkage() && SF->hasWeakLinkage()) ||
+      if ((DF->hasLinkOnceLinkage() && 
+              (SF->hasWeakLinkage() || SF->hasCommonLinkage())) ||
           DF->hasExternalWeakLinkage())
         DF->setLinkage(SF->getLinkage());
-    } else if (DF->hasWeakLinkage() || DF->hasLinkOnceLinkage()) {
+    } else if (DF->hasWeakLinkage() || DF->hasLinkOnceLinkage() ||
+               DF->hasCommonLinkage()) {
       // At this point we know that SF has LinkOnce or External* linkage.
       ValueMap[SF] = DF;
       if (!SF->hasLinkOnceLinkage() && !SF->hasExternalWeakLinkage())
index 42e4b7843cf29c7b7473d40314d3680276fa6ad2..2c289718f047aabb5c6a8d1121ea2f1f3d8c6429 100644 (file)
@@ -225,6 +225,7 @@ bool AlphaAsmPrinter::doFinalization(Module &M) {
     switch (I->getLinkage()) {
     case GlobalValue::LinkOnceLinkage:
     case GlobalValue::WeakLinkage:
+    case GlobalValue::CommonLinkage:
       O << TAI->getWeakRefDirective() << name << '\n';
       break;
     case GlobalValue::AppendingLinkage:
index dcc920a64c235a71952a784d501790f450c17ee9..f52322bef2c081c0e835eda890f88a34299a4ca4 100644 (file)
@@ -1604,7 +1604,8 @@ bool CWriter::doInitialization(Module &M) {
     for (Module::global_iterator I = M.global_begin(), E = M.global_end();
          I != E; ++I) {
 
-      if (I->hasExternalLinkage() || I->hasExternalWeakLinkage())
+      if (I->hasExternalLinkage() || I->hasExternalWeakLinkage() || 
+          I->hasCommonLinkage())
         Out << "extern ";
       else if (I->hasDLLImportLinkage())
         Out << "__declspec(dllimport) ";
@@ -1678,6 +1679,8 @@ bool CWriter::doInitialization(Module &M) {
 
         if (I->hasLinkOnceLinkage())
           Out << " __attribute__((common))";
+        else if (I->hasCommonLinkage())     // FIXME is this right?
+          Out << " __ATTRIBUTE_WEAK__";
         else if (I->hasWeakLinkage())
           Out << " __ATTRIBUTE_WEAK__";
         else if (I->hasExternalWeakLinkage())
@@ -1715,6 +1718,8 @@ bool CWriter::doInitialization(Module &M) {
           Out << " __attribute__((common))";
         else if (I->hasWeakLinkage())
           Out << " __ATTRIBUTE_WEAK__";
+        else if (I->hasCommonLinkage())
+          Out << " __ATTRIBUTE_WEAK__";
 
         if (I->hasHiddenVisibility())
           Out << " __HIDDEN__";
@@ -1724,6 +1729,7 @@ bool CWriter::doInitialization(Module &M) {
         // 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.
+        // FIXME common linkage should avoid this problem.
         if (!I->getInitializer()->isNullValue()) {
           Out << " = " ;
           writeOperand(I->getInitializer());
index f627896f6b8999b615c77aafe47b9f38ccfe9c19..4e4324bbefecdcd8e4c057fdcd988ce17339e1cb 100644 (file)
@@ -340,7 +340,7 @@ void SPUAsmPrinter::printOp(const MachineOperand &MO) {
     // stubs
     if (TM.getRelocationModel() != Reloc::Static) {
       if (((GV->isDeclaration() || GV->hasWeakLinkage() ||
-            GV->hasLinkOnceLinkage()))) {
+            GV->hasLinkOnceLinkage() || GV->hasCommonLinkage()))) {
         GVStubs.insert(Name);
         O << "L" << Name << "$non_lazy_ptr";
         return;
@@ -510,7 +510,7 @@ bool LinuxAsmPrinter::doFinalization(Module &M) {
 
     if (C->isNullValue() && /* FIXME: Verify correct */
         (I->hasInternalLinkage() || I->hasWeakLinkage() ||
-         I->hasLinkOnceLinkage() ||
+         I->hasLinkOnceLinkage() || I->hasCommonLinkage() ||
          (I->hasExternalLinkage() && !I->hasSection()))) {
       if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
       if (I->hasExternalLinkage()) {
@@ -537,6 +537,7 @@ bool LinuxAsmPrinter::doFinalization(Module &M) {
       switch (I->getLinkage()) {
       case GlobalValue::LinkOnceLinkage:
       case GlobalValue::WeakLinkage:
+      case GlobalValue::CommonLinkage:
         O << "\t.global " << name << '\n'
           << "\t.weak_definition " << name << '\n';
         SwitchToDataSection(".section __DATA,__datacoal_nt,coalesced", I);
index 87240731b57f1b37a1f930d5317a7e60ba93ba62..dc9a11e457a0495075c94920f7cd14eaa199dcc4 100644 (file)
@@ -301,6 +301,8 @@ namespace {
       Out << "GlobalValue::ExternalWeakLinkage"; break;
     case GlobalValue::GhostLinkage:
       Out << "GlobalValue::GhostLinkage"; break;
+    case GlobalValue::CommonLinkage:
+      Out << "GlobalValue::CommonLinkage"; break;
     }
   }
 
index 829730da2410f7f24fe568ab03cd41754b92ffff..037687cbe960c7718c82a0ecf9da0fd61a653fb7 100644 (file)
@@ -275,6 +275,7 @@ bool IA64AsmPrinter::doFinalization(Module &M) {
 
       if (C->isNullValue() &&
           (I->hasLinkOnceLinkage() || I->hasInternalLinkage() ||
+           I->hasCommonLinkage() ||
            I->hasWeakLinkage() /* FIXME: Verify correct */)) {
         SwitchToDataSection(".data", I);
         if (I->hasInternalLinkage()) {
@@ -289,6 +290,7 @@ bool IA64AsmPrinter::doFinalization(Module &M) {
       } else {
         switch (I->getLinkage()) {
           case GlobalValue::LinkOnceLinkage:
+          case GlobalValue::CommonLinkage:
           case GlobalValue::WeakLinkage:   // FIXME: Verify correct for weak.
                                            // Nonnull linkonce -> weak
             O << "\t.weak " << name << "\n";
index 6c0c908ae7b06f0bdaaed06f014e2064c72262c0..6ae6104cb2960dff635e0faa673354e82740c240 100644 (file)
@@ -461,7 +461,8 @@ doFinalization(Module &M)
 
       // Is this correct ?
       if (C->isNullValue() && (I->hasLinkOnceLinkage() || 
-          I->hasInternalLinkage() || I->hasWeakLinkage())) 
+          I->hasInternalLinkage() || I->hasWeakLinkage() ||
+          I->hasCommonLinkage()))
       {
         if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
 
@@ -487,7 +488,8 @@ doFinalization(Module &M)
         switch (I->getLinkage()) 
         {
           case GlobalValue::LinkOnceLinkage:
-          case GlobalValue::WeakLinkage:   
+          case GlobalValue::CommonLinkage:
+          case GlobalValue::WeakLinkage:
             // FIXME: Verify correct for weak.
             // Nonnull linkonce -> weak
             O << "\t.weak " << name << "\n";
index f211face12c4182801327e0fc25f8661fa4b44b2..15711b5d01f091f6c5bcbd7dafb1ad09f576a674 100644 (file)
@@ -414,7 +414,7 @@ bool PIC16AsmPrinter::doFinalization(Module &M)
 
       if (!I->hasSection() &&
           (I->hasInternalLinkage() || I->hasWeakLinkage() ||
-           I->hasLinkOnceLinkage())) {
+           I->hasLinkOnceLinkage() || I->hasCommonLinkage())) {
         if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
         if (!NoZerosInBSS && TAI->getBSSSection())
           SwitchToDataSection(M.getModuleIdentifier().c_str(), I);
index 4cc9d2a9bd58a85ca9bf2c305bfc2fe53a60a5b7..96e1ae8a04a9a47ac1ea30e99fa397fbb81e67b6 100644 (file)
@@ -185,7 +185,7 @@ namespace {
         if (MO.getType() == MachineOperand::MO_GlobalAddress) {
           GlobalValue *GV = MO.getGlobal();
           if (((GV->isDeclaration() || GV->hasWeakLinkage() ||
-                GV->hasLinkOnceLinkage()))) {
+                GV->hasLinkOnceLinkage() || GV->hasCommonLinkage()))) {
             // Dynamically-resolved functions need a stub for the function.
             std::string Name = Mang->getValueName(GV);
             FnStubs.insert(Name);
@@ -390,7 +390,7 @@ void PPCAsmPrinter::printOp(const MachineOperand &MO) {
     // External or weakly linked global variables need non-lazily-resolved stubs
     if (TM.getRelocationModel() != Reloc::Static) {
       if (((GV->isDeclaration() || GV->hasWeakLinkage() ||
-            GV->hasLinkOnceLinkage()))) {
+            GV->hasLinkOnceLinkage() || GV->hasCommonLinkage()))) {
         GVStubs.insert(Name);
         O << "L" << Name << "$non_lazy_ptr";
         return;
@@ -671,8 +671,8 @@ bool LinuxAsmPrinter::doFinalization(Module &M) {
     unsigned Align = TD->getPreferredAlignmentLog(I);
 
     if (C->isNullValue() && /* FIXME: Verify correct */
-        !I->hasSection() &&
-        (I->hasInternalLinkage() || I->hasWeakLinkage() ||
+        !I->hasSection() && (I->hasCommonLinkage() ||
+         I->hasInternalLinkage() || I->hasWeakLinkage() ||
          I->hasLinkOnceLinkage() || I->hasExternalLinkage())) {
       if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
       if (I->hasExternalLinkage()) {
@@ -696,6 +696,7 @@ bool LinuxAsmPrinter::doFinalization(Module &M) {
       switch (I->getLinkage()) {
       case GlobalValue::LinkOnceLinkage:
       case GlobalValue::WeakLinkage:
+      case GlobalValue::CommonLinkage:
         O << "\t.global " << name << '\n'
           << "\t.type " << name << ", @object\n"
           << "\t.weak " << name << '\n';
@@ -936,8 +937,8 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
     unsigned Align = TD->getPreferredAlignmentLog(I);
 
     if (C->isNullValue() && /* FIXME: Verify correct */
-        !I->hasSection() &&
-        (I->hasInternalLinkage() || I->hasWeakLinkage() ||
+        !I->hasSection() && (I->hasCommonLinkage() ||
+         I->hasInternalLinkage() || I->hasWeakLinkage() ||
          I->hasLinkOnceLinkage() || I->hasExternalLinkage())) {
       if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
       if (I->hasExternalLinkage()) {
@@ -961,6 +962,7 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
       switch (I->getLinkage()) {
       case GlobalValue::LinkOnceLinkage:
       case GlobalValue::WeakLinkage:
+      case GlobalValue::CommonLinkage:
         O << "\t.globl " << name << '\n'
           << "\t.weak_definition " << name << '\n';
         SwitchToDataSection("\t.section __DATA,__datacoal_nt,coalesced", I);
index 01bd0929bdf9eb58c8c0d217d942a7a981d0df93..2011ab9803887fad45709e13b97bdb6331aa33aa 100644 (file)
@@ -231,8 +231,8 @@ bool SparcAsmPrinter::doFinalization(Module &M) {
       unsigned Size = TD->getABITypeSize(C->getType());
       unsigned Align = TD->getPreferredAlignment(I);
 
-      if (C->isNullValue() &&
-          (I->hasLinkOnceLinkage() || I->hasInternalLinkage() ||
+      if (C->isNullValue() && (I->hasCommonLinkage() ||
+           I->hasLinkOnceLinkage() || I->hasInternalLinkage() ||
            I->hasWeakLinkage() /* FIXME: Verify correct */)) {
         SwitchToDataSection(".data", I);
         if (I->hasInternalLinkage())
@@ -243,6 +243,7 @@ bool SparcAsmPrinter::doFinalization(Module &M) {
         O << "\n";
       } else {
         switch (I->getLinkage()) {
+        case GlobalValue::CommonLinkage:
         case GlobalValue::LinkOnceLinkage:
         case GlobalValue::WeakLinkage:   // FIXME: Verify correct for weak.
           // Nonnull linkonce -> weak
index 6909da1b2457b85bab66ee5c0b6fb4fe280d4197..4659deb1467d041bae3e61943f1ceb1596b7bb93 100644 (file)
@@ -309,7 +309,8 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
       // non-lazily-resolved stubs
       if (GV->isDeclaration() ||
           GV->hasWeakLinkage() ||
-          GV->hasLinkOnceLinkage()) {
+          GV->hasLinkOnceLinkage() ||
+          GV->hasCommonLinkage()) {
         // Dynamically-resolved functions need a stub for the function.
         if (isCallOp && isa<Function>(GV)) {
           FnStubs.insert(Name);
index e1bc65fc5d64e365e18c1eed37dce5eef4089488..3898a9ee4656f00049f96794f2009ab1fba89caa 100644 (file)
@@ -200,7 +200,7 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
       
       if (!I->isThreadLocal() &&
           (I->hasInternalLinkage() || I->hasWeakLinkage() ||
-           I->hasLinkOnceLinkage())) {
+           I->hasLinkOnceLinkage() || I->hasCommonLinkage())) {
         if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
         if (!NoZerosInBSS && TAI->getBSSSection())
           SwitchToDataSection(TAI->getBSSSection(), I);
@@ -235,6 +235,7 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
     }
 
     switch (I->getLinkage()) {
+    case GlobalValue::CommonLinkage:
     case GlobalValue::LinkOnceLinkage:
     case GlobalValue::WeakLinkage:
       if (Subtarget->isTargetDarwin()) {
index ddd90cd40a87beea53785e727e1cace1c7a3d8eb..a1031bd8eafb991225c8395903bd36658db39438 100644 (file)
@@ -373,6 +373,7 @@ bool X86IntelAsmPrinter::doFinalization(Module &M) {
     bool bCustomSegment = false;
 
     switch (I->getLinkage()) {
+    case GlobalValue::CommonLinkage:
     case GlobalValue::LinkOnceLinkage:
     case GlobalValue::WeakLinkage:
       SwitchToDataSection("");
index 98d80c84a0a6ba8bcaf1804f9de5dbd63ae1de84..23ceb9ba966dbd15cb748e583898d48bfdc19d3b 100644 (file)
@@ -41,6 +41,7 @@ bool X86Subtarget::GVRequiresExtraLoad(const GlobalValue* GV,
     if (isTargetDarwin()) {
       return (!isDirectCall &&
               (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() ||
+               GV->hasCommonLinkage() ||
                (GV->isDeclaration() && !GV->hasNotBeenReadFromBitcode())));
     } else if (isTargetELF()) {
       // Extra load is needed for all non-statics.
index 06bfc50d9a33b14318c3c69d5874573c12993ca2..3d39553e727b055aa1f34e1b2db453e958980e72 100644 (file)
@@ -930,6 +930,7 @@ void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
   } else {
     switch (GV->getLinkage()) {
     case GlobalValue::InternalLinkage:     Out << "internal "; break;
+    case GlobalValue::CommonLinkage:       Out << "common "; break;
     case GlobalValue::LinkOnceLinkage:     Out << "linkonce "; break;
     case GlobalValue::WeakLinkage:         Out << "weak "; break;
     case GlobalValue::AppendingLinkage:    Out << "appending "; break;
@@ -1049,6 +1050,7 @@ void AssemblyWriter::printFunction(const Function *F) {
   case GlobalValue::InternalLinkage:     Out << "internal "; break;
   case GlobalValue::LinkOnceLinkage:     Out << "linkonce "; break;
   case GlobalValue::WeakLinkage:         Out << "weak "; break;
+  case GlobalValue::CommonLinkage:       Out << "common "; break;
   case GlobalValue::AppendingLinkage:    Out << "appending "; break;
   case GlobalValue::DLLImportLinkage:    Out << "dllimport "; break;
   case GlobalValue::DLLExportLinkage:    Out << "dllexport "; break;