[cfe-commits] r117452 - in /cfe/trunk/lib/CodeGen: CGDeclCXX.cpp CodeGenModule.cpp CodeGenModule.h

Fariborz Jahanian fjahanian at apple.com
Wed Oct 27 09:21:54 PDT 2010


Author: fjahanian
Date: Wed Oct 27 11:21:54 2010
New Revision: 117452

URL: http://llvm.org/viewvc/llvm-project?rev=117452&view=rev
Log:
Do the guarding of instantiated static data members
on if its linkage is weak. Currently this is the
case but may change in the future. (part of radar 
8562966).

Modified:
    cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
    cfe/trunk/lib/CodeGen/CodeGenModule.h

Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=117452&r1=117451&r2=117452&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Wed Oct 27 11:21:54 2010
@@ -257,11 +257,16 @@
       D->getInstantiatedFromStaticDataMember() && D->getInit()){
     llvm::GlobalVariable *GV = dyn_cast<llvm::GlobalVariable>(DeclPtr);
     assert(GV && "GenerateCXXGlobalVarDeclInitFunc - GV is null");
-    GV->setConstant(false);
-    EmitCXXStaticLocalInit(*D, GV);
+    llvm::GlobalValue::LinkageTypes Linkage = 
+      CGM.GetLLVMLinkageVarDefinition(D, GV);
+    if (Linkage == llvm::GlobalVariable::WeakAnyLinkage) {
+      GV->setConstant(false);
+      EmitCXXStaticLocalInit(*D, GV);
+      FinishFunction();
+      return;
+    }
   }
-  else
-    EmitCXXGlobalVarDeclInit(*D, DeclPtr);
+  EmitCXXGlobalVarDeclInit(*D, DeclPtr);
 
   FinishFunction();
 }

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=117452&r1=117451&r2=117452&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Wed Oct 27 11:21:54 2010
@@ -1154,42 +1154,51 @@
     GV->setConstant(true);
 
   GV->setAlignment(getContext().getDeclAlign(D).getQuantity());
-
+  
   // Set the llvm linkage type as appropriate.
+  llvm::GlobalValue::LinkageTypes Linkage = 
+    GetLLVMLinkageVarDefinition(D, GV);
+  GV->setLinkage(Linkage);
+  if (Linkage == llvm::GlobalVariable::CommonLinkage)
+    // common vars aren't constant even if declared const.
+    GV->setConstant(false);
+
+  SetCommonAttributes(D, GV);
+
+  // Emit global variable debug information.
+  if (CGDebugInfo *DI = getDebugInfo()) {
+    DI->setLocation(D->getLocation());
+    DI->EmitGlobalVariable(GV, D);
+  }
+}
+
+llvm::GlobalValue::LinkageTypes
+CodeGenModule::GetLLVMLinkageVarDefinition(const VarDecl *D,
+                                           llvm::GlobalVariable *GV) {
   GVALinkage Linkage = getContext().GetGVALinkageForVariable(D);
   if (Linkage == GVA_Internal)
-    GV->setLinkage(llvm::Function::InternalLinkage);
+    return llvm::Function::InternalLinkage;
   else if (D->hasAttr<DLLImportAttr>())
-    GV->setLinkage(llvm::Function::DLLImportLinkage);
+    return llvm::Function::DLLImportLinkage;
   else if (D->hasAttr<DLLExportAttr>())
-    GV->setLinkage(llvm::Function::DLLExportLinkage);
+    return llvm::Function::DLLExportLinkage;
   else if (D->hasAttr<WeakAttr>()) {
     if (GV->isConstant())
-      GV->setLinkage(llvm::GlobalVariable::WeakODRLinkage);
+      return llvm::GlobalVariable::WeakODRLinkage;
     else
-      GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);
+      return llvm::GlobalVariable::WeakAnyLinkage;
   } else if (Linkage == GVA_TemplateInstantiation ||
              Linkage == GVA_ExplicitTemplateInstantiation)
     // FIXME: It seems like we can provide more specific linkage here
     // (LinkOnceODR, WeakODR).
-    GV->setLinkage(llvm::GlobalVariable::WeakAnyLinkage);   
+    return llvm::GlobalVariable::WeakAnyLinkage;
   else if (!getLangOptions().CPlusPlus && !CodeGenOpts.NoCommon &&
            !D->hasExternalStorage() && !D->getInit() &&
            !D->getAttr<SectionAttr>() && !D->isThreadSpecified()) {
     // Thread local vars aren't considered common linkage.
-    GV->setLinkage(llvm::GlobalVariable::CommonLinkage);
-    // common vars aren't constant even if declared const.
-    GV->setConstant(false);
-  } else
-    GV->setLinkage(llvm::GlobalVariable::ExternalLinkage);
-
-  SetCommonAttributes(D, GV);
-
-  // Emit global variable debug information.
-  if (CGDebugInfo *DI = getDebugInfo()) {
-    DI->setLocation(D->getLocation());
-    DI->EmitGlobalVariable(GV, D);
+    return llvm::GlobalVariable::CommonLinkage;
   }
+  return llvm::GlobalVariable::ExternalLinkage;
 }
 
 /// ReplaceUsesOfNonProtoTypeWithRealFunction - This function is called when we

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=117452&r1=117451&r2=117452&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.h Wed Oct 27 11:21:54 2010
@@ -511,7 +511,13 @@
   /// GetTargetTypeStoreSize - Return the store size, in character units, of
   /// the given LLVM type.
   CharUnits GetTargetTypeStoreSize(const llvm::Type *Ty) const;
-
+  
+  /// GetLLVMLinkageVarDefinition - Returns LLVM linkage for a global 
+  /// variable.
+  llvm::GlobalValue::LinkageTypes 
+  GetLLVMLinkageVarDefinition(const VarDecl *D,
+                              llvm::GlobalVariable *GV);
+  
   std::vector<const CXXRecordDecl*> DeferredVTables;
 
 private:
@@ -552,7 +558,7 @@
   void EmitAliasDefinition(GlobalDecl GD);
   void EmitObjCPropertyImplementations(const ObjCImplementationDecl *D);
   void EmitObjCIvarInitializations(ObjCImplementationDecl *D);
-
+  
   // C++ related functions.
 
   bool TryEmitDefinitionAsAlias(GlobalDecl Alias, GlobalDecl Target);





More information about the cfe-commits mailing list